]> granicus.if.org Git - strace/blobdiff - util.c
tprint_iov*: change address argument type from unsigned long to kernel_ureg_t
[strace] / util.c
diff --git a/util.c b/util.c
index 9976c76e628afc3e3b1c7ed8cf77de4b926f76bb..482dafb2103c634ffb1ab486d25469641de65ae4 100644 (file)
--- a/util.c
+++ b/util.c
@@ -297,34 +297,29 @@ int
 getllval(struct tcb *tcp, unsigned long long *val, int arg_no)
 {
 #if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
-# if SUPPORTED_PERSONALITIES > 1
-#  ifdef X86_64
-       if (current_personality != 1) {
-#  else
-       if (current_wordsize > 4) {
-#  endif
-# endif
-               *val = tcp->u_arg[arg_no];
-               arg_no++;
-# if SUPPORTED_PERSONALITIES > 1
-       } else {
+# ifndef current_klongsize
+       if (current_klongsize < SIZEOF_LONG) {
 #  if defined(AARCH64) || defined(POWERPC64)
                /* Align arg_no to the next even number. */
                arg_no = (arg_no + 1) & 0xe;
 #  endif /* AARCH64 || POWERPC64 */
-               *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
+               *val = ULONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
                arg_no += 2;
+       } else
+# endif /* !current_klongsize */
+       {
+               *val = tcp->u_arg[arg_no];
+               arg_no++;
        }
-# endif /* SUPPORTED_PERSONALITIES > 1 */
 #elif SIZEOF_LONG > 4
 #  error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
 #elif HAVE_STRUCT_TCB_EXT_ARG
-# if SUPPORTED_PERSONALITIES > 1
-       if (current_personality == 1) {
-               *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
+# 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
+# endif /* !current_klongsize */
        {
                *val = tcp->ext_arg[arg_no];
                arg_no++;
@@ -347,7 +342,7 @@ getllval(struct tcb *tcp, unsigned long long *val, int arg_no)
        if (arg_no == 3)
                arg_no++;
 # endif /* __ARM_EABI__ || LINUX_MIPSO32 || POWERPC || XTENSA || SH */
-       *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
+       *val = ULONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
        arg_no += 2;
 #endif
 
@@ -467,12 +462,12 @@ printflags64(const struct xlat *xlat, uint64_t flags, const char *dflt)
 }
 
 void
-printaddr_ull(const unsigned long long addr)
+printaddr_klu(const kernel_ulong_t addr)
 {
        if (!addr)
                tprints("NULL");
        else
-               tprintf("%#llx", addr);
+               tprintf("%#" PRI_klx, addr);
 }
 
 #define DEF_PRINTNUM(name, type) \
@@ -1250,15 +1245,8 @@ umoven_or_printaddr_ignore_syserror(struct tcb *tcp, const long addr,
 int
 umovestr(struct tcb *tcp, long addr, unsigned int len, char *laddr)
 {
-#if SIZEOF_LONG == 4
-       const unsigned long x01010101 = 0x01010101ul;
-       const unsigned long x80808080 = 0x80808080ul;
-#elif SIZEOF_LONG == 8
-       const unsigned long x01010101 = 0x0101010101010101ul;
-       const unsigned long x80808080 = 0x8080808080808080ul;
-#else
-# error SIZEOF_LONG > 8
-#endif
+       const unsigned long x01010101 = (unsigned long) 0x0101010101010101ULL;
+       const unsigned long x80808080 = (unsigned long) 0x8080808080808080ULL;
 
        int pid = tcp->pid;
        unsigned int n, m, nread;
@@ -1432,8 +1420,8 @@ umovestr(struct tcb *tcp, long addr, unsigned int len, char *laddr)
  * - umoven_func has not returned false.
  */
 bool
-print_array(struct tcb *tcp,
-           const unsigned long start_addr,
+print_array(struct tcb *const tcp,
+           const kernel_ureg_t start_addr,
            const size_t nmemb,
            void *const elem_buf,
            const size_t elem_size,
@@ -1458,17 +1446,17 @@ print_array(struct tcb *tcp,
        }
 
        const size_t size = nmemb * elem_size;
-       const unsigned long end_addr = start_addr + size;
+       const kernel_ureg_t end_addr = start_addr + size;
 
        if (end_addr <= start_addr || size / elem_size != nmemb) {
                printaddr(start_addr);
                return false;
        }
 
-       const unsigned long abbrev_end =
+       const kernel_ureg_t abbrev_end =
                (abbrev(tcp) && max_strlen < nmemb) ?
                        start_addr + elem_size * max_strlen : end_addr;
-       unsigned long cur;
+       kernel_ureg_t cur;
 
        for (cur = start_addr; cur < end_addr; cur += elem_size) {
                if (cur != start_addr)
@@ -1497,33 +1485,20 @@ print_array(struct tcb *tcp,
        return cur >= end_addr;
 }
 
-long long
-getarg_ll(struct tcb *tcp, int argn)
-{
-#if HAVE_STRUCT_TCB_EXT_ARG
-# if SUPPORTED_PERSONALITIES > 1
-       if (current_personality == 1)
-               return (long) tcp->u_arg[argn];
-       else
-# endif
-       return (long long) tcp->ext_arg[argn];
-#else
-       return (long) tcp->u_arg[argn];
-#endif
-}
-
-unsigned long long
-getarg_ull(struct tcb *tcp, int argn)
+kernel_ulong_t
+getarg_klu(struct tcb *tcp, int argn)
 {
 #if HAVE_STRUCT_TCB_EXT_ARG
-# if SUPPORTED_PERSONALITIES > 1
-       if (current_personality == 1)
-               return (unsigned long) tcp->u_arg[argn];
-       else
-# endif
-       return (unsigned long long) tcp->ext_arg[argn];
+# 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 (unsigned long) tcp->u_arg[argn];
+       return tcp->u_arg[argn];
 #endif
 }
 
@@ -1533,7 +1508,7 @@ printargs(struct tcb *tcp)
        const int n = tcp->s_ent->nargs;
        int i;
        for (i = 0; i < n; ++i)
-               tprintf("%s%#llx", i ? ", " : "", getarg_ull(tcp, i));
+               tprintf("%s%#" PRI_klx, i ? ", " : "", getarg_klu(tcp, i));
        return RVAL_DECODED;
 }