]> granicus.if.org Git - strace/blobdiff - util.c
tests: simplify qual_inject-signal.test
[strace] / util.c
diff --git a/util.c b/util.c
index 02bb3bc1fcee31c13895f498919dc94a76ee47d8..a38f82174136d6adba193fab7bbb28ac7905e258 100644 (file)
--- a/util.c
+++ b/util.c
@@ -39,7 +39,9 @@
 # include <sys/xattr.h>
 #endif
 #include <sys/uio.h>
+#include <asm/unistd.h>
 
+#include "scno.h"
 #include "regs.h"
 #include "ptrace.h"
 
@@ -296,9 +298,9 @@ printxval_searchn(const struct xlat *xlat, size_t xlat_size, uint64_t val,
 int
 getllval(struct tcb *tcp, unsigned long long *val, int arg_no)
 {
-#if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
+#if SIZEOF_KERNEL_LONG_T > 4
 # ifndef current_klongsize
-       if (current_klongsize < SIZEOF_LONG) {
+       if (current_klongsize < SIZEOF_KERNEL_LONG_T) {
 #  if defined(AARCH64) || defined(POWERPC64)
                /* Align arg_no to the next even number. */
                arg_no = (arg_no + 1) & 0xe;
@@ -311,20 +313,7 @@ getllval(struct tcb *tcp, unsigned long long *val, int arg_no)
                *val = tcp->u_arg[arg_no];
                arg_no++;
        }
-#elif SIZEOF_LONG > 4
-#  error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
-#elif HAVE_STRUCT_TCB_EXT_ARG
-# ifndef current_klongsize
-       if (current_klongsize < SIZEOF_LONG_LONG) {
-               *val = ULONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
-               arg_no += 2;
-       } else
-# endif /* !current_klongsize */
-       {
-               *val = tcp->ext_arg[arg_no];
-               arg_no++;
-       }
-#else
+#else /* SIZEOF_KERNEL_LONG_T == 4 */
 # if defined __ARM_EABI__ || \
      defined LINUX_MIPSO32 || \
      defined POWERPC || \
@@ -462,7 +451,7 @@ printflags64(const struct xlat *xlat, uint64_t flags, const char *dflt)
 }
 
 void
-printaddr_klu(const kernel_ulong_t addr)
+printaddr(const kernel_ulong_t addr)
 {
        if (!addr)
                tprints("NULL");
@@ -472,7 +461,8 @@ printaddr_klu(const kernel_ulong_t addr)
 
 #define DEF_PRINTNUM(name, type) \
 bool                                                                   \
-printnum_ ## name(struct tcb *tcp, const long addr, const char *fmt)   \
+printnum_ ## name(struct tcb *const tcp, const kernel_ulong_t addr,    \
+                 const char *const fmt)                                \
 {                                                                      \
        type num;                                                       \
        if (umove_or_printaddr(tcp, addr, &num))                        \
@@ -483,9 +473,23 @@ printnum_ ## name(struct tcb *tcp, const long addr, const char *fmt)       \
        return true;                                                    \
 }
 
+#define DEF_PRINTNUM_ADDR(name, type) \
+bool                                                                   \
+printnum_addr_ ## name(struct tcb *tcp, const kernel_ulong_t addr)     \
+{                                                                      \
+       type num;                                                       \
+       if (umove_or_printaddr(tcp, addr, &num))                        \
+               return false;                                           \
+       tprints("[");                                                   \
+       printaddr(num);                                                 \
+       tprints("]");                                                   \
+       return true;                                                    \
+}
+
 #define DEF_PRINTPAIR(name, type) \
 bool                                                                   \
-printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt)  \
+printpair_ ## name(struct tcb *const tcp, const kernel_ulong_t addr,   \
+                  const char *const fmt)                               \
 {                                                                      \
        type pair[2];                                                   \
        if (umove_or_printaddr(tcp, addr, &pair))                       \
@@ -499,15 +503,17 @@ printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt)     \
 }
 
 DEF_PRINTNUM(int, int)
+DEF_PRINTNUM_ADDR(int, unsigned int)
 DEF_PRINTPAIR(int, int)
 DEF_PRINTNUM(short, short)
 DEF_PRINTNUM(int64, uint64_t)
