Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Jul 2006 12:06:25 GMT
From:      Howard Su <howardsu@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 102783 for review
Message-ID:  <200607301206.k6UC6PAN046771@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=102783

Change 102783 by howardsu@su_vm on 2006/07/30 12:05:29

	Remove the dependency of procfs. Convert it to use 
	the new ptrace(2) interface.

Affected files ...

.. //depot/projects/dtrace/src/usr.bin/truss/alpha-fbsd.c#3 edit
.. //depot/projects/dtrace/src/usr.bin/truss/amd64-fbsd.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/extern.h#3 edit
.. //depot/projects/dtrace/src/usr.bin/truss/i386-fbsd.c#5 edit
.. //depot/projects/dtrace/src/usr.bin/truss/i386-linux.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/ia64-fbsd.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/main.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/powerpc-fbsd.c#3 edit
.. //depot/projects/dtrace/src/usr.bin/truss/setup.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/sparc64-fbsd.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/syscall.h#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/syscalls.c#4 edit
.. //depot/projects/dtrace/src/usr.bin/truss/truss.1#3 edit
.. //depot/projects/dtrace/src/usr.bin/truss/truss.h#4 edit

Differences ...

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

@@ -45,8 +45,7 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
+#include <sys/ptrace.h>
 #include <sys/syscall.h>
 
 #include <machine/reg.h>
@@ -65,7 +64,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -115,30 +113,17 @@
 
 void
 alpha_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   int syscall_num;
   int i;
   unsigned int parm_offset;
   struct syscall *sc;
   int indir = 0;	/* indirect system call */
+  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();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   parm_offset = regs.r_regs[R_SP] + sizeof(int);
 
   /*
@@ -185,8 +170,13 @@
 	 * on the stack, as is normal for other processors.
 	 * The fall-through for all of these is deliberate!!!
 	 */
-	lseek(Procfd, regs.r_regs[R_SP], SEEK_SET);
-	read(fd, &fsc.args[6], (nargs - 6) * sizeof(fsc.args[0]));
+	iorequest.piod_op = PIOD_READ_D;
+	iorequest.piod_offs = (void *)regs.r_regs[R_SP];
+	iorequest.piod_addr = &fsc.args[6];
+	iorequest.piod_len = (nargs - 6) * sizeof(unsigned long);
+	ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
+	if (iorequest.piod_len == 0) return;
+	break;
   case 6:	fsc.args[5] = regs.r_regs[R_A5];
   case 5:	fsc.args[4] = regs.r_regs[R_A4];
   case 4:	fsc.args[3] = regs.r_regs[R_A3];
@@ -238,7 +228,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -293,28 +283,15 @@
 long
 alpha_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
-  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->tid;
 
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "\n");
-    return (-1);
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   retval = regs.r_regs[R_V0];
   errorp = !!(regs.r_regs[R_A3]);
 
@@ -342,7 +319,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

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

@@ -43,9 +43,8 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
 #include <sys/syscall.h>
+#include <sys/ptrace.h>
 
 #include <machine/reg.h>
 #include <machine/psl.h>
@@ -63,7 +62,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -113,28 +111,15 @@
 
 void
 amd64_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   int syscall_num;
   int i, reg;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->pid;
 
   clear_fsc();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
 
   /*
    * FreeBSD has two special kinds of system call redirctions --
@@ -181,9 +166,14 @@
     }
   }
   if (nargs > i) {
-    lseek(Procfd, regs.r_rsp + sizeof(register_t), SEEK_SET);
-    if (read(Procfd, &fsc.args[i], (nargs-i) * sizeof(register_t)) == -1)
-      return;
+    struct ptrace_io_desc iorequest;
+  	iorequest.piod_op = PIOD_READ_D;
+    iorequest.piod_offs = (void *)(regs.r_rsp + sizeof(register_t));
+	iorequest.piod_addr = &fsc.args[i];
+	iorequest.piod_len = (nargs - i) * sizeof(register_t);
+	ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
+	if (iorequest.piod_len == 0)
+		return;
   }
 
   sc = get_syscall(fsc.name);
@@ -223,7 +213,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -279,28 +269,15 @@
 long
 amd64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
-  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->pid;
 
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return (-1);
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   retval = regs.r_rax;
   errorp = !!(regs.r_rflags & PSL_C);
 
@@ -328,7 +305,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

==== //depot/projects/dtrace/src/usr.bin/truss/extern.h#3 (text+ko) ====

@@ -32,8 +32,9 @@
  */
 
 extern int setup_and_wait(char **);
-extern int start_tracing(int, int, int, int);
+extern int start_tracing(int); 
 extern void restore_proc(int);
+extern void waitevent(struct trussinfo *);
 extern const char *ioctlname(register_t val);
 extern char *strsig(int sig);
 #ifdef __alpha__
