svn commit: r200780 - head/usr.bin/truss

Jaakko Heinonen jh at FreeBSD.org
Mon Dec 21 17:38:13 UTC 2009


Author: jh
Date: Mon Dec 21 17:38:13 2009
New Revision: 200780
URL: http://svn.freebsd.org/changeset/base/200780

Log:
  Remove non-working special case for pipe(2) from amd64-fbsd32.c and
  i386-fbsd.c. Add pipe(2) to syscall table to decode it's pointer
  argument properly and re-add special handling for pipe(2) return value
  to print_syscall_ret().
  
  PR:		bin/120870
  Approved by:	trasz (mentor)

Modified:
  head/usr.bin/truss/amd64-fbsd32.c
  head/usr.bin/truss/i386-fbsd.c
  head/usr.bin/truss/syscalls.c

Modified: head/usr.bin/truss/amd64-fbsd32.c
==============================================================================
--- head/usr.bin/truss/amd64-fbsd32.c	Mon Dec 21 17:23:04 2009	(r200779)
+++ head/usr.bin/truss/amd64-fbsd32.c	Mon Dec 21 17:38:13 2009	(r200780)
@@ -315,19 +315,6 @@ amd64_fbsd32_syscall_exit(struct trussin
     }
   }
 
-  /*
-   * The pipe syscall returns its fds in two registers and has assembly glue
-   * to provide the libc API, so it cannot be handled like regular syscalls.
-   * The nargs check is so we don't have to do yet another strcmp on every
-   * syscall.
-   */
-  if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) {
-      fsc.nargs = 1;
-      fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
-      asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, (int)regs.r_rdx);
-      retval = 0;
-  }
-
   if (fsc.name != NULL &&
       (!strcmp(fsc.name, "freebsd32_execve") || !strcmp(fsc.name, "exit"))) {
 	trussinfo->curthread->in_syscall = 1;

Modified: head/usr.bin/truss/i386-fbsd.c
==============================================================================
--- head/usr.bin/truss/i386-fbsd.c	Mon Dec 21 17:23:04 2009	(r200779)
+++ head/usr.bin/truss/i386-fbsd.c	Mon Dec 21 17:38:13 2009	(r200780)
@@ -305,19 +305,6 @@ i386_syscall_exit(struct trussinfo *trus
     }
   }
 
-  /*
-   * The pipe syscall returns its fds in two registers and has assembly glue
-   * to provide the libc API, so it cannot be handled like regular syscalls.
-   * The nargs check is so we don't have to do yet another strcmp on every
-   * syscall.
-   */
-  if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) {
-      fsc.nargs = 1;
-      fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
-      asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, regs.r_edx);
-      retval = 0;
-  }
-
   if (fsc.name != NULL &&
       (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
 	trussinfo->curthread->in_syscall = 1;

Modified: head/usr.bin/truss/syscalls.c
==============================================================================
--- head/usr.bin/truss/syscalls.c	Mon Dec 21 17:23:04 2009	(r200779)
+++ head/usr.bin/truss/syscalls.c	Mon Dec 21 17:38:13 2009	(r200780)
@@ -242,6 +242,8 @@ struct syscall syscalls[] = {
 	  .args = { { Name | IN, 0 }, { Hex, 1 } } },
 	{ .name = "pathconf", .ret_type = 1, .nargs = 2,
 	  .args = { { Name | IN, 0 }, { Pathconf, 1 } } },
+	{ .name = "pipe", .ret_type = 1, .nargs = 1,
+	  .args = { { Ptr, 0 } } },
 	{ .name = "truncate", .ret_type = 1, .nargs = 3,
 	  .args = { { Name | IN, 0 }, { Int | IN, 1 }, { Quad | IN, 2 } } },
 	{ .name = "ftruncate", .ret_type = 1, .nargs = 3,
@@ -1137,6 +1139,12 @@ print_syscall_ret(struct trussinfo *trus
 	if (errorp) {
 		fprintf(trussinfo->outfile, " ERR#%ld '%s'\n", retval, strerror(retval));
 	} else {
+		/*
+		 * Because pipe(2) has a special assembly glue to provide the
+		 * libc API, we have to adjust retval.
+		 */
+		if (name != NULL && !strcmp(name, "pipe"))
+			retval = 0;
 		fprintf(trussinfo->outfile, " = %ld (0x%lx)\n", retval, retval);
 	}
 }


More information about the svn-src-all mailing list