PERFORCE change 109173 for review

John Birrell jb at FreeBSD.org
Sat Nov 4 00:22:58 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=109173

Change 109173 by jb at jb_freebsd8 on 2006/11/04 00:22:20

	Reset to match current.
	
	I'll ask howardsu to create a //depot/user/howardsu/truss branch
	to help isolate the truss/ptrace changes for review rather than
	complicating the DTrace review with them.

Affected files ...

.. //depot/projects/dtrace/src/usr.bin/truss/powerpc-fbsd.c#6 edit

Differences ...

==== //depot/projects/dtrace/src/usr.bin/truss/powerpc-fbsd.c#6 (text+ko) ====

@@ -41,7 +41,8 @@
  */
 
 #include <sys/types.h>
-#include <sys/ptrace.h>
+#include <sys/ioctl.h>
+#include <sys/pioctl.h>
 #include <sys/syscall.h>
 
 #include <machine/reg.h>
@@ -61,6 +62,7 @@
 #include "syscall.h"
 #include "extern.h"
 
+static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -110,18 +112,30 @@
 
 void
 powerpc_syscall_entry(struct trussinfo *trussinfo, int nargs) {
+  char buf[32];
   struct reg regs;
   void *args;
   int syscall_num;
   int i;
   unsigned int regargs;
   struct syscall *sc;
-  struct ptrace_io_desc iorequest;
 
-  cpid = trussinfo->tid;
+  if (fd == -1 || trussinfo->pid != cpid) {
+    sprintf(buf, "/proc/%d/regs", trussinfo->pid);
+    fd = open(buf, O_RDWR);
+    if (fd == -1) {
+      fprintf(trussinfo->outfile, "-- CANNOT OPEN REGISTERS --\n");
+      return;
+    }
+    cpid = trussinfo->pid;
+  }
 
   clear_fsc();
-  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
+  lseek(fd, 0L, 0);
+  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
+    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
+    return;
+  }
 
   /*
    * FreeBSD has two special kinds of system call redirctions --
@@ -163,13 +177,8 @@
 
   if (nargs > regargs) {
     memmove(&fsc.args[0], args, regargs * sizeof(fsc.args[0]));
-    
-	iorequest.piod_op = PIOD_READ_D;
-	iorequest.piod_offs = (void *)(regs.fixreg[1] + 8);
-	iorequest.piod_addr = &fsc.args[regargs];
-	iorequest.piod_len = (nargs - regargs) * sizeof(fsc.args[0]);
-	ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
-	if (iorequest.piod_len == 0) return;
+    lseek(Procfd, regs.fixreg[1] + 8, SEEK_SET);
+    read(Procfd, &fsc.args[regargs], (nargs - regargs) * sizeof(fsc.args[0]));
   } else {
     memmove(&fsc.args[0], args, nargs * sizeof(fsc.args[0]));
   }
@@ -211,7 +220,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -266,15 +275,28 @@
 long
 powerpc_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
+  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  cpid = trussinfo->tid;
-  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
+  if (fd == -1 || trussinfo->pid != cpid) {
+    sprintf(buf, "/proc/%d/regs", trussinfo->pid);
+    fd = open(buf, O_RDONLY);
+    if (fd == -1) {
+      fprintf(trussinfo->outfile, "-- CANNOT OPEN REGISTERS --\n");
+      return (-1);
+    }
+    cpid = trussinfo->pid;
+  }
 
+  lseek(fd, 0L, 0);
+  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
+    fprintf(trussinfo->outfile, "\n");
+    return (-1);
+  }
   retval = regs.fixreg[3];
   errorp = !!(regs.cr & 0x10000000);
 
@@ -310,7 +332,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }


More information about the p4-projects mailing list