Hi,

with kdump, file offsets are printed as two ints on 32-bit systems.
This diff should fix that and print a single long long. 

Tested on vax and hppa. Strange things is that hppa prints a trailing
int for lseek(2). Have to dig into that. This has nothing to do with
fancy mode, since it is also printed with -n.

Here a sample of the test I used:

#include <sys/mman.h>
#include <unistd.h>

main()
{
        mmap(1,2,3,4,5,0x8000000090000000LL);
        lseek(3,0x12345678abcdef12LL,1);
}

Hope I got the tricky sign-extends all covered.

        -Otto


Index: kdump.c
===================================================================
RCS file: /cvs/src/usr.bin/kdump/kdump.c,v
retrieving revision 1.51
diff -u -p -r1.51 kdump.c
--- kdump.c     20 Jun 2011 17:54:48 -0000      1.51
+++ kdump.c     21 Jun 2011 09:39:55 -0000
@@ -325,6 +325,40 @@ ioctldecode(u_long cmd)
        c = ',';                                        \
 } while (0);
 
+#ifdef __LP64__
+#define print_llnumber(i, n, c)        print_number(i, n, c)
+#elif _BYTE_ORDER == _LITTLE_ENDIAN
+#define print_llnumber(i, n, c) do {                   \
+       long long val = ((long long)*i) & 0xffffffff;   \
+       i++;                                            \
+       val |= ((long long)*i) << 32;                   \
+       i++;                                            \
+       n -= 2;                                         \
+       if (c)                                          \
+               (void)putchar(c);                       \
+       if (decimal)                                    \
+               (void)printf("%lld", val);              \
+       else                                            \
+               (void)printf("%#llx", val);             \
+       c = ',';                                        \
+} while (0);
+#else
+#define print_llnumber(i, n, c) do {                   \
+       long long val = ((long long)*i) << 32;          \
+       i++;                                            \
+       val |= ((long long)*i) & 0xffffffff;            \
+       i++;                                            \
+       n -= 2;                                         \
+       if (c)                                          \
+               (void)putchar(c);                       \
+       if (decimal)                                    \
+               (void)printf("%lld", val);              \
+       else                                            \
+               (void)printf("%#llx", val);             \
+       c = ',';                                        \
+} while (0);
+#endif
+
 static void
 ktrsyscall(struct ktr_syscall *ktr)
 {
@@ -484,7 +518,7 @@ ktrsyscall(struct ktr_syscall *ktr)
                                /* skip padding */
                                ap++;
                                narg--;
-                               print_number(ap, narg, c);
+                               print_llnumber(ap, narg, c);
                                (void)putchar(',');
                                whencename((int)*ap);
                                ap++;
@@ -526,6 +560,7 @@ ktrsyscall(struct ktr_syscall *ktr)
                                /* skip padding */
                                ap++;
                                narg--;
+                               print_llnumber(ap, narg, c);
                                break;
                        case SYS_mprotect:
                                print_number(ap, narg, c);
@@ -550,6 +585,7 @@ ktrsyscall(struct ktr_syscall *ktr)
                                /* skip padding */
                                ap++;
                                narg--;
+                               print_llnumber(ap, narg, c);
                                break;
                        case SYS_msync:
                                print_number(ap, narg, c);
@@ -588,6 +624,7 @@ ktrsyscall(struct ktr_syscall *ktr)
                                /* skip padding */
                                ap++;
                                narg--;
+                               print_llnumber(ap, narg, c);
                                break;
                        case SYS_recvmsg:
                        case SYS_sendmsg:
@@ -686,6 +723,7 @@ ktrsyscall(struct ktr_syscall *ktr)
                                /* skip padding */
                                ap++;
                                narg--;
+                               print_llnumber(ap, narg, c);
                                break;
                        case SYS_wait4:
                                print_number(ap, narg, c);

Reply via email to