Author: jhb
Date: Tue Jun  9 16:43:23 2020
New Revision: 361975
URL: https://svnweb.freebsd.org/changeset/base/361975

Log:
  Refactor ptrace() ABI compatibility.
  
  Add a freebsd32_ptrace() and move as many freebsd32 shims as possible
  to freebsd32_ptrace().  Aside from register sets, freebsd32 passes
  pointers to native structures to kern_ptrace() and converts to/from
  native/32-bit structure formats in freebsd32_ptrace() outside of
  kern_ptrace().
  
  Reviewed by:  kib
  Obtained from:        CheriBSD
  Sponsored by: DARPA
  Differential Revision:        https://reviews.freebsd.org/D25195

Modified:
  head/sys/compat/freebsd32/freebsd32_misc.c
  head/sys/compat/freebsd32/freebsd32_proto.h
  head/sys/compat/freebsd32/freebsd32_syscall.h
  head/sys/compat/freebsd32/freebsd32_syscalls.c
  head/sys/compat/freebsd32/freebsd32_sysent.c
  head/sys/compat/freebsd32/freebsd32_systrace_args.c
  head/sys/compat/freebsd32/syscalls.master
  head/sys/kern/sys_process.c

Modified: head/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_misc.c  Tue Jun  9 16:43:16 2020        
(r361974)
+++ head/sys/compat/freebsd32/freebsd32_misc.c  Tue Jun  9 16:43:23 2020        
(r361975)
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
 #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 @@ __FBSDID("$FreeBSD$");
 
 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_getrusage(struct thread *td, struct freebsd3
                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);
 }
 

Modified: head/sys/compat/freebsd32/freebsd32_proto.h
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_proto.h Tue Jun  9 16:43:16 2020        
(r361974)
+++ head/sys/compat/freebsd32/freebsd32_proto.h Tue Jun  9 16:43:23 2020        
(r361975)
@@ -43,6 +43,12 @@ struct freebsd32_wait4_args {
        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 @@ struct freebsd32___sysctlbyname_args {
 #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 @@ int       freebsd11_freebsd32_fstatat(struct thread *, 
struc
 #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

Modified: head/sys/compat/freebsd32/freebsd32_syscall.h
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_syscall.h       Tue Jun  9 16:43:16 
2020        (r361974)
+++ head/sys/compat/freebsd32/freebsd32_syscall.h       Tue Jun  9 16:43:23 
2020        (r361975)
@@ -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

Modified: head/sys/compat/freebsd32/freebsd32_syscalls.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_syscalls.c      Tue Jun  9 16:43:16 
2020        (r361974)
+++ head/sys/compat/freebsd32/freebsd32_syscalls.c      Tue Jun  9 16:43:23 
2020        (r361975)
@@ -35,7 +35,7 @@ const char *freebsd32_syscallnames[] = {
        "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 */

Modified: head/sys/compat/freebsd32/freebsd32_sysent.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_sysent.c        Tue Jun  9 16:43:16 
2020        (r361974)
+++ head/sys/compat/freebsd32/freebsd32_sysent.c        Tue Jun  9 16:43:23 
2020        (r361975)
@@ -88,7 +88,7 @@ struct sysent freebsd32_sysent[] = {
        { 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 */

Modified: head/sys/compat/freebsd32/freebsd32_systrace_args.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_systrace_args.c Tue Jun  9 16:43:16 
2020        (r361974)
+++ head/sys/compat/freebsd32/freebsd32_systrace_args.c Tue Jun  9 16:43:23 
2020        (r361975)
@@ -168,9 +168,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
                *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 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        /* geteuid */
        case 25:
                break;
-       /* ptrace */
+       /* freebsd32_ptrace */
        case 26:
                switch(ndx) {
                case 0:
@@ -9228,7 +9228,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *
        case 24:
        /* geteuid */
        case 25:
-       /* ptrace */
+       /* freebsd32_ptrace */
        case 26:
                if (ndx == 0 || ndx == 1)
                        p = "int";

Modified: head/sys/compat/freebsd32/syscalls.master
==============================================================================
--- head/sys/compat/freebsd32/syscalls.master   Tue Jun  9 16:43:16 2020        
(r361974)
+++ head/sys/compat/freebsd32/syscalls.master   Tue Jun  9 16:43:23 2020        
(r361975)
@@ -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); }

Modified: head/sys/kern/sys_process.c
==============================================================================
--- head/sys/kern/sys_process.c Tue Jun  9 16:43:16 2020        (r361974)
+++ head/sys/kern/sys_process.c Tue Jun  9 16:43:23 2020        (r361975)
@@ -67,32 +67,6 @@ __FBSDID("$FreeBSD$");
 
 #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 @@ ptrace_vm_entry(struct thread *td, struct proc *p, str
        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 @@ struct ptrace_args {
 };
 #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 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
                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 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
        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 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
                        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 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
 
        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 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
 
        return (error);
 }
-#undef COPYIN
-#undef COPYOUT
-#undef BZERO
 
 #ifdef COMPAT_FREEBSD32
 /*
@@ -741,13 +616,6 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
        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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                        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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                        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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                        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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                }
                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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
                        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 @@ kern_ptrace(struct thread *td, int req, pid_t pid, voi
 
        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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to