+DEF_PRINTNUM_ADDR(int64, uint64_t)
 DEF_PRINTPAIR(int64, uint64_t)
 
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+#ifndef current_wordsize
 bool
-printnum_long_int(struct tcb *tcp, const long addr,
-                 const char *fmt_long, const char *fmt_int)
+printnum_long_int(struct tcb *const tcp, const kernel_ulong_t addr,
+                 const char *const fmt_long, const char *const fmt_int)
 {
        if (current_wordsize > sizeof(int)) {
                return printnum_int64(tcp, addr, fmt_long);
@@ -515,7 +521,29 @@ printnum_long_int(struct tcb *tcp, const long addr,
                return printnum_int(tcp, addr, fmt_int);
        }
 }
-#endif
+
+bool
+printnum_addr_long_int(struct tcb *tcp, const kernel_ulong_t addr)
+{
+       if (current_wordsize > sizeof(int)) {
+               return printnum_addr_int64(tcp, addr);
+       } else {
+               return printnum_addr_int(tcp, addr);
+       }
+}
+#endif /* !current_wordsize */
+
+#ifndef current_klongsize
+bool
+printnum_addr_klong_int(struct tcb *tcp, const kernel_ulong_t addr)
+{
+       if (current_klongsize > sizeof(int)) {
+               return printnum_addr_int64(tcp, addr);
+       } else {
+               return printnum_addr_int(tcp, addr);
+       }
+}
+#endif /* !current_klongsize */
 
 const char *
 sprinttime(time_t t)
@@ -626,9 +654,9 @@ string_quote(const char *instr, char *outstr, const unsigned int size,
                eol = 0x100; /* this can never match a char */
 
        usehex = 0;
-       if (xflag > 1)
+       if ((xflag > 1) || (style & QUOTE_FORCE_HEX)) {
                usehex = 1;
-       else if (xflag) {
+       else if (xflag) {
                /* Check for presence of symbol which require
                   to hex-quote the whole string. */
                for (i = 0; i < size; ++i) {
@@ -813,7 +841,7 @@ print_quoted_string(const char *str, unsigned int size,
  * If path length exceeds `n', append `...' to the output.
  */
 void
-printpathn(struct tcb *tcp, long addr, unsigned int n)
+printpathn(struct tcb *const tcp, const kernel_ulong_t addr, unsigned int n)
 {
        char path[PATH_MAX + 1];
        int nul_seen;
@@ -840,7 +868,7 @@ printpathn(struct tcb *tcp, long addr, unsigned int n)
 }
 
 void
-printpath(struct tcb *tcp, long addr)
+printpath(struct tcb *const tcp, const kernel_ulong_t addr)
 {
        /* Size must correspond to char path[] size in printpathn */
        printpathn(tcp, addr, PATH_MAX);
@@ -848,15 +876,15 @@ printpath(struct tcb *tcp, long addr)
 
 /*
  * Print string specified by address `addr' and length `len'.
- * If `len' == -1, set QUOTE_0_TERMINATED bit in `user_style'.
  * If `user_style' has QUOTE_0_TERMINATED bit set, treat the string
  * as a NUL-terminated string.
  * Pass `user_style' on to `string_quote'.
  * Append `...' to the output if either the string length exceeds `max_strlen',
- * or `len' != -1 and the string length exceeds `len'.
+ * or QUOTE_0_TERMINATED bit is set and the string length exceeds `len'.
  */
 void
-printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
+printstr_ex(struct tcb *const tcp, const kernel_ulong_t addr,
+           const kernel_ulong_t len, const unsigned int user_style)
 {
        static char *str = NULL;
        static char *outstr;
@@ -879,22 +907,16 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
                outstr = xmalloc(outstr_size);
        }
 
+       /* Fetch one byte more because string_quote may look one byte ahead. */
        size = max_strlen + 1;
-       if (len == -1) {
-               /*
-                * Treat as a NUL-terminated string: fetch one byte more
-                * because string_quote may look one byte ahead.
-                */
-               style |= QUOTE_0_TERMINATED;
+
+       if (size > len)
+               size = len;
+       if (style & QUOTE_0_TERMINATED)
                rc = umovestr(tcp, addr, size, str);
-       } else {
-               if (size > (unsigned long) len)
-                       size = (unsigned long) len;
-               if (style & QUOTE_0_TERMINATED)
-                       rc = umovestr(tcp, addr, size, str);
-               else
-                       rc = umoven(tcp, addr, size, str);
-       }
+       else
+               rc = umoven(tcp, addr, size, str);
+
        if (rc < 0) {
                printaddr(addr);
                return;
@@ -911,7 +933,7 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
        ellipsis = string_quote(str, outstr, size, style)
                   && len
                   && ((style & QUOTE_0_TERMINATED)
-                      || (unsigned long) len > max_strlen);
+                      || len > max_strlen);
 
        tprints(outstr);
        if (ellipsis)
@@ -919,9 +941,10 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
 }
 
 void
-dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
+dumpiov_upto(struct tcb *const tcp, const int len, const kernel_ulong_t addr,
+            kernel_ulong_t data_size)
 {
-#if SUPPORTED_PERSONALITIES > 1
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
        union {
                struct { uint32_t base; uint32_t len; } *iov32;
                struct { uint64_t base; uint64_t len; } *iov64;
@@ -936,7 +959,7 @@ dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
 #else
        struct iovec *iov;
 #define sizeof_iov sizeof(*iov)
-#define iov_iov_base(i) iov[i].iov_base
+#define iov_iov_base(i) ptr_to_kulong(iov[i].iov_base)
 #define iov_iov_len(i) iov[i].iov_len
 #endif
        int i;
@@ -951,7 +974,7 @@ dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
        }
        if (umoven(tcp, addr, size, iov) >= 0) {
                for (i = 0; i < len; i++) {
-                       unsigned long iov_len = iov_iov_len(i);
+                       kernel_ulong_t iov_len = iov_iov_len(i);
                        if (iov_len > data_size)
                                iov_len = data_size;
                        if (!iov_len)
@@ -959,8 +982,8 @@ dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
                        data_size -= iov_len;
                        /* include the buffer number to make it easy to
                         * match up the trace with the source */
-                       tprintf(" * %lu bytes in buffer %d\n", iov_len, i);
-                       dumpstr(tcp, (kernel_ureg_t) iov_iov_base(i), iov_len);
+                       tprintf(" * %" PRI_klu " bytes in buffer %d\n", iov_len, i);
+                       dumpstr(tcp, iov_iov_base(i), iov_len);
                }
        }
        free(iov);
@@ -971,7 +994,7 @@ dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
 }
 
 void
-dumpstr(struct tcb *tcp, long addr, int len)
+dumpstr(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
 {
        static int strsize = -1;
        static unsigned char *str;
@@ -1042,27 +1065,13 @@ dumpstr(struct tcb *tcp, long addr, int len)
        }
 }
 
-#ifdef HAVE_PROCESS_VM_READV
-/* C library supports this, but the kernel might not. */
 static bool process_vm_readv_not_supported = 0;
-#else
-
-/* Need to do this since process_vm_readv() is not yet available in libc.
+#ifndef HAVE_PROCESS_VM_READV
+/*
+ * Need to do this since process_vm_readv() is not yet available in libc.
  * When libc is be updated, only "static bool process_vm_readv_not_supported"
  * line should remain.
  */
-#if !defined(__NR_process_vm_readv)
-# if defined(I386)
-#  define __NR_process_vm_readv  347
-# elif defined(X86_64)
-#  define __NR_process_vm_readv  310
-# elif defined(POWERPC)
-#  define __NR_process_vm_readv  351
-# endif
-#endif
-
-#if defined(__NR_process_vm_readv)
-static bool process_vm_readv_not_supported = 0;
 /* Have to avoid duplicating with the C library headers. */
 static ssize_t strace_process_vm_readv(pid_t pid,
                 const struct iovec *lvec,
@@ -1073,24 +1082,26 @@ static ssize_t strace_process_vm_readv(pid_t pid,
 {
        return syscall(__NR_process_vm_readv, (long)pid, lvec, liovcnt, rvec, riovcnt, flags);
 }
-#define process_vm_readv strace_process_vm_readv
-#else
-static bool process_vm_readv_not_supported = 1;
-# define process_vm_readv(...) (errno = ENOSYS, -1)
-#endif
-
-#endif /* end of hack */
+# define process_vm_readv strace_process_vm_readv
+#endif /* !HAVE_PROCESS_VM_READV */
 
 static ssize_t
 vm_read_mem(const pid_t pid, void *const laddr,
-           const kernel_ureg_t raddr, const size_t len)
+           const kernel_ulong_t raddr, const size_t len)
 {
+       const unsigned long truncated_raddr = raddr;
+
+       if (raddr != (kernel_ulong_t) truncated_raddr) {
+               errno = EIO;
+               return -1;
+       }
+
        const struct iovec local = {
                .iov_base = laddr,
                .iov_len = len
        };
        const struct iovec remote = {
-               .iov_base = (void *) raddr,
+               .iov_base = (void *) truncated_raddr,
                .iov_len = len
        };
 
@@ -1102,7 +1113,7 @@ vm_read_mem(const pid_t pid, void *const laddr,
  * at address `addr' to our space at `our_addr'
  */
 int
-umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
+umoven(struct tcb *const tcp, kernel_ulong_t addr, unsigned int len,
        void *const our_addr)
 {
        char *laddr = our_addr;
@@ -1113,9 +1124,11 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
                char x[sizeof(long)];
        } u;
 
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-       if (current_wordsize < sizeof(addr))
-               addr &= (1ul << 8 * current_wordsize) - 1;
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+       if (current_wordsize < sizeof(addr)
+           && (addr & (~ (kernel_ulong_t) -1U))) {
+               return -1;
+       }
 #endif
 
        if (!process_vm_readv_not_supported) {
@@ -1123,7 +1136,7 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
                if ((unsigned int) r == len)
                        return 0;
                if (r >= 0) {
-                       error_msg("umoven: short read (%u < %u) @0x%lx",
+                       error_msg("umoven: short read (%u < %u) @0x%" PRI_klx,
                                  (unsigned int) r, len, addr);
                        return -1;
                }
@@ -1153,7 +1166,7 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
                n = addr & (sizeof(long) - 1);  /* residue */
                addr &= -sizeof(long);          /* aligned address */
                errno = 0;
-               u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+               u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
                switch (errno) {
                        case 0:
                                break;
@@ -1165,7 +1178,7 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
                                return -1;
                        default:
                                /* all the rest is strange and should be reported */
-                               perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
+                               perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
                                            pid, addr);
                                return -1;
                }
@@ -1178,7 +1191,7 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
        }
        while (len) {
                errno = 0;
-               u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+               u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
                switch (errno) {
                        case 0:
                                break;
@@ -1188,13 +1201,13 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
                        case EFAULT: case EIO: case EPERM:
                                /* address space is inaccessible */
                                if (nread) {
-                                       perror_msg("umoven: short read (%u < %u) @0x%lx",
+                                       perror_msg("umoven: short read (%u < %u) @0x%" PRI_klx,
                                                   nread, nread + len, addr - nread);
                                }
                                return -1;
                        default:
                                /* all the rest is strange and should be reported */
-                               perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
+                               perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
                                            pid, addr);
                                return -1;
                }
@@ -1210,7 +1223,7 @@ umoven(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len,
 }
 
 int
-umoven_or_printaddr(struct tcb *const tcp, const kernel_ureg_t addr,
+umoven_or_printaddr(struct tcb *const tcp, const kernel_ulong_t addr,
                    const unsigned int len, void *const our_addr)
 {
        if (!addr || !verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
@@ -1223,7 +1236,7 @@ umoven_or_printaddr(struct tcb *const tcp, const kernel_ureg_t addr,
 
 int
 umoven_or_printaddr_ignore_syserror(struct tcb *const tcp,
-                                   const kernel_ureg_t addr,
+                                   const kernel_ulong_t addr,
                                    const unsigned int len,
                                    void *const our_addr)
 {
@@ -1247,7 +1260,7 @@ umoven_or_printaddr_ignore_syserror(struct tcb *const tcp,
  * we never write past laddr[len-1]).
  */
 int
-umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *laddr)
+umovestr(struct tcb *const tcp, kernel_ulong_t addr, unsigned int len, char *laddr)
 {
        const unsigned long x01010101 = (unsigned long) 0x0101010101010101ULL;
        const unsigned long x80808080 = (unsigned long) 0x8080808080808080ULL;
@@ -1259,9 +1272,11 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
                char x[sizeof(long)];
        } u;
 
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-       if (current_wordsize < sizeof(addr))
-               addr &= (1ul << 8 * current_wordsize) - 1;
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+       if (current_wordsize < sizeof(addr)
+           && (addr & (~ (kernel_ulong_t) -1U))) {
+               return -1;
+       }
 #endif
 
        nread = 0;
@@ -1308,7 +1323,7 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
                                case EFAULT: case EIO:
                                        /* address space is inaccessible */
                                        if (nread) {
-                                               perror_msg("umovestr: short read (%d < %d) @0x%lx",
+                                               perror_msg("umovestr: short read (%d < %d) @0x%" PRI_klx,
                                                           nread, nread + len, addr - nread);
                                        }
                                        return -1;
@@ -1327,7 +1342,7 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
                n = addr & (sizeof(long) - 1);  /* residue */
                addr &= -sizeof(long);          /* aligned address */
                errno = 0;
-               u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+               u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
                switch (errno) {
                        case 0:
                                break;
@@ -1339,7 +1354,7 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
                                return -1;
                        default:
                                /* all the rest is strange and should be reported */
-                               perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
+                               perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
                                            pid, addr);
                                return -1;
                }
@@ -1356,7 +1371,7 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
 
        while (len) {
                errno = 0;
-               u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+               u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
                switch (errno) {
                        case 0:
                                break;
@@ -1366,13 +1381,13 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
                        case EFAULT: case EIO: case EPERM:
                                /* address space is inaccessible */
                                if (nread) {
-                                       perror_msg("umovestr: short read (%d < %d) @0x%lx",
+                                       perror_msg("umovestr: short read (%d < %d) @0x%" PRI_klx,
                                                   nread, nread + len, addr - nread);
                                }
                                return -1;
                        default:
                                /* all the rest is strange and should be reported */
-                               perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
+                               perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
                                           pid, addr);
                                return -1;
                }
@@ -1425,12 +1440,12 @@ umovestr(struct tcb *const tcp, kernel_ureg_t addr, unsigned int len, char *ladd
  */
 bool
 print_array(struct tcb *const tcp,
-           const kernel_ureg_t start_addr,
+           const kernel_ulong_t start_addr,
            const size_t nmemb,
            void *const elem_buf,
            const size_t elem_size,
            int (*const umoven_func)(struct tcb *,
-                                    kernel_ureg_t,
+                                    kernel_ulong_t,
                                     unsigned int,
                                     void *),
            bool (*const print_func)(struct tcb *,
@@ -1450,17 +1465,17 @@ print_array(struct tcb *const tcp,
        }
 
        const size_t size = nmemb * elem_size;
-       const kernel_ureg_t end_addr = start_addr + size;
+       const kernel_ulong_t end_addr = start_addr + size;
 
        if (end_addr <= start_addr || size / elem_size != nmemb) {
                printaddr(start_addr);
                return false;
        }
 
-       const kernel_ureg_t abbrev_end =
+       const kernel_ulong_t abbrev_end =
                (abbrev(tcp) && max_strlen < nmemb) ?
                        start_addr + elem_size * max_strlen : end_addr;
-       kernel_ureg_t cur;
+       kernel_ulong_t cur;
 
        for (cur = start_addr; cur < end_addr; cur += elem_size) {
                if (cur != start_addr)
@@ -1489,30 +1504,13 @@ print_array(struct tcb *const tcp,
        return cur >= end_addr;
 }
 
-kernel_ulong_t
-getarg_klu(struct tcb *tcp, int argn)
-{
-#if HAVE_STRUCT_TCB_EXT_ARG
-# ifndef current_klongsize
-       if (current_klongsize < sizeof(*tcp->ext_arg)) {
-               return tcp->u_arg[argn];
-       } else
-# endif /* !current_klongsize */
-       {
-               return tcp->ext_arg[argn];
-       }
-#else
-       return tcp->u_arg[argn];
-#endif
-}
-
 int
 printargs(struct tcb *tcp)
 {
        const int n = tcp->s_ent->nargs;
        int i;
        for (i = 0; i < n; ++i)
-               tprintf("%s%#" PRI_klx, i ? ", " : "", getarg_klu(tcp, i));
+               tprintf("%s%#" PRI_klx, i ? ", " : "", tcp->u_arg[i]);
        return RVAL_DECODED;
 }