Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F100902589
D25195.id72867.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
21 KB
Referenced Files
None
Subscribers
None
D25195.id72867.diff
View Options
Index: head/sys/compat/freebsd32/freebsd32_misc.c
===================================================================
--- head/sys/compat/freebsd32/freebsd32_misc.c
+++ head/sys/compat/freebsd32/freebsd32_misc.c
@@ -63,6 +63,7 @@
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/procctl.h>
+#include <sys/ptrace.h>
#include <sys/reboot.h>
#include <sys/resource.h>
#include <sys/resourcevar.h>
@@ -121,6 +122,31 @@
FEATURE(compat_freebsd_32bit, "Compatible with 32-bit FreeBSD");
+struct ptrace_io_desc32 {
+ int piod_op;
+ uint32_t piod_offs;
+ uint32_t piod_addr;
+ uint32_t piod_len;
+};
+
+struct ptrace_sc_ret32 {
+ uint32_t sr_retval[2];
+ int sr_error;
+};
+
+struct ptrace_vm_entry32 {
+ int pve_entry;
+ int pve_timestamp;
+ uint32_t pve_start;
+ uint32_t pve_end;
+ uint32_t pve_offset;
+ u_int pve_prot;
+ u_int pve_pathlen;
+ int32_t pve_fileid;
+ u_int pve_fsid;
+ uint32_t pve_path;
+};
+
#ifdef __amd64__
CTASSERT(sizeof(struct timeval32) == 8);
CTASSERT(sizeof(struct timespec32) == 8);
@@ -853,6 +879,192 @@
freebsd32_rusage_out(&s, &s32);
error = copyout(&s32, uap->rusage, sizeof(s32));
}
+ return (error);
+}
+
+static void
+ptrace_lwpinfo_to32(const struct ptrace_lwpinfo *pl,
+ struct ptrace_lwpinfo32 *pl32)
+{
+
+ bzero(pl32, sizeof(*pl32));
+ pl32->pl_lwpid = pl->pl_lwpid;
+ pl32->pl_event = pl->pl_event;
+ pl32->pl_flags = pl->pl_flags;
+ pl32->pl_sigmask = pl->pl_sigmask;
+ pl32->pl_siglist = pl->pl_siglist;
+ siginfo_to_siginfo32(&pl->pl_siginfo, &pl32->pl_siginfo);
+ strcpy(pl32->pl_tdname, pl->pl_tdname);
+ pl32->pl_child_pid = pl->pl_child_pid;
+ pl32->pl_syscall_code = pl->pl_syscall_code;
+ pl32->pl_syscall_narg = pl->pl_syscall_narg;
+}
+
+static void
+ptrace_sc_ret_to32(const struct ptrace_sc_ret *psr,
+ struct ptrace_sc_ret32 *psr32)
+{
+
+ bzero(psr32, sizeof(*psr32));
+ psr32->sr_retval[0] = psr->sr_retval[0];
+ psr32->sr_retval[1] = psr->sr_retval[1];
+ psr32->sr_error = psr->sr_error;
+}
+
+int
+freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap)
+{
+ union {
+ struct ptrace_io_desc piod;
+ struct ptrace_lwpinfo pl;
+ struct ptrace_vm_entry pve;
+ struct dbreg32 dbreg;
+ struct fpreg32 fpreg;
+ struct reg32 reg;
+ register_t args[nitems(td->td_sa.args)];
+ struct ptrace_sc_ret psr;
+ int ptevents;
+ } r;
+ union {
+ struct ptrace_io_desc32 piod;
+ struct ptrace_lwpinfo32 pl;
+ struct ptrace_vm_entry32 pve;
+ uint32_t args[nitems(td->td_sa.args)];
+ struct ptrace_sc_ret32 psr;
+ } r32;
+ void *addr;
+ int data, error = 0, i;
+
+ AUDIT_ARG_PID(uap->pid);
+ AUDIT_ARG_CMD(uap->req);
+ AUDIT_ARG_VALUE(uap->data);
+ addr = &r;
+ data = uap->data;
+ switch (uap->req) {
+ case PT_GET_EVENT_MASK:
+ case PT_GET_SC_ARGS:
+ case PT_GET_SC_RET:
+ break;
+ case PT_LWPINFO:
+ if (uap->data > sizeof(r32.pl))
+ return (EINVAL);
+
+ /*
+ * Pass size of native structure in 'data'. Truncate
+ * if necessary to avoid siginfo.
+ */
+ data = sizeof(r.pl);
+ if (uap->data < offsetof(struct ptrace_lwpinfo32, pl_siginfo) +
+ sizeof(struct siginfo32))
+ data = offsetof(struct ptrace_lwpinfo, pl_siginfo);
+ break;
+ case PT_GETREGS:
+ bzero(&r.reg, sizeof(r.reg));
+ break;
+ case PT_GETFPREGS:
+ bzero(&r.fpreg, sizeof(r.fpreg));
+ break;
+ case PT_GETDBREGS:
+ bzero(&r.dbreg, sizeof(r.dbreg));
+ break;
+ case PT_SETREGS:
+ error = copyin(uap->addr, &r.reg, sizeof(r.reg));
+ break;
+ case PT_SETFPREGS:
+ error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg));
+ break;
+ case PT_SETDBREGS:
+ error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg));
+ break;
+ case PT_SET_EVENT_MASK:
+ if (uap->data != sizeof(r.ptevents))
+ error = EINVAL;
+ else
+ error = copyin(uap->addr, &r.ptevents, uap->data);
+ break;
+ case PT_IO:
+ error = copyin(uap->addr, &r32.piod, sizeof(r32.piod));
+ if (error)
+ break;
+ CP(r32.piod, r.piod, piod_op);
+ PTRIN_CP(r32.piod, r.piod, piod_offs);
+ PTRIN_CP(r32.piod, r.piod, piod_addr);
+ CP(r32.piod, r.piod, piod_len);
+ break;
+ case PT_VM_ENTRY:
+ error = copyin(uap->addr, &r32.pve, sizeof(r32.pve));
+ if (error)
+ break;
+
+ CP(r32.pve, r.pve, pve_entry);
+ CP(r32.pve, r.pve, pve_timestamp);
+ CP(r32.pve, r.pve, pve_start);
+ CP(r32.pve, r.pve, pve_end);
+ CP(r32.pve, r.pve, pve_offset);
+ CP(r32.pve, r.pve, pve_prot);
+ CP(r32.pve, r.pve, pve_pathlen);
+ CP(r32.pve, r.pve, pve_fileid);
+ CP(r32.pve, r.pve, pve_fsid);
+ PTRIN_CP(r32.pve, r.pve, pve_path);
+ break;
+ default:
+ addr = uap->addr;
+ break;
+ }
+ if (error)
+ return (error);
+
+ error = kern_ptrace(td, uap->req, uap->pid, addr, data);
+ if (error)
+ return (error);
+
+ switch (uap->req) {
+ case PT_VM_ENTRY:
+ CP(r.pve, r32.pve, pve_entry);
+ CP(r.pve, r32.pve, pve_timestamp);
+ CP(r.pve, r32.pve, pve_start);
+ CP(r.pve, r32.pve, pve_end);
+ CP(r.pve, r32.pve, pve_offset);
+ CP(r.pve, r32.pve, pve_prot);
+ CP(r.pve, r32.pve, pve_pathlen);
+ CP(r.pve, r32.pve, pve_fileid);
+ CP(r.pve, r32.pve, pve_fsid);
+ error = copyout(&r32.pve, uap->addr, sizeof(r32.pve));
+ break;
+ case PT_IO:
+ CP(r.piod, r32.piod, piod_len);
+ error = copyout(&r32.piod, uap->addr, sizeof(r32.piod));
+ break;
+ case PT_GETREGS:
+ error = copyout(&r.reg, uap->addr, sizeof(r.reg));
+ break;
+ case PT_GETFPREGS:
+ error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg));
+ break;
+ case PT_GETDBREGS:
+ error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg));
+ break;
+ case PT_GET_EVENT_MASK:
+ /* NB: The size in uap->data is validated in kern_ptrace(). */
+ error = copyout(&r.ptevents, uap->addr, uap->data);
+ break;
+ case PT_LWPINFO:
+ ptrace_lwpinfo_to32(&r.pl, &r32.pl);
+ error = copyout(&r32.pl, uap->addr, uap->data);
+ break;
+ case PT_GET_SC_ARGS:
+ for (i = 0; i < nitems(r.args); i++)
+ r32.args[i] = (uint32_t)r.args[i];
+ error = copyout(r32.args, uap->addr, MIN(uap->data,
+ sizeof(r32.args)));
+ break;
+ case PT_GET_SC_RET:
+ ptrace_sc_ret_to32(&r.psr, &r32.psr);
+ error = copyout(&r32.psr, uap->addr, MIN(uap->data,
+ sizeof(r32.psr)));
+ break;
+ }
+
return (error);
}
Index: head/sys/compat/freebsd32/freebsd32_proto.h
===================================================================
--- head/sys/compat/freebsd32/freebsd32_proto.h
+++ head/sys/compat/freebsd32/freebsd32_proto.h
@@ -43,6 +43,12 @@
char options_l_[PADL_(int)]; int options; char options_r_[PADR_(int)];
char rusage_l_[PADL_(struct rusage32 *)]; struct rusage32 * rusage; char rusage_r_[PADR_(struct rusage32 *)];
};
+struct freebsd32_ptrace_args {
+ char req_l_[PADL_(int)]; int req; char req_r_[PADR_(int)];
+ char pid_l_[PADL_(pid_t)]; pid_t pid; char pid_r_[PADR_(pid_t)];
+ char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
+ char data_l_[PADL_(int)]; int data; char data_r_[PADR_(int)];
+};
struct freebsd32_recvmsg_args {
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
char msg_l_[PADL_(struct msghdr32 *)]; struct msghdr32 * msg; char msg_r_[PADR_(struct msghdr32 *)];
@@ -740,6 +746,7 @@
#define PAD64_REQUIRED
#endif
int freebsd32_wait4(struct thread *, struct freebsd32_wait4_args *);
+int freebsd32_ptrace(struct thread *, struct freebsd32_ptrace_args *);
int freebsd32_recvmsg(struct thread *, struct freebsd32_recvmsg_args *);
int freebsd32_sendmsg(struct thread *, struct freebsd32_sendmsg_args *);
int freebsd32_recvfrom(struct thread *, struct freebsd32_recvfrom_args *);
@@ -1293,6 +1300,7 @@
#define FREEBSD32_SYS_AUE_freebsd32_wait4 AUE_WAIT4
#define FREEBSD32_SYS_AUE_freebsd4_freebsd32_getfsstat AUE_GETFSSTAT
#define FREEBSD32_SYS_AUE_ofreebsd32_lseek AUE_LSEEK
+#define FREEBSD32_SYS_AUE_freebsd32_ptrace AUE_PTRACE
#define FREEBSD32_SYS_AUE_freebsd32_recvmsg AUE_RECVMSG
#define FREEBSD32_SYS_AUE_freebsd32_sendmsg AUE_SENDMSG
#define FREEBSD32_SYS_AUE_freebsd32_recvfrom AUE_RECVFROM
Index: head/sys/compat/freebsd32/freebsd32_syscall.h
===================================================================
--- head/sys/compat/freebsd32/freebsd32_syscall.h
+++ head/sys/compat/freebsd32/freebsd32_syscall.h
@@ -31,7 +31,7 @@
#define FREEBSD32_SYS_setuid 23
#define FREEBSD32_SYS_getuid 24
#define FREEBSD32_SYS_geteuid 25
-#define FREEBSD32_SYS_ptrace 26
+#define FREEBSD32_SYS_freebsd32_ptrace 26
#define FREEBSD32_SYS_freebsd32_recvmsg 27
#define FREEBSD32_SYS_freebsd32_sendmsg 28
#define FREEBSD32_SYS_freebsd32_recvfrom 29
Index: head/sys/compat/freebsd32/freebsd32_syscalls.c
===================================================================
--- head/sys/compat/freebsd32/freebsd32_syscalls.c
+++ head/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -35,7 +35,7 @@
"setuid", /* 23 = setuid */
"getuid", /* 24 = getuid */
"geteuid", /* 25 = geteuid */
- "ptrace", /* 26 = ptrace */
+ "freebsd32_ptrace", /* 26 = freebsd32_ptrace */
"freebsd32_recvmsg", /* 27 = freebsd32_recvmsg */
"freebsd32_sendmsg", /* 28 = freebsd32_sendmsg */
"freebsd32_recvfrom", /* 29 = freebsd32_recvfrom */
Index: head/sys/compat/freebsd32/freebsd32_sysent.c
===================================================================
--- head/sys/compat/freebsd32/freebsd32_sysent.c
+++ head/sys/compat/freebsd32/freebsd32_sysent.c
@@ -88,7 +88,7 @@
{ AS(setuid_args), (sy_call_t *)sys_setuid, AUE_SETUID, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 23 = setuid */
{ 0, (sy_call_t *)sys_getuid, AUE_GETUID, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 24 = getuid */
{ 0, (sy_call_t *)sys_geteuid, AUE_GETEUID, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 25 = geteuid */
- { AS(ptrace_args), (sy_call_t *)sys_ptrace, AUE_PTRACE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 26 = ptrace */
+ { AS(freebsd32_ptrace_args), (sy_call_t *)freebsd32_ptrace, AUE_PTRACE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 26 = freebsd32_ptrace */
{ AS(freebsd32_recvmsg_args), (sy_call_t *)freebsd32_recvmsg, AUE_RECVMSG, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 27 = freebsd32_recvmsg */
{ AS(freebsd32_sendmsg_args), (sy_call_t *)freebsd32_sendmsg, AUE_SENDMSG, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 28 = freebsd32_sendmsg */
{ AS(freebsd32_recvfrom_args), (sy_call_t *)freebsd32_recvfrom, AUE_RECVFROM, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 29 = freebsd32_recvfrom */
Index: head/sys/compat/freebsd32/freebsd32_systrace_args.c
===================================================================
--- head/sys/compat/freebsd32/freebsd32_systrace_args.c
+++ head/sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -168,9 +168,9 @@
*n_args = 0;
break;
}
- /* ptrace */
+ /* freebsd32_ptrace */
case 26: {
- struct ptrace_args *p = params;
+ struct freebsd32_ptrace_args *p = params;
iarg[0] = p->req; /* int */
iarg[1] = p->pid; /* pid_t */
uarg[2] = (intptr_t) p->addr; /* caddr_t */
@@ -3623,7 +3623,7 @@
/* geteuid */
case 25:
break;
- /* ptrace */
+ /* freebsd32_ptrace */
case 26:
switch(ndx) {
case 0:
@@ -9228,7 +9228,7 @@
case 24:
/* geteuid */
case 25:
- /* ptrace */
+ /* freebsd32_ptrace */
case 26:
if (ndx == 0 || ndx == 1)
p = "int";
Index: head/sys/compat/freebsd32/syscalls.master
===================================================================
--- head/sys/compat/freebsd32/syscalls.master
+++ head/sys/compat/freebsd32/syscalls.master
@@ -103,7 +103,7 @@
23 AUE_SETUID NOPROTO { int setuid(uid_t uid); }
24 AUE_GETUID NOPROTO { uid_t getuid(void); }
25 AUE_GETEUID NOPROTO { uid_t geteuid(void); }
-26 AUE_PTRACE NOPROTO { int ptrace(int req, pid_t pid, \
+26 AUE_PTRACE STD { int freebsd32_ptrace(int req, pid_t pid, \
caddr_t addr, int data); }
27 AUE_RECVMSG STD { int freebsd32_recvmsg(int s, struct msghdr32 *msg, \
int flags); }
Index: head/sys/kern/sys_process.c
===================================================================
--- head/sys/kern/sys_process.c
+++ head/sys/kern/sys_process.c
@@ -67,32 +67,6 @@
#ifdef COMPAT_FREEBSD32
#include <sys/procfs.h>
-#include <compat/freebsd32/freebsd32_signal.h>
-
-struct ptrace_io_desc32 {
- int piod_op;
- uint32_t piod_offs;
- uint32_t piod_addr;
- uint32_t piod_len;
-};
-
-struct ptrace_sc_ret32 {
- uint32_t sr_retval[2];
- int sr_error;
-};
-
-struct ptrace_vm_entry32 {
- int pve_entry;
- int pve_timestamp;
- uint32_t pve_start;
- uint32_t pve_end;
- uint32_t pve_offset;
- u_int pve_prot;
- u_int pve_pathlen;
- int32_t pve_fileid;
- u_int pve_fsid;
- uint32_t pve_path;
-};
#endif
/*
@@ -472,64 +446,6 @@
return (error);
}
-#ifdef COMPAT_FREEBSD32
-static int
-ptrace_vm_entry32(struct thread *td, struct proc *p,
- struct ptrace_vm_entry32 *pve32)
-{
- struct ptrace_vm_entry pve;
- int error;
-
- pve.pve_entry = pve32->pve_entry;
- pve.pve_pathlen = pve32->pve_pathlen;
- pve.pve_path = (void *)(uintptr_t)pve32->pve_path;
-
- error = ptrace_vm_entry(td, p, &pve);
- if (error == 0) {
- pve32->pve_entry = pve.pve_entry;
- pve32->pve_timestamp = pve.pve_timestamp;
- pve32->pve_start = pve.pve_start;
- pve32->pve_end = pve.pve_end;
- pve32->pve_offset = pve.pve_offset;
- pve32->pve_prot = pve.pve_prot;
- pve32->pve_fileid = pve.pve_fileid;
- pve32->pve_fsid = pve.pve_fsid;
- }
-
- pve32->pve_pathlen = pve.pve_pathlen;
- return (error);
-}
-
-static void
-ptrace_lwpinfo_to32(const struct ptrace_lwpinfo *pl,
- struct ptrace_lwpinfo32 *pl32)
-{
-
- bzero(pl32, sizeof(*pl32));
- pl32->pl_lwpid = pl->pl_lwpid;
- pl32->pl_event = pl->pl_event;
- pl32->pl_flags = pl->pl_flags;
- pl32->pl_sigmask = pl->pl_sigmask;
- pl32->pl_siglist = pl->pl_siglist;
- siginfo_to_siginfo32(&pl->pl_siginfo, &pl32->pl_siginfo);
- strcpy(pl32->pl_tdname, pl->pl_tdname);
- pl32->pl_child_pid = pl->pl_child_pid;
- pl32->pl_syscall_code = pl->pl_syscall_code;
- pl32->pl_syscall_narg = pl->pl_syscall_narg;
-}
-
-static void
-ptrace_sc_ret_to32(const struct ptrace_sc_ret *psr,
- struct ptrace_sc_ret32 *psr32)
-{
-
- bzero(psr32, sizeof(*psr32));
- psr32->sr_retval[0] = psr->sr_retval[0];
- psr32->sr_retval[1] = psr->sr_retval[1];
- psr32->sr_error = psr->sr_error;
-}
-#endif /* COMPAT_FREEBSD32 */
-
/*
* Process debugging system call.
*/
@@ -542,31 +458,6 @@
};
#endif
-#ifdef COMPAT_FREEBSD32
-/*
- * This CPP subterfuge is to try and reduce the number of ifdefs in
- * the body of the code.
- * COPYIN(uap->addr, &r.reg, sizeof r.reg);
- * becomes either:
- * copyin(uap->addr, &r.reg, sizeof r.reg);
- * or
- * copyin(uap->addr, &r.reg32, sizeof r.reg32);
- * .. except this is done at runtime.
- */
-#define BZERO(a, s) wrap32 ? \
- bzero(a ## 32, s ## 32) : \
- bzero(a, s)
-#define COPYIN(u, k, s) wrap32 ? \
- copyin(u, k ## 32, s ## 32) : \
- copyin(u, k, s)
-#define COPYOUT(k, u, s) wrap32 ? \
- copyout(k ## 32, u, s ## 32) : \
- copyout(k, u, s)
-#else
-#define BZERO(a, s) bzero(a, s)
-#define COPYIN(u, k, s) copyin(u, k, s)
-#define COPYOUT(k, u, s) copyout(k, u, s)
-#endif
int
sys_ptrace(struct thread *td, struct ptrace_args *uap)
{
@@ -581,26 +472,13 @@
struct dbreg dbreg;
struct fpreg fpreg;
struct reg reg;
-#ifdef COMPAT_FREEBSD32
- struct dbreg32 dbreg32;
- struct fpreg32 fpreg32;
- struct reg32 reg32;
- struct ptrace_io_desc32 piod32;
- struct ptrace_lwpinfo32 pl32;
- struct ptrace_vm_entry32 pve32;
-#endif
char args[sizeof(td->td_sa.args)];
struct ptrace_sc_ret psr;
int ptevents;
} r;
void *addr;
int error = 0;
-#ifdef COMPAT_FREEBSD32
- int wrap32 = 0;
- if (SV_CURPROC_FLAG(SV_ILP32))
- wrap32 = 1;
-#endif
AUDIT_ARG_PID(uap->pid);
AUDIT_ARG_CMD(uap->req);
AUDIT_ARG_VALUE(uap->data);
@@ -612,22 +490,22 @@
case PT_GET_SC_RET:
break;
case PT_GETREGS:
- BZERO(&r.reg, sizeof r.reg);
+ bzero(&r.reg, sizeof(r.reg));
break;
case PT_GETFPREGS:
- BZERO(&r.fpreg, sizeof r.fpreg);
+ bzero(&r.fpreg, sizeof(r.fpreg));
break;
case PT_GETDBREGS:
- BZERO(&r.dbreg, sizeof r.dbreg);
+ bzero(&r.dbreg, sizeof(r.dbreg));
break;
case PT_SETREGS:
- error = COPYIN(uap->addr, &r.reg, sizeof r.reg);
+ error = copyin(uap->addr, &r.reg, sizeof(r.reg));
break;
case PT_SETFPREGS:
- error = COPYIN(uap->addr, &r.fpreg, sizeof r.fpreg);
+ error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg));
break;
case PT_SETDBREGS:
- error = COPYIN(uap->addr, &r.dbreg, sizeof r.dbreg);
+ error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg));
break;
case PT_SET_EVENT_MASK:
if (uap->data != sizeof(r.ptevents))
@@ -636,10 +514,10 @@
error = copyin(uap->addr, &r.ptevents, uap->data);
break;
case PT_IO:
- error = COPYIN(uap->addr, &r.piod, sizeof r.piod);
+ error = copyin(uap->addr, &r.piod, sizeof(r.piod));
break;
case PT_VM_ENTRY:
- error = COPYIN(uap->addr, &r.pve, sizeof r.pve);
+ error = copyin(uap->addr, &r.pve, sizeof(r.pve));
break;
default:
addr = uap->addr;
@@ -654,19 +532,19 @@
switch (uap->req) {
case PT_VM_ENTRY:
- error = COPYOUT(&r.pve, uap->addr, sizeof r.pve);
+ error = copyout(&r.pve, uap->addr, sizeof(r.pve));
break;
case PT_IO:
- error = COPYOUT(&r.piod, uap->addr, sizeof r.piod);
+ error = copyout(&r.piod, uap->addr, sizeof(r.piod));
break;
case PT_GETREGS:
- error = COPYOUT(&r.reg, uap->addr, sizeof r.reg);
+ error = copyout(&r.reg, uap->addr, sizeof(r.reg));
break;
case PT_GETFPREGS:
- error = COPYOUT(&r.fpreg, uap->addr, sizeof r.fpreg);
+ error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg));
break;
case PT_GETDBREGS:
- error = COPYOUT(&r.dbreg, uap->addr, sizeof r.dbreg);
+ error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg));
break;
case PT_GET_EVENT_MASK:
/* NB: The size in uap->data is validated in kern_ptrace(). */
@@ -688,9 +566,6 @@
return (error);
}
-#undef COPYIN
-#undef COPYOUT
-#undef BZERO
#ifdef COMPAT_FREEBSD32
/*
@@ -741,13 +616,6 @@
lwpid_t tid = 0, *buf;
#ifdef COMPAT_FREEBSD32
int wrap32 = 0, safe = 0;
- struct ptrace_io_desc32 *piod32 = NULL;
- struct ptrace_lwpinfo32 *pl32 = NULL;
- struct ptrace_sc_ret32 *psr32 = NULL;
- union {
- struct ptrace_lwpinfo pl;
- struct ptrace_sc_ret psr;
- } r;
#endif
curp = td->td_proc;
@@ -1057,15 +925,8 @@
break;
}
bzero(addr, sizeof(td2->td_sa.args));
-#ifdef COMPAT_FREEBSD32
- if (wrap32)
- for (num = 0; num < nitems(td2->td_sa.args); num++)
- ((uint32_t *)addr)[num] = (uint32_t)
- td2->td_sa.args[num];
- else
-#endif
- bcopy(td2->td_sa.args, addr, td2->td_sa.narg *
- sizeof(register_t));
+ bcopy(td2->td_sa.args, addr, td2->td_sa.narg *
+ sizeof(register_t));
break;
case PT_GET_SC_RET:
@@ -1077,12 +938,6 @@
error = EINVAL;
break;
}
-#ifdef COMPAT_FREEBSD32
- if (wrap32) {
- psr = &r.psr;
- psr32 = addr;
- } else
-#endif
psr = addr;
bzero(psr, sizeof(*psr));
psr->sr_error = td2->td_errno;
@@ -1090,10 +945,6 @@
psr->sr_retval[0] = td2->td_retval[0];
psr->sr_retval[1] = td2->td_retval[1];
}
-#ifdef COMPAT_FREEBSD32
- if (wrap32)
- ptrace_sc_ret_to32(psr, psr32);
-#endif
CTR4(KTR_PTRACE,
"PT_GET_SC_RET: pid %d error %d retval %#lx,%#lx",
p->p_pid, psr->sr_error, psr->sr_retval[0],
@@ -1274,32 +1125,16 @@
break;
case PT_IO:
-#ifdef COMPAT_FREEBSD32
- if (wrap32) {
- piod32 = addr;
- iov.iov_base = (void *)(uintptr_t)piod32->piod_addr;
- iov.iov_len = piod32->piod_len;
- uio.uio_offset = (off_t)(uintptr_t)piod32->piod_offs;
- uio.uio_resid = piod32->piod_len;
- } else
-#endif
- {
- piod = addr;
- iov.iov_base = piod->piod_addr;
- iov.iov_len = piod->piod_len;
- uio.uio_offset = (off_t)(uintptr_t)piod->piod_offs;
- uio.uio_resid = piod->piod_len;
- }
+ piod = addr;
+ iov.iov_base = piod->piod_addr;
+ iov.iov_len = piod->piod_len;
+ uio.uio_offset = (off_t)(uintptr_t)piod->piod_offs;
+ uio.uio_resid = piod->piod_len;
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
uio.uio_segflg = UIO_USERSPACE;
uio.uio_td = td;
-#ifdef COMPAT_FREEBSD32
- tmp = wrap32 ? piod32->piod_op : piod->piod_op;
-#else
- tmp = piod->piod_op;
-#endif
- switch (tmp) {
+ switch (piod->piod_op) {
case PIOD_READ_D:
case PIOD_READ_I:
CTR3(KTR_PTRACE, "PT_IO: pid %d: READ (%p, %#x)",
@@ -1319,12 +1154,7 @@
}
PROC_UNLOCK(p);
error = proc_rwmem(p, &uio);
-#ifdef COMPAT_FREEBSD32
- if (wrap32)
- piod32->piod_len -= uio.uio_resid;
- else
-#endif
- piod->piod_len -= uio.uio_resid;
+ piod->piod_len -= uio.uio_resid;
PROC_LOCK(p);
break;
@@ -1373,22 +1203,10 @@
break;
case PT_LWPINFO:
- if (data <= 0 ||
-#ifdef COMPAT_FREEBSD32
- (!wrap32 && data > sizeof(*pl)) ||
- (wrap32 && data > sizeof(*pl32))) {
-#else
- data > sizeof(*pl)) {
-#endif
+ if (data <= 0 || data > sizeof(*pl)) {
error = EINVAL;
break;
}
-#ifdef COMPAT_FREEBSD32
- if (wrap32) {
- pl = &r.pl;
- pl32 = addr;
- } else
-#endif
pl = addr;
bzero(pl, sizeof(*pl));
pl->pl_lwpid = td2->td_tid;
@@ -1397,16 +1215,8 @@
if (td2->td_dbgflags & TDB_XSIG) {
pl->pl_event = PL_EVENT_SIGNAL;
if (td2->td_si.si_signo != 0 &&
-#ifdef COMPAT_FREEBSD32
- ((!wrap32 && data >= offsetof(struct ptrace_lwpinfo,
- pl_siginfo) + sizeof(pl->pl_siginfo)) ||
- (wrap32 && data >= offsetof(struct ptrace_lwpinfo32,
- pl_siginfo) + sizeof(struct siginfo32)))
-#else
data >= offsetof(struct ptrace_lwpinfo, pl_siginfo)
- + sizeof(pl->pl_siginfo)
-#endif
- ){
+ + sizeof(pl->pl_siginfo)){
pl->pl_flags |= PL_FLAG_SI;
pl->pl_siginfo = td2->td_si;
}
@@ -1441,10 +1251,6 @@
pl->pl_syscall_code = 0;
pl->pl_syscall_narg = 0;
}
-#ifdef COMPAT_FREEBSD32
- if (wrap32)
- ptrace_lwpinfo_to32(pl, pl32);
-#endif
CTR6(KTR_PTRACE,
"PT_LWPINFO: tid %d (pid %d) event %d flags %#x child pid %d syscall %d",
td2->td_tid, p->p_pid, pl->pl_event, pl->pl_flags,
@@ -1490,11 +1296,6 @@
case PT_VM_ENTRY:
PROC_UNLOCK(p);
-#ifdef COMPAT_FREEBSD32
- if (wrap32)
- error = ptrace_vm_entry32(td, p, addr);
- else
-#endif
error = ptrace_vm_entry(td, p, addr);
PROC_LOCK(p);
break;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Oct 22, 12:47 PM (18 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14302785
Default Alt Text
D25195.id72867.diff (21 KB)
Attached To
Mode
D25195: Refactor ptrace() ABI compatibility.
Attached
Detach File
Event Timeline
Log In to Comment