On Mon, Jun 27, 2011 at 08:39:19AM +0200, Otto Moerbeek wrote: > On Tue, Jun 21, 2011 at 11:49:37AM +0200, Otto Moerbeek wrote: > > > 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. > > Did anybody test or review this? I like to move on...
OK, I decide to move on anyway. So here's a new diff, which restrcutures the whole ugly switch. Both in fancy and non-fancy mode padding will be skipped and offset_t parameters will be printed as long longs. This really needs eyes and testing on various platforms. -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 1 Jul 2011 11:37:52 -0000 @@ -110,6 +110,10 @@ static char *ptrace_ops[] = { "PT_KILL", "PT_ATTACH", "PT_DETACH", "PT_IO", }; +static int narg; +static register_t *ap; +static char sep; + static int fread_tail(void *, size_t, size_t); static void dumpheader(struct ktr_header *); static void ktrcsw(struct ktr_csw *); @@ -313,23 +317,107 @@ ioctldecode(u_long cmd) printf(")"); } -#define print_number(i, n, c) do { \ - if (c) \ - (void)putchar(c); \ - if (decimal) \ - (void)printf("%ld", (long)*i); \ - else \ - (void)printf("%#lx", (long)*i); \ - i++; \ - n--; \ - c = ','; \ -} while (0); +static void +ptracedecode(void) +{ + if (*ap >= 0 && *ap < + sizeof(ptrace_ops) / sizeof(ptrace_ops[0])) + (void)printf("%s", ptrace_ops[*ap]); + else switch(*ap) { +#ifdef PT_GETFPREGS + case PT_GETFPREGS: + (void)printf("PT_GETFPREGS"); + break; +#endif + case PT_GETREGS: + (void)printf("PT_GETREGS"); + break; +#ifdef PT_SETFPREGS + case PT_SETFPREGS: + (void)printf("PT_SETFPREGS"); + break; +#endif + case PT_SETREGS: + (void)printf("PT_SETREGS"); + break; +#ifdef PT_STEP + case PT_STEP: + (void)printf("PT_STEP"); + break; +#endif +#ifdef PT_WCOOKIE + case PT_WCOOKIE: + (void)printf("PT_WCOOKIE"); + break; +#endif + default: + (void)printf("%ld", (long)*ap); + break; + } + sep = ','; + ap++; + narg--; +} + +static void +pn(void (*f)(int)) +{ + if (sep) + (void)putchar(sep); + if (fancy && f != NULL) + f((int)*ap); + else if (decimal) + (void)printf("%ld", (long)*ap); + else + (void)printf("%#lx", (long)*ap); + ap++; + narg--; + sep = ','; +} + +#ifdef __LP64__ +#define plln() pn(NULL) +#elif _BYTE_ORDER == _LITTLE_ENDIAN +static void +plln(void) +{ + long long val = ((long long)*ap) & 0xffffffff; + ap++; + val |= ((long long)*ap) << 32; + ap++; + narg -= 2; + if (sep) + (void)putchar(sep); + if (decimal) + (void)printf("%lld", val); + else + (void)printf("%#llx", val); + sep = ','; +} +#else +static void +plln(void) +{ + long long val = ((long long)*ap) << 32; + ap++; + val |= ((long long)*ap) & 0xffffffff; + ap++; + narg -= 2; + if (sep) + (void)putchar(sep); + if (decimal) + (void)printf("%lld", val); + else + (void)printf("%#llx", val); + sep = ','; +} +#endif static void ktrsyscall(struct ktr_syscall *ktr) { - int narg = ktr->ktr_argsize / sizeof(register_t); - register_t *ap; + narg = ktr->ktr_argsize / sizeof(register_t); + sep = '\0'; if (ktr->ktr_code >= current->nsysnames || ktr->ktr_code < 0) (void)printf("[%d]", ktr->ktr_code); @@ -337,377 +425,254 @@ ktrsyscall(struct ktr_syscall *ktr) (void)printf("%s", current->sysnames[ktr->ktr_code]); ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall)); (void)putchar('('); - if (narg) { - char c = '\0'; - if (fancy) { - switch (ktr->ktr_code) { - case SYS_ioctl: { - const char *cp; - - if (decimal) - (void)printf("%ld", (long)*ap); - else - (void)printf("%#lx", (long)*ap); - ap++; - narg--; - if ((cp = ioctlname(*ap)) != NULL) - (void)printf(",%s", cp); - else - ioctldecode(*ap); - c = ','; - ap++; - narg--; - break; - } - case SYS___sysctl: { - int *np, n; - - n = ap[1]; - if (n > CTL_MAXNAME) - n = CTL_MAXNAME; - np = (int *)(ap + 6); - for (; n--; np++) { - if (c) - putchar(c); - printf("%d", *np); - c = '.'; - } - - c = ','; - ap += 2; - narg -= 2; - break; - } - case SYS_ptrace: - if (*ap >= 0 && *ap < - sizeof(ptrace_ops) / sizeof(ptrace_ops[0])) - (void)printf("%s", ptrace_ops[*ap]); - else switch(*ap) { -#ifdef PT_GETFPREGS - case PT_GETFPREGS: - (void)printf("PT_GETFPREGS"); - break; -#endif - case PT_GETREGS: - (void)printf("PT_GETREGS"); - break; -#ifdef PT_SETFPREGS - case PT_SETFPREGS: - (void)printf("PT_SETFPREGS"); - break; -#endif - case PT_SETREGS: - (void)printf("PT_SETREGS"); - break; -#ifdef PT_STEP - case PT_STEP: - (void)printf("PT_STEP"); - break; -#endif -#ifdef PT_WCOOKIE - case PT_WCOOKIE: - (void)printf("PT_WCOOKIE"); - break; -#endif - default: - (void)printf("%ld", (long)*ap); - break; - } - c = ','; - ap++; - narg--; - break; - case SYS_access: - print_number(ap, narg, c); - (void)putchar(','); - accessmodename((int)*ap); - ap++; - narg--; - break; - case SYS_chmod: - case SYS_fchmod: - print_number(ap, narg, c); - (void)putchar(','); - modename((int)*ap); - ap++; - narg--; - break; - case SYS_fcntl: { - int cmd; - int arg; - print_number(ap, narg, c); - cmd = *ap; - arg = *++ap; - (void)putchar(','); - fcntlcmdname(cmd, arg, decimal); - ap++; - narg -= 2; - break; - } - case SYS_flock: - print_number(ap, narg, c); - (void)putchar(','); - flockname((int)*ap); - ap++; - narg--; - break; - case SYS_getrlimit: - case SYS_setrlimit: - rlimitname((int)*ap); - ap++; - narg--; - c = ','; - break; - case SYS_getsockopt: - case SYS_setsockopt: - print_number(ap, narg, c); - (void)putchar(','); - sockoptlevelname((int)*ap, decimal); - if ((int)*ap == SOL_SOCKET) { - ap++; - narg--; - (void)putchar(','); - sockoptname((int)*ap); - } - ap++; - narg--; - break; - case SYS_kill: - print_number(ap, narg, c); - (void)putchar(','); - signame((int)*ap); - ap++; - narg--; - break; - case SYS_lseek: - print_number(ap, narg, c); - /* skip padding */ - ap++; - narg--; - print_number(ap, narg, c); - (void)putchar(','); - whencename((int)*ap); - ap++; - narg--; - break; - case SYS_madvise: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - madvisebehavname((int)*ap); - ap++; - narg--; - break; - case SYS_minherit: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - minheritname((int)*ap); - ap++; - narg--; - break; - case SYS_mlockall: - mlockallname((int)*ap); - ap++; - narg--; - break; - case SYS_mmap: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - mmapprotname((int)*ap); - (void)putchar(','); - ap++; - narg--; - mmapflagsname((int)*ap); - ap++; - narg--; - print_number(ap, narg, c); - /* skip padding */ - ap++; - narg--; - break; - case SYS_mprotect: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - mmapprotname((int)*ap); - ap++; - narg--; - break; - case SYS_mquery: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - mmapprotname((int)*ap); - ap++; - narg--; - (void)putchar(','); - mmapflagsname((int)*ap); - ap++; - narg--; - print_number(ap, narg, c); - /* skip padding */ - ap++; - narg--; - break; - case SYS_msync: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - msyncflagsname((int)*ap); - ap++; - narg--; - break; - case SYS_msgctl: - print_number(ap, narg, c); - (void)putchar(','); - shmctlname((int)*ap); - ap++; - narg--; - break; - case SYS_open: { - int flags; - int mode; - print_number(ap, narg, c); - flags = *ap; - mode = *++ap; - (void)putchar(','); - flagsandmodename(flags, mode, decimal); - ap++; - narg -= 2; - break; - } - case SYS_pread: - case SYS_preadv: - case SYS_pwrite: - case SYS_pwritev: - print_number(ap, narg, c); - print_number(ap, narg, c); - print_number(ap, narg, c); - /* skip padding */ - ap++; - narg--; - break; - case SYS_recvmsg: - case SYS_sendmsg: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - sendrecvflagsname((int)*ap); - ap++; - narg--; - break; - case SYS_recvfrom: - case SYS_sendto: - print_number(ap, narg, c); - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - sendrecvflagsname((int)*ap); - ap++; - narg--; - break; - case SYS___semctl: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - semctlname((int)*ap); - ap++; - narg--; - break; - case SYS_semget: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - semgetname((int)*ap); - ap++; - narg--; - break; - case SYS_shmat: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - shmatname((int)*ap); - ap++; - narg--; - break; - case SYS_shmctl: - print_number(ap, narg, c); - (void)putchar(','); - shmctlname((int)*ap); - ap++; - narg--; - break; - case SYS_sigaction: - signame((int)*ap); - ap++; - narg--; - c = ','; - break; - case SYS_sigprocmask: - sigprocmaskhowname((int)*ap); - ap++; - narg--; - c = ','; - break; - case SYS_socket: { - int sockdomain = (int)*ap; - sockdomainname(sockdomain); - ap++; - narg--; - (void)putchar(','); - socktypename((int)*ap); - ap++; - narg--; - if (sockdomain == PF_INET || - sockdomain == PF_INET6) { - (void)putchar(','); - sockipprotoname((int)*ap); - ap++; - narg--; - } - c = ','; - break; - } - case SYS_socketpair: - sockdomainname((int)*ap); - ap++; - narg--; - (void)putchar(','); - socktypename((int)*ap); - ap++; - narg--; - c = ','; - break; - case SYS_truncate: - case SYS_ftruncate: - print_number(ap, narg, c); - /* skip padding */ - ap++; - narg--; - break; - case SYS_wait4: - print_number(ap, narg, c); - print_number(ap, narg, c); - (void)putchar(','); - wait4optname((int)*ap); - ap++; - narg--; - break; - } - } - while (narg) { - if (c) - putchar(c); - if (decimal) - (void)printf("%ld", (long)*ap); - else - (void)printf("%#lx", (long)*ap); - c = ','; - ap++; - narg--; + + switch (ktr->ktr_code) { + case SYS_ioctl: { + const char *cp; + + pn(NULL); + if (!fancy) + break; + if ((cp = ioctlname(*ap)) != NULL) + (void)printf(",%s", cp); + else + ioctldecode(*ap); + ap++; + narg--; + break; + } + case SYS___sysctl: { + int *np, n; + + if (!fancy) + break; + n = ap[1]; + if (n > CTL_MAXNAME) + n = CTL_MAXNAME; + np = (int *)(ap + 6); + for (; n--; np++) { + if (sep) + putchar(sep); + printf("%d", *np); + sep = '.'; } + + sep = ','; + ap += 2; + narg -= 2; + break; + } + case SYS_ptrace: + if (!fancy) + break; + ptracedecode(); + break; + case SYS_access: + pn(NULL); + pn(accessmodename); + break; + case SYS_chmod: + case SYS_fchmod: + pn( NULL); + pn(modename); + break; + case SYS_fcntl: { + int cmd; + int arg; + pn(NULL); + if (!fancy) + break; + cmd = ap[0]; + arg = ap[1]; + (void)putchar(','); + fcntlcmdname(cmd, arg); + ap += 2; + narg -= 2; + break; + } + case SYS_flock: + pn(NULL); + pn(flockname); + break; + case SYS_getrlimit: + case SYS_setrlimit: + pn(rlimitname); + break; + case SYS_getsockopt: + case SYS_setsockopt: { + int level; + + pn(NULL); + level = *ap; + pn(sockoptlevelname); + if (level == SOL_SOCKET) + pn(sockoptname); + break; + } + case SYS_kill: + pn(NULL); + pn(signame); + break; + case SYS_lseek: + pn(NULL); + /* skip padding */ + ap++; + narg--; + plln(); + pn(whencename); + break; + case SYS_madvise: + pn(NULL); + pn(NULL); + pn(madvisebehavname); + break; + case SYS_minherit: + pn(NULL); + pn(NULL); + pn(minheritname); + break; + case SYS_mlockall: + pn(mlockallname); + break; + case SYS_mmap: + pn(NULL); + pn(NULL); + pn(mmapprotname); + pn(mmapflagsname); + pn(NULL); + /* skip padding */ + ap++; + narg--; + plln(); + break; + case SYS_mprotect: + pn(NULL); + pn(NULL); + pn(mmapprotname); + break; + case SYS_mquery: + pn(NULL); + pn(NULL); + pn(mmapprotname); + pn(mmapflagsname); + pn(NULL); + /* skip padding */ + ap++; + narg--; + plln(); + break; + case SYS_msync: + pn(NULL); + pn(NULL); + pn(msyncflagsname); + break; + case SYS_msgctl: + pn(NULL); + pn(shmctlname); + break; + case SYS_open: { + int flags; + int mode; + + pn(NULL); + if (!fancy) + break; + flags = ap[0]; + mode = ap[1]; + (void)putchar(','); + flagsandmodename(flags, mode); + ap += 2; + narg -= 2; + break; + } + case SYS_pread: + case SYS_preadv: + case SYS_pwrite: + case SYS_pwritev: + pn(NULL); + pn(NULL); + pn(NULL); + /* skip padding */ + ap++; + narg--; + plln(); + break; + case SYS_recvmsg: + case SYS_sendmsg: + pn(NULL); + pn(NULL); + pn(sendrecvflagsname); + break; + case SYS_recvfrom: + case SYS_sendto: + pn(NULL); + pn(NULL); + pn(NULL); + pn(sendrecvflagsname); + break; + case SYS___semctl: + pn(NULL); + pn(NULL); + pn(semctlname); + break; + case SYS_semget: + pn(NULL); + pn(NULL); + pn(semgetname); + break; + case SYS_shmat: + pn(NULL); + pn(NULL); + pn(shmatname); + break; + case SYS_shmctl: + pn(NULL); + pn(shmctlname); + break; + case SYS_sigaction: + pn(signame); + break; + case SYS_sigprocmask: + pn(sigprocmaskhowname); + break; + case SYS_socket: { + int sockdomain = *ap; + + pn(sockdomainname); + pn(socktypename); + if (sockdomain == PF_INET || sockdomain == PF_INET6) + pn(sockipprotoname); + break; + } + case SYS_socketpair: + pn(sockdomainname); + pn(socktypename); + break; + case SYS_truncate: + case SYS_ftruncate: + pn(NULL); + /* skip padding */ + ap++; + narg--; + plln(); + break; + case SYS_wait4: + pn(NULL); + pn(NULL); + pn(wait4optname); + break; + } + + while (narg) { + if (sep) + putchar(sep); + if (decimal) + (void)printf("%ld", (long)*ap); + else + (void)printf("%#lx", (long)*ap); + sep = ','; + ap++; + narg--; } (void)printf(")\n"); } Index: kdump_subr.h =================================================================== RCS file: /cvs/src/usr.bin/kdump/kdump_subr.h,v retrieving revision 1.1 diff -u -p -r1.1 kdump_subr.h --- kdump_subr.h 16 Jun 2011 17:14:53 -0000 1.1 +++ kdump_subr.h 1 Jul 2011 11:37:52 -0000 @@ -21,11 +21,11 @@ void signame(int); void semctlname(int); void shmctlname(int); void semgetname(int); -void fcntlcmdname(int, int, int); +void fcntlcmdname(int, int); void rtprioname(int); void modename(int); void flagsname(int); -void flagsandmodename(int, int, int); +void flagsandmodename(int, int); void accessmodename(int); void mmapprotname(int); void mmapflagsname(int); @@ -36,7 +36,7 @@ void mountflagsname(int); void rebootoptname(int); void flockname(int); void sockoptname(int); -void sockoptlevelname(int, int); +void sockoptlevelname(int); void sockdomainname(int); void sockipprotoname(int); void socktypename(int); @@ -63,3 +63,5 @@ void lio_listioname(int); void minheritname(int); void quotactlname(int); void ptraceopname(int); + +extern int decimal; Index: mksubr =================================================================== RCS file: /cvs/src/usr.bin/kdump/mksubr,v retrieving revision 1.3 diff -u -p -r1.3 mksubr --- mksubr 20 Jun 2011 17:54:48 -0000 1.3 +++ mksubr 1 Jul 2011 11:37:52 -0000 @@ -295,7 +295,7 @@ semgetname (int flag) { * mode argument is unused (and often bogus and misleading). */ void -flagsandmodename (int flags, int mode, int decimal) { +flagsandmodename (int flags, int mode) { flagsname (flags); (void)putchar(','); if ((flags & O_CREAT) == O_CREAT) { @@ -317,7 +317,7 @@ flagsandmodename (int flags, int mode, i * to use getprotoent(3) here. */ void -sockoptlevelname (int level, int decimal) +sockoptlevelname (int level) { if (level == SOL_SOCKET) { (void)printf("SOL_SOCKET"); @@ -378,7 +378,7 @@ cat <<_EOF_ * grouped in fcntl.h, and this awk script grabs the first group. */ void -fcntlcmdname (int cmd, int arg, int decimal) +fcntlcmdname (int cmd, int arg) { switch (cmd) { _EOF_