=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/kdump/kdump.c,v retrieving revision 1.121 retrieving revision 1.122 diff -c -r1.121 -r1.122 *** src/usr.bin/kdump/kdump.c 2016/02/28 15:55:58 1.121 --- src/usr.bin/kdump/kdump.c 2016/03/06 20:25:27 1.122 *************** *** 1,4 **** ! /* $OpenBSD: kdump.c,v 1.121 2016/02/28 15:55:58 naddy Exp $ */ /*- * Copyright (c) 1988, 1993 --- 1,4 ---- ! /* $OpenBSD: kdump.c,v 1.122 2016/03/06 20:25:27 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 *************** *** 102,130 **** #undef SYSVSHM #undef ACCOUNTING - struct emulation { - char *name; /* Emulation name */ - char **sysnames; /* Array of system call names */ - int nsysnames; /* Number of */ - }; - static struct emulation emulations[] = { - { "native", syscallnames, SYS_MAXSYSCALL }, - { NULL, NULL, 0 } - }; - - static struct emulation *current; - static struct emulation *def_emul; - - struct pid_emul { - struct emulation *e; - pid_t p; - }; - - static struct pid_emul *pe_table; - static size_t pe_size; - - static char *ptrace_ops[] = { "PT_TRACE_ME", "PT_READ_I", "PT_READ_D", "PT_READ_U", "PT_WRITE_I", "PT_WRITE_D", "PT_WRITE_U", "PT_CONTINUE", --- 102,108 ---- *************** *** 133,143 **** "PT_GET_THREAD_FIRST", "PT_GET_THREAD_NEXT", }; - static void mappidtoemul(pid_t, struct emulation *); - static struct emulation * findemul(pid_t); static int fread_tail(void *, size_t, size_t); static void dumpheader(struct ktr_header *); - static void ktremul(char *, size_t); static void ktrgenio(struct ktr_genio *, size_t); static void ktrnamei(const char *, size_t); static void ktrpsig(struct ktr_psig *); --- 111,118 ---- *************** *** 147,153 **** static void ktruser(struct ktr_user *, size_t); static void ktrexec(const char*, size_t); static void ktrpledge(struct ktr_pledge *, size_t); - static void setemul(const char *); static void usage(void); static void ioctldecode(int); static void ptracedecode(int); --- 122,127 ---- *************** *** 174,181 **** const char *errstr; void *m; - def_emul = current = &emulations[0]; /* native */ - if (screenwidth == 0) { struct winsize ws; --- 148,153 ---- *************** *** 186,197 **** screenwidth = 80; } ! while ((ch = getopt(argc, argv, "e:f:dHlm:nRp:Tt:xX")) != -1) switch (ch) { - case 'e': - setemul(optarg); - def_emul = current; - break; case 'f': tracefile = optarg; break; --- 158,165 ---- screenwidth = 80; } ! while ((ch = getopt(argc, argv, "f:dHlm:np:RTt:xX")) != -1) switch (ch) { case 'f': tracefile = optarg; break; *************** *** 254,261 **** errx(1, "%s: not a dump", tracefile); while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { silent = 0; - if (pe_size == 0) - mappidtoemul(ktr_header.ktr_pid, current); if (pid_opt != -1 && pid_opt != ktr_header.ktr_pid) silent = 1; if (silent == 0 && trpoints & (1<ktr_type); type = unknown; } --- 331,337 ---- type = "PLDG"; break; default: ! (void)snprintf(unknown, sizeof unknown, "UNKNOWN(%u)", kth->ktr_type); type = unknown; } *************** *** 851,857 **** [SYS_lseek] = { Pfd, PAD, Poff_t, Whencename }, [SYS_truncate] = { Ppath, PAD, Poff_t }, [SYS_ftruncate] = { Pfd, PAD, Poff_t }, ! /* [SYS_sysctl] = { }, Magic */ [SYS_mlock] = { Pptr, Pbigsize }, [SYS_munlock] = { Pptr, Pbigsize }, [SYS_getpgid] = { Ppid_t }, --- 777,783 ---- [SYS_lseek] = { Pfd, PAD, Poff_t, Whencename }, [SYS_truncate] = { Ppath, PAD, Poff_t }, [SYS_ftruncate] = { Pfd, PAD, Poff_t }, ! [SYS_sysctl] = { Pptr, Pcount, Pptr, Pptr, Pptr, Psize }, [SYS_mlock] = { Pptr, Pbigsize }, [SYS_munlock] = { Pptr, Pbigsize }, [SYS_getpgid] = { Ppid_t }, *************** *** 921,942 **** 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); else ! (void)printf("%s", current->sysnames[ktr->ktr_code]); ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall)); (void)putchar('('); ! if (current != &emulations[0]) ! goto nonnative; ! ! if (ktr->ktr_code == SYS_sysctl) { const char *s; int n, i, *top; - if (!fancy) - goto nonnative; n = ap[1]; if (n > CTL_MAXNAME) n = CTL_MAXNAME; --- 847,863 ---- narg = ktr->ktr_argsize / sizeof(register_t); sep = '\0'; ! if (ktr->ktr_code >= SYS_MAXSYSCALL || ktr->ktr_code < 0) (void)printf("[%d]", ktr->ktr_code); else ! (void)printf("%s", syscallnames[ktr->ktr_code]); ap = (register_t *)((char *)ktr + sizeof(struct ktr_syscall)); (void)putchar('('); ! if (ktr->ktr_code == SYS_sysctl && fancy) { const char *s; int n, i, *top; n = ap[1]; if (n > CTL_MAXNAME) n = CTL_MAXNAME; *************** *** 982,988 **** } } - nonnative: while (narg > 0) { if (sep) putchar(sep); --- 903,908 ---- *************** *** 1140,1160 **** errx(1, "sysret bogus length %zu", ktrlen); } ! if (code >= current->nsysnames || code < 0) (void)printf("[%d] ", code); ! else { ! (void)printf("%s ", current->sysnames[code]); ! if (error == 0 && ret > 0 && ! (strcmp(current->sysnames[code], "fork") == 0 || ! strcmp(current->sysnames[code], "vfork") == 0 || ! strcmp(current->sysnames[code], "__tfork") == 0 || ! strcmp(current->sysnames[code], "clone") == 0)) ! mappidtoemul(ret, current); ! } if (error == 0) { if (fancy) { ! switch (current == &emulations[0] ? code : -1) { case SYS_lseek: (void)printf("%lld", retll); if (retll < 0 || retll > 9) --- 1060,1073 ---- errx(1, "sysret bogus length %zu", ktrlen); } ! if (code >= SYS_MAXSYSCALL || code < 0) (void)printf("[%d] ", code); ! else ! (void)printf("%s ", syscallnames[code]); if (error == 0) { if (fancy) { ! switch (code) { case SYS_lseek: (void)printf("%lld", retll); if (retll < 0 || retll > 9) *************** *** 1175,1181 **** case SYS_getegid: gidname(ret); break; - case -1: /* non-default emulation */ default: (void)printf("%ld", (long)ret); if (ret < 0 || ret > 9) --- 1088,1093 ---- *************** *** 1205,1225 **** (void)printf("\"%.*s\"\n", (int)len, cp); } - static void - ktremul(char *cp, size_t len) - { - char name[1024]; - - if (len >= sizeof(name)) - errx(1, "Emulation name too long"); - - strncpy(name, cp, len); - name[len] = '\0'; - (void)printf("\"%s\"\n", name); - - setemul(name); - } - void showbufc(int col, unsigned char *dp, size_t datalen) { --- 1117,1122 ---- *************** *** 1441,1450 **** if (len < sizeof(struct ktr_pledge)) errx(1, "invalid ktr pledge length %zu", len); ! if (pledge->syscall >= current->nsysnames || pledge->syscall < 0) (void)printf("[%d]", pledge->syscall); else ! (void)printf("%s", current->sysnames[pledge->syscall]); printf(", "); for (i = 0; pledge->code && pledgenames[i].bits != 0; i++) { if (pledgenames[i].bits & pledge->code) { --- 1338,1347 ---- if (len < sizeof(struct ktr_pledge)) errx(1, "invalid ktr pledge length %zu", len); ! if (pledge->syscall >= SYS_MAXSYSCALL || pledge->syscall < 0) (void)printf("[%d]", pledge->syscall); else ! (void)printf("%s", syscallnames[pledge->syscall]); printf(", "); for (i = 0; pledge->code && pledgenames[i].bits != 0; i++) { if (pledgenames[i].bits & pledge->code) { *************** *** 1465,1488 **** extern char *__progname; fprintf(stderr, "usage: %s " ! "[-dHlnRTXx] [-e emulation] [-f file] [-m maxdata] [-p pid]\n" ! "%*s[-t [ceinstuxX+]]\n", __progname, (int)(sizeof("usage: ") + strlen(__progname)), ""); exit(1); } - static void - setemul(const char *name) - { - int i; - - for (i = 0; emulations[i].name != NULL; i++) - if (strcmp(emulations[i].name, name) == 0) { - current = &emulations[i]; - return; - } - warnx("Emulation `%s' unknown", name); - } /* * FORMATTERS --- 1362,1373 ---- extern char *__progname; fprintf(stderr, "usage: %s " ! "[-dHlnRTXx] [-f file] [-m maxdata] [-p pid]\n" ! "%*s[-t [cinstuxX+]]\n", __progname, (int)(sizeof("usage: ") + strlen(__progname)), ""); exit(1); } /* * FORMATTERS