redo the former in light of making the kernel output normal 64 bit

records for 32 bit & 64 bit processes.  we still make some adjustments
when dealing with 32-bit processes, but largely things are handled the
same now.  make the code to match "netbsd32_<syscall>" in place of
plain "<syscall>" more general.
This commit is contained in:
mrg 2004-01-15 14:42:09 +00:00
parent 1d9c8161a0
commit 7ca9a9ac30
1 changed files with 75 additions and 62 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: kdump.c,v 1.71 2004/01/12 13:39:56 mrg Exp $ */
/* $NetBSD: kdump.c,v 1.72 2004/01/15 14:42:09 mrg Exp $ */
/*-
* Copyright (c) 1988, 1993
@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\
#if 0
static char sccsid[] = "@(#)kdump.c 8.4 (Berkeley) 4/28/95";
#else
__RCSID("$NetBSD: kdump.c,v 1.71 2004/01/12 13:39:56 mrg Exp $");
__RCSID("$NetBSD: kdump.c,v 1.72 2004/01/15 14:42:09 mrg Exp $");
#endif
#endif /* not lint */
@ -94,32 +94,34 @@ static const char *linux_ptrace_ops[] = {
"PTRACE_SYSCALL",
};
int main __P((int, char **));
int fread_tail __P((char *, int, int));
int dumpheader __P((struct ktr_header *));
void ioctldecode __P((u_long));
void ktrsyscall __P((struct ktr_syscall *));
void ktrsysret __P((struct ktr_sysret *, int));
void ktrnamei __P((char *, int));
void ktremul __P((char *, int, int));
void ktrgenio __P((struct ktr_genio *, int));
void ktrpsig __P((void *, int));
void ktrcsw __P((struct ktr_csw *));
void ktruser __P((struct ktr_user *, int));
void ktrmmsg __P((struct ktr_mmsg *, int));
void ktrmool __P((struct ktr_mool *, int));
void usage __P((void));
void eprint __P((int));
void rprint __P((register_t));
char *ioctlname __P((long));
static const char *signame __P((long, int));
int main(int, char **);
int fread_tail(char *, int, int);
int dumpheader(struct ktr_header *);
void output_long(u_long, int);
void ioctldecode(u_long);
void ktrsyscall(struct ktr_syscall *);
void ktrsyscall_size(struct ktr_syscall *);
void ktrsysret(struct ktr_sysret *, int);
void ktrnamei(char *, int);
void ktremul(char *, int, int);
void ktrgenio(struct ktr_genio *, int);
void ktrpsig(void *, int);
void ktrcsw(struct ktr_csw *);
void ktruser(struct ktr_user *, int);
void ktrmmsg(struct ktr_mmsg *, int);
void ktrmool(struct ktr_mool *, int);
void usage(void);
void eprint(int);
void rprint(register_t);
char *ioctlname(long);
static const char *signame(long, int);
static void hexdump_buf(const void *, int, int);
static void visdump_buf(const void *, int, int);
int
main(argc, argv)
int argc;
char *argv[];
char **argv;
{
int ch, ktrlen, size;
void *m;
@ -271,7 +273,7 @@ main(argc, argv)
visdump_buf(m, ktrlen, col);
break;
default:
printf("\n");
putchar('\n');
hexdump_buf(m, ktrlen, word_size);
}
if (tail)
@ -362,6 +364,17 @@ dumpheader(kth)
return col;
}
void
output_long(it, as_x)
u_long it;
int as_x;
{
if (cur_emul->flags & EMUL_FLAG_NETBSD32)
printf(as_x ? "%#x" : "%d", (u_int)it);
else
printf(as_x ? "%#lx" : "%ld", it);
}
void
ioctldecode(cmd)
u_long cmd;
@ -374,12 +387,13 @@ ioctldecode(cmd)
*dir++ = 'R';
*dir = '\0';
printf(decimal ? ",_IO%s('%c',%ld" : ",_IO%s('%c',%#lx",
dirbuf, (int) ((cmd >> 8) & 0xff), cmd & 0xff);
if ((cmd & IOC_VOID) == 0)
printf(decimal ? ",%ld)" : ",%#lx)", (cmd >> 16) & 0xff);
else
printf(")");
printf(",_IO%s('%c',", dirbuf, (int) ((cmd >> 8) & 0xff));
output_long(cmd & 0xff, decimal == 0);
if ((cmd & IOC_VOID) == 0) {
putchar(',');
output_long((cmd >> 16) & 0xff, decimal == 0);
}
putchar(')');
}
void
@ -393,22 +407,29 @@ ktrsyscall(ktr)
char *cp;
const char *sys_name;
if (emul->flags & EMUL_FLAG_NETBSD32)
/* XXX: should use register32_t ? */
argcount = ktr->ktr_argsize / (sizeof (register_t) / 2);
else
argcount = ktr->ktr_argsize / sizeof (register_t);
argcount = ktr->ktr_argsize / sizeof (*ap);
emul_changed = 0;
if (((ktr->ktr_code >= emul->nsysnames || ktr->ktr_code < 0)
&& (mach_traps_dispatch(&ktr->ktr_code, &emul) == 0)) ||
numeric) {
if (numeric ||
((ktr->ktr_code >= emul->nsysnames || ktr->ktr_code < 0)
&& mach_traps_dispatch(&ktr->ktr_code, &emul) == 0)) {
sys_name = "?";
(void)printf("[%d]", ktr->ktr_code);
} else {
sys_name = emul->sysnames[ktr->ktr_code];
(void)printf("%s", sys_name);
}
#ifdef _LP64
#define NETBSD32_ "netbsd32_"
if (cur_emul->flags & EMUL_FLAG_NETBSD32) {
size_t len = strlen(NETBSD32_);
if (strncmp(sys_name, NETBSD32_, len) == 0)
sys_name += len;
}
#undef NETBSD32_
#endif
ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall));
if (argcount) {
c = '(';
@ -418,13 +439,9 @@ ktrsyscall(ktr)
} else if (strcmp(sys_name, "exit") == 0) {
ectx_delete();
} else if ((strcmp(sys_name, "ioctl") == 0 ||
strcmp(sys_name, "netbsd32_ioctl") == 0) &&
argcount >= 2) {
if (decimal || *ap <= 9)
(void)printf("(%ld", (long)*ap);
else
(void)printf("(%#lx", (long)*ap);
} else if (strcmp(sys_name, "ioctl") == 0 && argcount >= 2) {
(void)putchar('(');
output_long((long)*ap, (decimal || *ap <= 9));
ap++;
argcount--;
if ((cp = ioctlname(*ap)) != NULL)
@ -436,31 +453,29 @@ ktrsyscall(ktr)
c = ',';
} else if (strcmp(sys_name, "kill") == 0 && argcount >= 2) {
if (decimal || *ap <= 9)
(void)printf("(%ld, SIG%s",
(long)ap[0], signame(ap[1], 1));
else
(void)printf("(%#lx, SIG%s",
(long)ap[0], signame(ap[1], 1));
putchar('(');
output_long((long)ap[0], (decimal || *ap <= 9));
(void)printf(", SIG%s", signame(ap[1], 1));
ap += 2;
argcount -= 2;
c = ',';
} else if (strcmp(sys_name, "ptrace") == 0 && argcount >= 1) {
putchar('(');
if (strcmp(emul->name, "linux") == 0) {
if (*ap >= 0 && *ap <=
sizeof(linux_ptrace_ops) /
sizeof(linux_ptrace_ops[0]))
(void)printf("(%s",
if (*ap >= 0 && *ap <=
sizeof(linux_ptrace_ops) /
sizeof(linux_ptrace_ops[0]))
(void)printf("%s",
linux_ptrace_ops[*ap]);
else
(void)printf("(%ld", (long)*ap);
else
output_long((long)*ap, 1);
} else {
if (*ap >= 0 && *ap <=
sizeof(ptrace_ops) / sizeof(ptrace_ops[0]))
(void)printf("(%s", ptrace_ops[*ap]);
(void)printf("%s", ptrace_ops[*ap]);
else
(void)printf("(%ld", (long)*ap);
output_long((long)*ap, 1);
}
ap++;
argcount--;
@ -468,10 +483,8 @@ ktrsyscall(ktr)
}
while (argcount > 0) {
if (decimal || *ap <= 9)
(void)printf("%c%ld", c, (long)*ap);
else
(void)printf("%c%#lx", c, (long)*ap);
putchar(c);
output_long((long)*ap, (decimal || *ap <= 9));
ap++;
argcount--;
c = ',';