PERFORCE change 78494 for review
Paul Saab
ps at FreeBSD.org
Mon Jun 13 19:29:34 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=78494
Change 78494 by ps at 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.
*/
More information about the p4-projects
mailing list