Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/freebsd32/freebsd32_misc.c
Show First 20 Lines • Show All 958 Lines • ▼ Show 20 Lines | freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) | ||||
union { | union { | ||||
struct ptrace_io_desc piod; | struct ptrace_io_desc piod; | ||||
struct ptrace_lwpinfo pl; | struct ptrace_lwpinfo pl; | ||||
struct ptrace_vm_entry pve; | struct ptrace_vm_entry pve; | ||||
struct ptrace_coredump pc; | struct ptrace_coredump pc; | ||||
struct dbreg32 dbreg; | struct dbreg32 dbreg; | ||||
struct fpreg32 fpreg; | struct fpreg32 fpreg; | ||||
struct reg32 reg; | struct reg32 reg; | ||||
struct iovec vec; | |||||
jhb: Probably this should be the 'struct iovec' and the 'struct iovec32' should be down in the 'r32'… | |||||
register_t args[nitems(td->td_sa.args)]; | register_t args[nitems(td->td_sa.args)]; | ||||
struct ptrace_sc_ret psr; | struct ptrace_sc_ret psr; | ||||
int ptevents; | int ptevents; | ||||
} r; | } r; | ||||
union { | union { | ||||
struct ptrace_io_desc32 piod; | struct ptrace_io_desc32 piod; | ||||
struct ptrace_lwpinfo32 pl; | struct ptrace_lwpinfo32 pl; | ||||
struct ptrace_vm_entry32 pve; | struct ptrace_vm_entry32 pve; | ||||
struct ptrace_coredump32 pc; | struct ptrace_coredump32 pc; | ||||
uint32_t args[nitems(td->td_sa.args)]; | uint32_t args[nitems(td->td_sa.args)]; | ||||
struct ptrace_sc_ret32 psr; | struct ptrace_sc_ret32 psr; | ||||
struct iovec32 vec; | |||||
} r32; | } r32; | ||||
void *addr; | void *addr; | ||||
int data, error = 0, i; | int data, error = 0, i; | ||||
AUDIT_ARG_PID(uap->pid); | AUDIT_ARG_PID(uap->pid); | ||||
AUDIT_ARG_CMD(uap->req); | AUDIT_ARG_CMD(uap->req); | ||||
AUDIT_ARG_VALUE(uap->data); | AUDIT_ARG_VALUE(uap->data); | ||||
addr = &r; | addr = &r; | ||||
Show All 29 Lines | case PT_SETREGS: | ||||
error = copyin(uap->addr, &r.reg, sizeof(r.reg)); | error = copyin(uap->addr, &r.reg, sizeof(r.reg)); | ||||
break; | break; | ||||
case PT_SETFPREGS: | case PT_SETFPREGS: | ||||
error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg)); | error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg)); | ||||
break; | break; | ||||
case PT_SETDBREGS: | case PT_SETDBREGS: | ||||
error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg)); | error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg)); | ||||
break; | break; | ||||
case PT_SETREGSET: | |||||
error = copyin(uap->addr, &r32.vec, sizeof(r32.vec)); | |||||
if (error != 0) | |||||
break; | |||||
r.vec.iov_len = r32.vec.iov_len; | |||||
Not Done Inline ActionsWhy does this have to be a kernel pointer at all? Can't it just be a PTRIN() of the 32-bit pointer? jhb: Why does this have to be a kernel pointer at all? Can't it just be a PTRIN() of the 32-bit… | |||||
r.vec.iov_base = PTRIN(r32.vec.iov_base); | |||||
break; | |||||
case PT_GETREGSET: | |||||
error = copyin(uap->addr, &r32.vec, sizeof(r32.vec)); | |||||
if (error != 0) | |||||
break; | |||||
r.vec.iov_len = r32.vec.iov_len; | |||||
r.vec.iov_base = PTRIN(r32.vec.iov_base); | |||||
break; | |||||
case PT_SET_EVENT_MASK: | case PT_SET_EVENT_MASK: | ||||
if (uap->data != sizeof(r.ptevents)) | if (uap->data != sizeof(r.ptevents)) | ||||
error = EINVAL; | error = EINVAL; | ||||
else | else | ||||
error = copyin(uap->addr, &r.ptevents, uap->data); | error = copyin(uap->addr, &r.ptevents, uap->data); | ||||
break; | break; | ||||
case PT_IO: | case PT_IO: | ||||
error = copyin(uap->addr, &r32.piod, sizeof(r32.piod)); | error = copyin(uap->addr, &r32.piod, sizeof(r32.piod)); | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) | ||||
case PT_GETREGS: | case PT_GETREGS: | ||||
error = copyout(&r.reg, uap->addr, sizeof(r.reg)); | error = copyout(&r.reg, uap->addr, sizeof(r.reg)); | ||||
break; | break; | ||||
case PT_GETFPREGS: | case PT_GETFPREGS: | ||||
error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg)); | error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg)); | ||||
break; | break; | ||||
case PT_GETDBREGS: | case PT_GETDBREGS: | ||||
error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg)); | error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg)); | ||||
break; | |||||
case PT_GETREGSET: | |||||
r32.vec.iov_len = r.vec.iov_len; | |||||
error = copyout(&r32.vec, uap->addr, sizeof(r32.vec)); | |||||
break; | break; | ||||
case PT_GET_EVENT_MASK: | case PT_GET_EVENT_MASK: | ||||
/* NB: The size in uap->data is validated in kern_ptrace(). */ | /* NB: The size in uap->data is validated in kern_ptrace(). */ | ||||
error = copyout(&r.ptevents, uap->addr, uap->data); | error = copyout(&r.ptevents, uap->addr, uap->data); | ||||
break; | break; | ||||
case PT_LWPINFO: | case PT_LWPINFO: | ||||
ptrace_lwpinfo_to32(&r.pl, &r32.pl); | ptrace_lwpinfo_to32(&r.pl, &r32.pl); | ||||
error = copyout(&r32.pl, uap->addr, uap->data); | error = copyout(&r32.pl, uap->addr, uap->data); | ||||
▲ Show 20 Lines • Show All 2,867 Lines • Show Last 20 Lines |
Probably this should be the 'struct iovec' and the 'struct iovec32' should be down in the 'r32' union. In general the 'r32' union are the 32-bit sized things, and the 'r' union is the native sized things. The reason the register sets are 32-bit in 'r' is because kern_ptrace() expects 'reg32' when the calling ABI is 32-bit. Then 'add = &r' does the right thing, etc.