Skip site navigation (1)Skip section navigation (2)
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>