Index: usr.bin/truss/setup.c =================================================================== --- usr.bin/truss/setup.c +++ usr.bin/truss/setup.c @@ -382,7 +382,7 @@ fprintf(info->outfile, "-- UNKNOWN %s SYSCALL %d --\n", t->proc->abi->type, t->cs.number); - sc = get_syscall(t->cs.name, narg); + sc = get_syscall(t, narg); t->cs.nargs = sc->nargs; assert(sc->nargs <= nitems(t->cs.s_args)); Index: usr.bin/truss/syscall.h =================================================================== --- usr.bin/truss/syscall.h +++ usr.bin/truss/syscall.h @@ -70,11 +70,13 @@ /* Hopefully, no syscalls with > 10 args */ struct syscall_args args[10]; struct timespec time; /* Time spent for this call */ + enum sysdecode_abi abi; int ncalls; /* Number of calls */ int nerror; /* Number of calls that returned with error */ + int number; /* Syscall number */ }; -struct syscall *get_syscall(const char *, int nargs); +struct syscall *get_syscall(const struct threadinfo *, int nargs); char *print_arg(struct syscall_args *, unsigned long*, long *, struct trussinfo *); /* Index: usr.bin/truss/syscalls.c =================================================================== --- usr.bin/truss/syscalls.c +++ usr.bin/truss/syscalls.c @@ -925,27 +925,30 @@ * as a hash table or binary search. */ struct syscall * -get_syscall(const char *name, int nargs) +get_syscall(const struct threadinfo *t, int nargs) { struct syscall *sc; int i; - if (name == NULL) + if (t->cs.name == NULL) return (NULL); STAILQ_FOREACH(sc, &syscalls, entries) - if (strcmp(name, sc->name) == 0) + if (t->cs.number == sc->number && + t->proc->abi->abi == sc->abi) return (sc); /* It is unknown. Add it into the list. */ #if DEBUG - fprintf(stderr, "unknown syscall %s -- setting args to %d\n", name, - nargs); + fprintf(stderr, "unknown syscall %s -- setting args to %d\n", + t->cs.name, nargs); #endif sc = calloc(1, sizeof(struct syscall)); - sc->name = strdup(name); + sc->abi = t->proc->abi->abi; + sc->name = strdup(t->cs.name); sc->ret_type = 1; sc->nargs = nargs; + sc->number = t->cs.number; for (i = 0; i < nargs; i++) { sc->args[i].offset = i; /* Treat all unknown arguments as LongHex. */