Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Mar 2002 11:45:23 -0800
From:      Bakul Shah <bakul@bitblocks.com>
To:        callum.gibson@db.com
Cc:        hackers@FreeBSD.ORG, Peter Wemm <peter@wemm.org>
Subject:   Re: Missing PT_READ_U 
Message-ID:  <200203251945.OAA08115@renown.cnchost.com>
In-Reply-To: Your message of "Mon, 25 Mar 2002 13:28:08 %2B1100." <20020325022808.11749.qmail@merton.aus.deuba.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
> }> As the culprit behind PT_READ_U's demise, I'm willing to dive in
> }> and help here if needed.
> }Thanks but Julian sent me a patch for 4.5 that seems to work
> }with no changes in ups.  Would be nice if PT_READ_U is put
> }back in 4.x.
>
> As a followup to this old thread (and as the poster of the original
> question on the ups mailing list in late Feb) I note there has still
> been no change on the RELENG_4 branch to fix this. Could we have the
> patch posted here at least so other people can use ups again (with
> signals)? I'd just apply a reverse patch from kern/sys_process.c 1.51.2.2
> to 1.51.2.1 except that I don't know if other files (apart from sys/ptrace.h)
> have been affected.

Julain Elischer's diff as applied to the 4.5-RELEASE included
below.  With this change ups-3.37-beta4 compiled unchanged.

But note that you still can't change any registers.  If
PT_WRITE_U is added back to the FreeBSD-4.x branch, no change
is necessary to ups.  So how about it, Peter Wemm?

The other alternative is to change ups to understand
PT_{SET,GET}{REGS,FPREGS} -- this would be needed for
FreeBSD-5 in any case.  But this is not a quick change as ups
uses PTRACE_{PEEK,POKE}USER for dealing with registers and
signals and these need to be replaced something more
discriminating.  I took a quick look at it but then got
distracted.  Also, not every arch. has separate FP regs and I
didn't look deep enough in ups to figure out how to add
machine dependent code like this.

-- bakul

Index: sys/ptrace.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/ptrace.h,v
retrieving revision 1.10.2.1
diff -u -r1.10.2.1 ptrace.h
--- sys/ptrace.h	3 Oct 2001 06:55:43 -0000	1.10.2.1
+++ sys/ptrace.h	1 Mar 2002 21:52:57 -0000
@@ -40,7 +40,7 @@
 #define	PT_TRACE_ME	0	/* child declares it's being traced */
 #define	PT_READ_I	1	/* read word in child's I space */
 #define	PT_READ_D	2	/* read word in child's D space */
-/* was	PT_READ_U	3	 * read word in child's user structure */
+#define	PT_READ_U	3	/* read word in child's user structure */
 #define	PT_WRITE_I	4	/* write word in child's I space */
 #define	PT_WRITE_D	5	/* write word in child's D space */
 /* was	PT_WRITE_U	6	 * write word in child's user structure */
Index: kern/sys_process.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/sys_process.c,v
retrieving revision 1.51.2.3
diff -u -r1.51.2.3 sys_process.c
--- kern/sys_process.c	22 Jan 2002 17:22:59 -0000	1.51.2.3
+++ kern/sys_process.c	1 Mar 2002 23:45:18 -0000
@@ -257,6 +257,7 @@
 
 	case PT_READ_I:
 	case PT_READ_D:
+	case PT_READ_U:
 	case PT_WRITE_I:
 	case PT_WRITE_D:
 	case PT_CONTINUE:
@@ -413,6 +417,33 @@
 		}
 		return (error);
 
+	case PT_READ_U:
+                 if ((uintptr_t)uap->addr > UPAGES * PAGE_SIZE -
+                    sizeof(int)) {
+                         return EFAULT;
+                 }
+                 if ((uintptr_t)uap->addr & (sizeof(int) - 1)) {
+                         return EFAULT;
+                 }
+                 if (ptrace_read_u_check(p,(vm_offset_t) uap->addr,
+                                         sizeof(int))) {
+                         return EFAULT;
+                 }
+                 error = 0;
+                 PHOLD(p);       /* user had damn well better be incore!*/
+                 if (p->p_flag & P_INMEM) {
+                         p->p_addr->u_kproc.kp_proc = *p;
+                         fill_eproc (p, &p->p_addr->u_kproc.kp_eproc);
+                         curp->p_retval[0] = *(int *)
+                             ((uintptr_t)p->p_addr +
+                             (uintptr_t)uap->addr);
+                 } else {
+                         curp->p_retval[0] = 0;
+                         error = EFAULT;
+                 }
+                 PRELE(p);
+                 return error;
+
 	case PT_KILL:
 		uap->data = SIGKILL;
 		goto sendsig;	/* in PT_CONTINUE above */

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203251945.OAA08115>