@@ -63,4 +64,3 @@
 extern long sparc64_syscall_exit(struct trussinfo *, int);
 #endif
 
-extern int Procfd;

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

@@ -43,9 +43,8 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
 #include <sys/syscall.h>
+#include <sys/ptrace.h>
 
 #include <machine/reg.h>
 #include <machine/psl.h>
@@ -63,7 +62,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -113,29 +111,16 @@
 
 void
 i386_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   int syscall_num;
   int i;
   unsigned int parm_offset;
   struct syscall *sc = NULL;
-
-  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;
-  }
+  struct ptrace_io_desc iorequest;
+  cpid = trussinfo->tid;
 
   clear_fsc();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   parm_offset = regs.r_esp + sizeof(int);
 
   /*
@@ -146,14 +131,12 @@
   syscall_num = regs.r_eax;
   switch (syscall_num) {
   case SYS_syscall:
-    lseek(Procfd, parm_offset, SEEK_SET);
-    read(Procfd, &syscall_num, sizeof(int));
-    parm_offset += sizeof(int);
+    syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
+	parm_offset += sizeof(int);
     break;
   case SYS___syscall:
-    lseek(Procfd, parm_offset, SEEK_SET);
-    read(Procfd, &syscall_num, sizeof(int));
-    parm_offset += sizeof(quad_t);
+    syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
+	parm_offset += sizeof(quad_t);
     break;
   }
 
@@ -171,14 +154,18 @@
   {
     trussinfo->in_fork = 1;
   }
-
+  
   if (nargs == 0)
     return;
 
   fsc.args = malloc((1+nargs) * sizeof(unsigned long));
-  lseek(Procfd, parm_offset, SEEK_SET);
-  if (read(Procfd, fsc.args, nargs * sizeof(unsigned long)) == -1)
-    return;
+  iorequest.piod_op = PIOD_READ_D;
+  iorequest.piod_offs = (void *)parm_offset;
+  iorequest.piod_addr = fsc.args;
+  iorequest.piod_len = nargs * sizeof(unsigned long);
+  ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
+  if (iorequest.piod_len == 0)
+ 	return;
 
   if (fsc.name)
   	sc = get_syscall(fsc.name);
@@ -218,7 +205,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -274,28 +261,16 @@
 long
 i386_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
-  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->pid;
+
+  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 (-1);
-  }
   retval = regs.r_eax;
   errorp = !!(regs.r_eflags & PSL_C);
 
@@ -323,7 +298,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

==== //depot/projects/dtrace/src/usr.bin/truss/i386-linux.c#4 (text+ko) ====

@@ -41,8 +41,7 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
+#include <sys/ptrace.h>
 
 #include <machine/reg.h>
 #include <machine/psl.h>
@@ -60,7 +59,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "linux_syscalls.h"
@@ -108,28 +106,16 @@
 
 void
 i386_linux_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   int syscall_num;
   int i;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->tid;
 
   clear_fsc();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   syscall_num = regs.r_eax;
 
   fsc.number = syscall_num;
@@ -200,7 +186,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -264,28 +250,15 @@
 long
 i386_linux_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
-  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->pid;
 
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "\n");
-    return (-1);
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   retval = regs.r_eax;
   errorp = !!(regs.r_eflags & PSL_C);
 
@@ -313,7 +286,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

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

@@ -43,8 +43,7 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
+#include <sys/ptrace.h>
 #include <sys/syscall.h>
 
 #include <machine/reg.h>
@@ -62,7 +61,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -112,29 +110,16 @@
 
 void
 ia64_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   int syscall_num;
   int i;
   unsigned long *parm_offset;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->tid;
 
   clear_fsc();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   parm_offset = &regs.r_scratch.gr16;
 
   /*
@@ -204,7 +189,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -260,28 +245,15 @@
 long
 ia64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
 {
-  char buf[32];
   struct reg regs;
   long retval;
   int i;
   int errorp;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->tid;
 
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return (-1);
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
   retval = regs.r_scratch.gr8;
   errorp = (regs.r_scratch.gr10 != 0) ? 1 : 0;
 
@@ -309,7 +281,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

==== //depot/projects/dtrace/src/usr.bin/truss/main.c#4 (text+ko) ====

@@ -39,11 +39,10 @@
  */
 
 #include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
+#include <sys/sysctl.h>
 
 #include <ctype.h>
 #include <err.h>
@@ -59,12 +58,7 @@
 #include "truss.h"
 #include "extern.h"
 
-/*
- * It's difficult to parameterize this because it must be
- * accessible in a signal handler.
- */
-
-int Procfd;
+#define MAXARGS 5
 
 static void
 usage(void)
