Index: usr.bin/truss/setup.c =================================================================== --- usr.bin/truss/setup.c +++ usr.bin/truss/setup.c @@ -367,6 +367,7 @@ enter_syscall(struct trussinfo *info, struct threadinfo *t, struct ptrace_lwpinfo *pl) { + char *p; struct syscall *sc; u_int i, narg; @@ -378,9 +379,16 @@ } t->cs.name = sysdecode_syscallname(t->proc->abi->abi, t->cs.number); - if (t->cs.name == NULL) + if (t->cs.name == NULL) { fprintf(info->outfile, "-- UNKNOWN %s SYSCALL %d --\n", t->proc->abi->type, t->cs.number); + /* Construct a named based on the ABI and number. */ + asprintf(__DECONST(char **, &t->cs.name), "%s_%d", + t->proc->abi->type, t->cs.number); + p = __DECONST(char *, t->cs.name); + while ((p = strchr(p, ' ')) != NULL) + *p++ = '_'; + } sc = get_syscall(t, narg); t->cs.nargs = sc->nargs; @@ -395,25 +403,23 @@ * now. This doesn't currently support arguments that are * passed in *and* out, however. */ - if (t->cs.name != NULL) { #if DEBUG - fprintf(stderr, "syscall %s(", t->cs.name); + fprintf(stderr, "syscall %s(", t->cs.name); #endif - for (i = 0; i < t->cs.nargs; i++) { + for (i = 0; i < t->cs.nargs; i++) { #if DEBUG - fprintf(stderr, "0x%lx%s", sc ? - t->cs.args[sc->args[i].offset] : t->cs.args[i], - i < (t->cs.nargs - 1) ? "," : ""); + fprintf(stderr, "0x%lx%s", sc ? + t->cs.args[sc->args[i].offset] : t->cs.args[i], + i < (t->cs.nargs - 1) ? "," : ""); #endif - if (!(sc->args[i].type & OUT)) { - t->cs.s_args[i] = print_arg(&sc->args[i], - t->cs.args, 0, info); - } + if (!(sc->args[i].type & OUT)) { + t->cs.s_args[i] = print_arg(&sc->args[i], + t->cs.args, 0, info); } + } #if DEBUG - fprintf(stderr, ")\n"); + fprintf(stderr, ")\n"); #endif - } clock_gettime(CLOCK_REALTIME, &t->before); } Index: usr.bin/truss/syscalls.c =================================================================== --- usr.bin/truss/syscalls.c +++ usr.bin/truss/syscalls.c @@ -54,6 +54,7 @@ #include #include +#include #include #include #include @@ -930,8 +931,7 @@ struct syscall *sc; int i; - if (t->cs.name == NULL) - return (NULL); + assert(t->cs.name != NULL); STAILQ_FOREACH(sc, &syscalls, entries) if (t->cs.number == sc->number && t->proc->abi->abi == sc->abi)