From owner-p4-projects@FreeBSD.ORG Mon Jun 13 19:29:33 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E11BF16A420; Mon, 13 Jun 2005 19:29:32 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9D37C16A41C for ; Mon, 13 Jun 2005 19:29:32 +0000 (GMT) (envelope-from ps@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 752AC43D48 for ; Mon, 13 Jun 2005 19:29:32 +0000 (GMT) (envelope-from ps@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j5DJTW1n009002 for ; Mon, 13 Jun 2005 19:29:32 GMT (envelope-from ps@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j5DJTWMf008999 for perforce@freebsd.org; Mon, 13 Jun 2005 19:29:32 GMT (envelope-from ps@freebsd.org) Date: Mon, 13 Jun 2005 19:29:32 GMT Message-Id: <200506131929.j5DJTWMf008999@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ps@freebsd.org using -f From: Paul Saab To: Perforce Change Reviews Cc: Subject: PERFORCE change 78494 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2005 19:29:34 -0000 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. */