Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/freebsd32/freebsd32_misc.c
Show First 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | |||||
struct ptrace_io_desc32 { | struct ptrace_io_desc32 { | ||||
int piod_op; | int piod_op; | ||||
uint32_t piod_offs; | uint32_t piod_offs; | ||||
uint32_t piod_addr; | uint32_t piod_addr; | ||||
uint32_t piod_len; | uint32_t piod_len; | ||||
}; | }; | ||||
struct ptrace_sc_ret32 { | |||||
uint32_t sr_retval[2]; | |||||
int sr_error; | |||||
}; | |||||
struct ptrace_vm_entry32 { | struct ptrace_vm_entry32 { | ||||
int pve_entry; | int pve_entry; | ||||
int pve_timestamp; | int pve_timestamp; | ||||
uint32_t pve_start; | uint32_t pve_start; | ||||
uint32_t pve_end; | uint32_t pve_end; | ||||
uint32_t pve_offset; | uint32_t pve_offset; | ||||
u_int pve_prot; | u_int pve_prot; | ||||
u_int pve_pathlen; | u_int pve_pathlen; | ||||
▲ Show 20 Lines • Show All 817 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) | 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 ptrace_sc_remote sr; | |||||
struct dbreg32 dbreg; | struct dbreg32 dbreg; | ||||
struct fpreg32 fpreg; | struct fpreg32 fpreg; | ||||
struct reg32 reg; | struct reg32 reg; | ||||
struct iovec vec; | struct iovec vec; | ||||
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; | ||||
struct ptrace_sc_remote32 sr; | |||||
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; | struct iovec32 vec; | ||||
} r32; | } r32; | ||||
u_long pscr_args[nitems(td->td_sa.args)]; | |||||
u_int pscr_args32[nitems(td->td_sa.args)]; | |||||
void *addr; | void *addr; | ||||
int data, error, i; | int data, error, i; | ||||
if (!allow_ptrace) | if (!allow_ptrace) | ||||
return (ENOSYS); | return (ENOSYS); | ||||
error = 0; | error = 0; | ||||
AUDIT_ARG_PID(uap->pid); | AUDIT_ARG_PID(uap->pid); | ||||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | if (uap->data != sizeof(r32.pc)) | ||||
error = EINVAL; | error = EINVAL; | ||||
else | else | ||||
error = copyin(uap->addr, &r32.pc, uap->data); | error = copyin(uap->addr, &r32.pc, uap->data); | ||||
CP(r32.pc, r.pc, pc_fd); | CP(r32.pc, r.pc, pc_fd); | ||||
CP(r32.pc, r.pc, pc_flags); | CP(r32.pc, r.pc, pc_flags); | ||||
r.pc.pc_limit = PAIR32TO64(off_t, r32.pc.pc_limit); | r.pc.pc_limit = PAIR32TO64(off_t, r32.pc.pc_limit); | ||||
data = sizeof(r.pc); | data = sizeof(r.pc); | ||||
break; | break; | ||||
case PT_SC_REMOTE: | |||||
if (uap->data != sizeof(r32.sr)) { | |||||
error = EINVAL; | |||||
break; | |||||
} | |||||
error = copyin(uap->addr, &r32.sr, uap->data); | |||||
if (error != 0) | |||||
break; | |||||
CP(r32.sr, r.sr, pscr_syscall); | |||||
CP(r32.sr, r.sr, pscr_nargs); | |||||
if (r.sr.pscr_nargs > nitems(td->td_sa.args)) { | |||||
error = EINVAL; | |||||
break; | |||||
} | |||||
error = copyin(PTRIN(r32.sr.pscr_args), pscr_args32, | |||||
sizeof(u_int) * r32.sr.pscr_nargs); | |||||
if (error != 0) | |||||
break; | |||||
for (i = 0; i < r32.sr.pscr_nargs; i++) | |||||
pscr_args[i] = pscr_args32[i]; | |||||
r.sr.pscr_args = pscr_args; | |||||
break; | |||||
default: | default: | ||||
addr = uap->addr; | addr = uap->addr; | ||||
break; | break; | ||||
} | } | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
error = kern_ptrace(td, uap->req, uap->pid, addr, data); | error = kern_ptrace(td, uap->req, uap->pid, addr, data); | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | for (i = 0; i < nitems(r.args); i++) | ||||
r32.args[i] = (uint32_t)r.args[i]; | r32.args[i] = (uint32_t)r.args[i]; | ||||
error = copyout(r32.args, uap->addr, MIN(uap->data, | error = copyout(r32.args, uap->addr, MIN(uap->data, | ||||
sizeof(r32.args))); | sizeof(r32.args))); | ||||
break; | break; | ||||
case PT_GET_SC_RET: | case PT_GET_SC_RET: | ||||
ptrace_sc_ret_to32(&r.psr, &r32.psr); | ptrace_sc_ret_to32(&r.psr, &r32.psr); | ||||
error = copyout(&r32.psr, uap->addr, MIN(uap->data, | error = copyout(&r32.psr, uap->addr, MIN(uap->data, | ||||
sizeof(r32.psr))); | sizeof(r32.psr))); | ||||
break; | |||||
case PT_SC_REMOTE: | |||||
ptrace_sc_ret_to32(&r.sr.pscr_ret, &r32.sr.pscr_ret); | |||||
error = copyout(&r32.sr.pscr_ret, uap->addr + | |||||
offsetof(struct ptrace_sc_remote32, pscr_ret), | |||||
sizeof(r32.psr)); | |||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
freebsd32_copyinuio(struct iovec32 *iovp, u_int iovcnt, struct uio **uiop) | freebsd32_copyinuio(struct iovec32 *iovp, u_int iovcnt, struct uio **uiop) | ||||
▲ Show 20 Lines • Show All 2,932 Lines • Show Last 20 Lines |