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);