@@ -119,18 +113,18 @@
 set_etype(struct trussinfo *trussinfo)
 {
 	struct ex_types *funcs;
-	char etype[24];
 	char progt[32];
-	int fd;
+	int len = sizeof(progt);
+	int mib[4];
+	int error;
 
-	sprintf(etype, "/proc/%d/etype", trussinfo->pid);
-	if ((fd = open(etype, O_RDONLY)) == -1) {
-		strcpy(progt, "FreeBSD a.out");
-	} else {
-		int len = read(fd, progt, sizeof(progt));
-		progt[len-1] = '\0';
-		close(fd);
-	}
+	mib[0] = CTL_KERN;
+	mib[1] = KERN_PROC;
+	mib[2] = KERN_PROC_SV_NAME;
+	mib[3] = trussinfo->pid;
+	error = sysctl(mib, 4, progt, &len, NULL, 0);
+	if (error != 0)
+		err(1, "can not sysctl");
 
 	for (funcs = ex_types; funcs->type; funcs++)
 		if (!strcmp(funcs->type, progt))
@@ -167,14 +161,11 @@
 	int c;
 	int i;
 	char **command;
-	struct procfs_status pfs;
 	struct ex_types *funcs;
-	int in_exec, sigexit, initial_open;
+	int sigexit, initial_open;
 	char *fname;
 	struct trussinfo *trussinfo;
 	char *signame;
-
-	in_exec = 0;
 	sigexit = 0;
 	fname = NULL;
 	initial_open = 1;
@@ -245,6 +236,7 @@
 		signal(SIGTERM, SIG_IGN);
 		signal(SIGQUIT, SIG_IGN);
 	} else {
+	  	start_tracing(trussinfo->pid);
 		signal(SIGINT, restore_proc);
 		signal(SIGTERM, restore_proc);
 		signal(SIGQUIT, restore_proc);
@@ -255,20 +247,11 @@
 	 * At this point, if we started the process, it is stopped waiting to
 	 * be woken up, either in exit() or in execve().
 	 */
+START_TRACE:
+	funcs = set_etype(trussinfo);
 
-START_TRACE:
-	Procfd = start_tracing(
-	    trussinfo->pid, initial_open,
-	    S_EXEC | S_SCE | S_SCX | S_CORE | S_EXIT |
-	    ((trussinfo->flags & NOSIGS) ? 0 : S_SIG),
-	    ((trussinfo->flags & FOLLOWFORKS) ? PF_FORK : 0));
 	initial_open = 0;
-	if (Procfd == -1)
-		return (0);
 
-	pfs.why = 0;
-
-	funcs = set_etype(trussinfo);
 	/*
 	 * At this point, it's a simple loop, waiting for the process to
 	 * stop, finding out why, printing out why, and then continuing it.
@@ -278,42 +261,27 @@
 	clock_gettime(CLOCK_REALTIME, &trussinfo->start_time);
 
 	do {
-		int val = 0;
-		struct timespec timediff;
-
-		if (ioctl(Procfd, PIOCWAIT, &pfs) == -1)
-			warn("PIOCWAIT top of loop");
-		else {
-			switch(i = pfs.why) {
+			struct timespec timediff;
+			waitevent(trussinfo);
+			switch(i = trussinfo->pr_why) {
 			case S_SCE:
-				funcs->enter_syscall(trussinfo, pfs.val);
+				funcs->enter_syscall(trussinfo, MAXARGS);
 				clock_gettime(CLOCK_REALTIME,
 				    &trussinfo->before);
 				break;
 			case S_SCX:
 				clock_gettime(CLOCK_REALTIME,
 				    &trussinfo->after);
-				/*
-				 * This is so we don't get two messages for
-				 * an exec -- one for the S_EXEC, and one for
-				 * the syscall exit.  It also, conveniently,
-				 * ensures that the first message printed out
-				 * isn't the return-from-syscall used to
-				 * create the process.
-				 */
-				if (in_exec) {
-					in_exec = 0;
-					break;
-				}
 
 				if (trussinfo->in_fork &&
-				    (trussinfo->flags & FOLLOWFORKS)) {
+				    (trussinfo->flags & FOLLOWFORKS) 
+					) {
 					int childpid;
 
 					trussinfo->in_fork = 0;
 					childpid =
 					    funcs->exit_syscall(trussinfo,
-						pfs.val);
+						trussinfo->pr_data);
 
 					/*
 					 * Fork a new copy of ourself to trace
@@ -326,7 +294,7 @@
 					}
 					break;
 				}
-				funcs->exit_syscall(trussinfo, pfs.val);
+				funcs->exit_syscall(trussinfo, MAXARGS);
 				break;
 			case S_SIG:
 				if (trussinfo->flags & FOLLOWFORKS)
@@ -346,12 +314,12 @@
 					    (long)timediff.tv_sec,
 					    timediff.tv_nsec);
 				}
-				signame = strsig(pfs.val);
+				signame = strsig(trussinfo->pr_data);
 				fprintf(trussinfo->outfile,
-				    "SIGNAL %lu (%s)\n", pfs.val,
+				    "SIGNAL %u (%s)\n", trussinfo->pr_data,
 				    signame == NULL ? "?" : signame);
 				free(signame);
-				sigexit = pfs.val;
+				sigexit = trussinfo->pr_data;
 				break;
 			case S_EXIT:
 				if (trussinfo->flags & FOLLOWFORKS)
@@ -371,25 +339,12 @@
 				    (long)timediff.tv_sec, timediff.tv_nsec);
 				}
 				fprintf(trussinfo->outfile,
-				    "process exit, rval = %lu\n", pfs.val);
+				    "process exit, rval = %u\n", trussinfo->pr_data);
 				break;
-			case S_EXEC:
-				funcs = set_etype(trussinfo);
-				in_exec = 1;
-				break;
 			default:
-				fprintf(trussinfo->outfile,
-				    "Process stopped because of:  %d\n", i);
 				break;
-			}
 		}
-		if (ioctl(Procfd, PIOCCONT, val) == -1) {
-			if (kill(trussinfo->pid, 0) == -1 && errno == ESRCH)
-				break;
-			else
-				warn("PIOCCONT");
-		}
-	} while (pfs.why != S_EXIT);
+	} while (trussinfo->pr_why != S_EXIT);
 	fflush(trussinfo->outfile);
 	if (sigexit) {
 		struct rlimit rlp;

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

@@ -41,8 +41,7 @@
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
+#include <sys/ptrace.h>
 #include <sys/syscall.h>
 
 #include <machine/reg.h>
@@ -62,7 +61,6 @@
 #include "syscall.h"
 #include "extern.h"
 
-static int fd = -1;
 static int cpid = -1;
 
 #include "syscalls.h"
@@ -112,7 +110,6 @@
 
 void
 powerpc_syscall_entry(struct trussinfo *trussinfo, int nargs) {
-  char buf[32];
   struct reg regs;
   void *args;
   int syscall_num;
@@ -120,22 +117,10 @@
   unsigned int regargs;
   struct syscall *sc;
 
-  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;
-  }
+  cpid = trussinfo->tid;
 
   clear_fsc();
-  lseek(fd, 0L, 0);
-  if (read(fd, &regs, sizeof(regs)) != sizeof(regs)) {
-    fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
-    return;
-  }
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
 
   /*
    * FreeBSD has two special kinds of system call redirctions --
@@ -177,8 +162,13 @@
 
   if (nargs > regargs) {
     memmove(&fsc.args[0], args, regargs * sizeof(fsc.args[0]));
-    lseek(Procfd, regs.fixreg[1] + 8, SEEK_SET);
-    read(Procfd, &fsc.args[regargs], (nargs - 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;
   } else {
     memmove(&fsc.args[0], args, nargs * sizeof(fsc.args[0]));
   }
@@ -220,7 +210,7 @@
 	      i < (fsc.nargs - 1) ? "," : "");
 #endif
       if (sc && !(sc->args[i].type & OUT)) {
-	fsc.s_args[i] = print_arg(Procfd, &sc->args[i], fsc.args, 0, trussinfo);
+	fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
       }
     }
 #if DEBUG
@@ -275,28 +265,15 @@
 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;
 
-  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;
-  }
+  cpid = trussinfo->tid;
+  ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0);
 
-  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);
 
@@ -332,7 +309,7 @@
 	if (errorp)
 	  asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
 	else
-	  temp = print_arg(Procfd, &sc->args[i], fsc.args, retval, trussinfo);
+	  temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
 	fsc.s_args[i] = temp;
       }
     }

==== //depot/projects/dtrace/src/usr.bin/truss/setup.c#4 (text+ko) ====

@@ -38,11 +38,13 @@
  */
 
 #include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/pioctl.h>
 #include <sys/wait.h>
+#include <sys/ptrace.h>
+#include <sys/types.h>
+#include <signal.h>
 
 #include <err.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <stdio.h>
@@ -51,11 +53,30 @@
 #include <time.h>
 #include <unistd.h>
 
+#include <machine/reg.h>
+
 #include "truss.h"
 #include "extern.h"
 
-static int evflags = 0;
+
+static siginfo_t myinfo;
+
+static void handler(int si __unused, siginfo_t *info, void *uap __unused)
+{
+	memcpy(&myinfo, info, sizeof(myinfo));
+}
 
+static void
+installhandler(void)

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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