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...

        -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