summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Heinonen <jh@FreeBSD.org>2010-02-08 15:53:28 +0000
committerJaakko Heinonen <jh@FreeBSD.org>2010-02-08 15:53:28 +0000
commit46e7e3ebbce5877e610f64d675b7a154f26481d9 (patch)
treeeb47e12b09ec4f72b9a4db2a34ddf9cd18ecd417
parent3ede63a7e391cf89805dd0cbafec82532720d893 (diff)
Notes
-rw-r--r--usr.bin/truss/amd64-fbsd32.c13
-rw-r--r--usr.bin/truss/i386-fbsd.c13
-rw-r--r--usr.bin/truss/syscalls.c8
3 files changed, 8 insertions, 26 deletions
diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-fbsd32.c
index eab841c96e83..3b1b88220b19 100644
--- a/usr.bin/truss/amd64-fbsd32.c
+++ b/usr.bin/truss/amd64-fbsd32.c
@@ -315,19 +315,6 @@ amd64_fbsd32_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
}
}
- /*
- * 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;
diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-fbsd.c
index 8500f32bf48e..3a81392b15f7 100644
--- a/usr.bin/truss/i386-fbsd.c
+++ b/usr.bin/truss/i386-fbsd.c
@@ -305,19 +305,6 @@ i386_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
}
}
- /*
- * 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;
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index f514649d8469..6541d9a6906c 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -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 *trussinfo, const char *name, int nargs,
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);
}
}