summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/truss/syscalls.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index 6bae74e..db9b29b 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -73,11 +73,19 @@ struct syscall syscalls[] = {
{ "readlink", 1, 3,
{ { String, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 }}},
{ "lseek", 2, 3,
+#ifdef __LP64__
+ { { Int, 0 }, {Quad, 2 }, { Whence, 3 }}},
+#else
{ { Int, 0 }, {Quad, 2 }, { Whence, 4 }}},
+#endif
{ "linux_lseek", 2, 3,
{ { Int, 0 }, {Int, 1 }, { Whence, 2 }}},
{ "mmap", 2, 6,
+#ifdef __LP64__
+ { { Ptr, 0 }, {Int, 1}, {Mprot, 2}, {Mmapflags, 3}, {Int, 4}, {Quad, 5}}},
+#else
{ { Ptr, 0 }, {Int, 1}, {Mprot, 2}, {Mmapflags, 3}, {Int, 4}, {Quad, 6}}},
+#endif
{ "mprotect", 1, 3,
{ { Ptr, 0 }, {Int, 1}, {Mprot, 2}}},
{ "open", 1, 3,
@@ -234,22 +242,6 @@ get_string(int procfd, void *offset, int max) {
/*
- * Gag. This is really unportable. Multiplication is more portable.
- * But slower, from the code I saw.
- */
-
-static long long
-make_quad(unsigned long p1, unsigned long p2) {
- union {
- long long ll;
- unsigned long l[2];
- } t;
- t.l[0] = p1;
- t.l[1] = p2;
- return t.ll;
-}
-
-/*
* Remove a trailing '|' in a string, useful for fixup after decoding
* a "flags" argument.
*/
@@ -327,16 +319,19 @@ print_arg(int fd, struct syscall_args *sc, unsigned long *args, long retval) {
tmp2 += sprintf(tmp2, "]");
}
break;
+#ifdef __LP64__
+ case Quad:
+ asprintf(&tmp, "0x%lx", args[sc->offset]);
+ break;
+#else
case Quad:
{
- unsigned long long t;
- unsigned long l1, l2;
- l1 = args[sc->offset];
- l2 = args[sc->offset+1];
- t = make_quad(l1, l2);
- asprintf(&tmp, "0x%llx", t);
+ unsigned long long ll;
+ ll = *(unsigned long long *)(args + sc->offset);
+ asprintf(&tmp, "0x%llx", ll);
break;
}
+#endif
case Ptr:
asprintf(&tmp, "0x%lx", args[sc->offset]);
break;
OpenPOWER on IntegriCloud