Date: Mon, 13 Jun 2005 19:29:32 GMT From: Paul Saab <ps@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 78494 for review Message-ID: <200506131929.j5DJTWMf008999@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=78494 Change 78494 by ps@butter.corp on 2005/06/13 19:29:31 Wrap PT_IO for COMPAT_IA32 compatability. Reviewed by: peter Affected files ... .. //depot/projects/hammer/sys/kern/sys_process.c#28 edit .. //depot/projects/hammer/sys/sys/ptrace.h#9 edit Differences ... ==== //depot/projects/hammer/sys/kern/sys_process.c#28 (text+ko) ==== @@ -373,6 +373,7 @@ struct dbreg32 dbreg32; struct fpreg32 fpreg32; struct reg32 reg32; + struct ptrace_io_desc32 piod32; #endif } r; void *addr; @@ -400,7 +401,7 @@ error = COPYIN(uap->addr, &r.dbreg, sizeof r.dbreg); break; case PT_IO: - error = copyin(uap->addr, &r.piod, sizeof r.piod); + error = COPYIN(uap->addr, &r.piod, sizeof r.piod); break; default: addr = uap->addr; @@ -415,7 +416,7 @@ switch (uap->req) { case PT_IO: - (void)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); @@ -453,7 +454,7 @@ struct uio uio; struct proc *curp, *p, *pp; struct thread *td2 = NULL; - struct ptrace_io_desc *piod; + struct ptrace_io_desc *piod = NULL; struct ptrace_lwpinfo *pl; int error, write, tmp, num; int proctree_locked = 0; @@ -461,6 +462,7 @@ pid_t saved_pid = pid; #ifdef COMPAT_IA32 int wrap32 = 0, safe = 0; + struct ptrace_io_desc32 *piod32 = NULL; #endif curp = td->td_proc; @@ -818,16 +820,31 @@ case PT_IO: PROC_UNLOCK(p); - piod = addr; - iov.iov_base = piod->piod_addr; - iov.iov_len = piod->piod_len; +#ifdef COMPAT_IA32 + 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; + } uio.uio_iov = &iov; uio.uio_iovcnt = 1; - uio.uio_offset = (off_t)(uintptr_t)piod->piod_offs; - uio.uio_resid = piod->piod_len; uio.uio_segflg = UIO_USERSPACE; uio.uio_td = td; +#ifdef COMPAT_IA32 + switch (wrap32 ? piod32->piod_op : piod->piod_op) { +#else switch (piod->piod_op) { +#endif case PIOD_READ_D: case PIOD_READ_I: uio.uio_rw = UIO_READ; @@ -840,7 +857,14 @@ return (EINVAL); } error = proc_rwmem(p, &uio); - piod->piod_len -= uio.uio_resid; +#ifdef COMPAT_IA32 + if (wrap32) { + piod32->piod_len -= uio.uio_resid; + } else +#endif + { + piod->piod_len -= uio.uio_resid; + } return (error); case PT_KILL: ==== //depot/projects/hammer/sys/sys/ptrace.h#9 (text+ko) ==== @@ -75,6 +75,15 @@ size_t piod_len; /* request length */ }; +#ifdef COMPAT_IA32 +struct ptrace_io_desc32 { + int piod_op; + u_int32_t piod_offs; + u_int32_t piod_addr; + u_int32_t piod_len; +}; +#endif + /* * Operations in piod_op. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506131929.j5DJTWMf008999>