This diff: * upgrades stacktrace_save() to stacktrace_save_at() if the latter is missing on the architecture, * defines stacktrace_save() as an inline function in <sys/stacktrace.h> to replace MD definitions.
OK? Index: arch/amd64/amd64/db_trace.c =================================================================== RCS file: src/sys/arch/amd64/amd64/db_trace.c,v retrieving revision 1.51 diff -u -p -r1.51 db_trace.c --- arch/amd64/amd64/db_trace.c 29 Mar 2020 15:14:28 -0000 1.51 +++ arch/amd64/amd64/db_trace.c 15 Apr 2020 15:55:08 -0000 @@ -288,12 +288,6 @@ stacktrace_save_at(struct stacktrace *st } } -void -stacktrace_save(struct stacktrace *st) -{ - return stacktrace_save_at(st, 0); -} - vaddr_t db_get_pc(struct trapframe *tf) { Index: arch/arm64/arm64/db_trace.c =================================================================== RCS file: src/sys/arch/arm64/arm64/db_trace.c,v retrieving revision 1.10 diff -u -p -r1.10 db_trace.c --- arch/arm64/arm64/db_trace.c 29 Mar 2020 15:14:28 -0000 1.10 +++ arch/arm64/arm64/db_trace.c 15 Apr 2020 15:55:08 -0000 @@ -150,7 +150,7 @@ db_stack_trace_print(db_expr_t addr, int } void -stacktrace_save(struct stacktrace *st) +stacktrace_save_at(struct stacktrace *st, unsigned int skip) { struct callframe *frame, *lastframe, *limit; struct proc *p = curproc; @@ -166,7 +166,10 @@ stacktrace_save(struct stacktrace *st) sizeof(struct trapframe) - 0x10); while (st->st_count < STACKTRACE_MAX) { - st->st_pc[st->st_count++] = frame->f_lr; + if (skip == 0) + st->st_pc[st->st_count++] = frame->f_lr; + else + skip--; lastframe = frame; frame = frame->f_frame; Index: arch/hppa/hppa/db_interface.c =================================================================== RCS file: src/sys/arch/hppa/hppa/db_interface.c,v retrieving revision 1.47 diff -u -p -r1.47 db_interface.c --- arch/hppa/hppa/db_interface.c 20 Jan 2020 15:58:23 -0000 1.47 +++ arch/hppa/hppa/db_interface.c 15 Apr 2020 15:55:09 -0000 @@ -316,7 +316,7 @@ db_stack_trace_print(db_expr_t addr, int } void -stacktrace_save(struct stacktrace *st) +stacktrace_save_at(struct stacktrace *st, unsigned int skip) { register_t *fp, pc, rp; int i; @@ -327,7 +327,10 @@ stacktrace_save(struct stacktrace *st) st->st_count = 0; for (i = 0; i < STACKTRACE_MAX; i++) { - st->st_pc[st->st_count++] = rp; + if (skip == 0) + st->st_pc[st->st_count++] = rp; + else + skip--; /* next frame */ pc = rp; Index: arch/i386/i386/db_trace.c =================================================================== RCS file: src/sys/arch/i386/i386/db_trace.c,v retrieving revision 1.40 diff -u -p -r1.40 db_trace.c --- arch/i386/i386/db_trace.c 29 Mar 2020 15:14:28 -0000 1.40 +++ arch/i386/i386/db_trace.c 15 Apr 2020 15:55:09 -0000 @@ -293,12 +293,6 @@ stacktrace_save_at(struct stacktrace *st } } -void -stacktrace_save(struct stacktrace *st) -{ - return stacktrace_save_at(st, 0); -} - vaddr_t db_get_pc(struct trapframe *tf) { Index: arch/mips64/mips64/trap.c =================================================================== RCS file: src/sys/arch/mips64/mips64/trap.c,v retrieving revision 1.143 diff -u -p -r1.143 trap.c --- arch/mips64/mips64/trap.c 20 Jan 2020 15:58:23 -0000 1.143 +++ arch/mips64/mips64/trap.c 15 Apr 2020 15:55:09 -0000 @@ -1477,7 +1477,7 @@ end: #ifdef DDB void -stacktrace_save(struct stacktrace *st) +stacktrace_save_at(struct stacktrace *st, unsigned int skip) { extern char k_general[]; extern char u_general[]; @@ -1503,8 +1503,12 @@ stacktrace_save(struct stacktrace *st) if (!VALID_ADDRESS(pc) || !VALID_ADDRESS(sp)) break; - if (!first) - st->st_pc[st->st_count++] = pc; + if (!first) { + if (skip == 0) + st->st_pc[st->st_count++] = pc; + else + skip--; + } first = 0; /* Determine the start address of the current subroutine. */ Index: arch/powerpc/ddb/db_trace.c =================================================================== RCS file: src/sys/arch/powerpc/ddb/db_trace.c,v retrieving revision 1.15 diff -u -p -r1.15 db_trace.c --- arch/powerpc/ddb/db_trace.c 10 Apr 2020 07:23:21 -0000 1.15 +++ arch/powerpc/ddb/db_trace.c 15 Apr 2020 15:55:09 -0000 @@ -253,9 +253,3 @@ stacktrace_save_at(struct stacktrace *st break; } } - -void -stacktrace_save(struct stacktrace *st) -{ - return stacktrace_save_at(st, 0); -} Index: arch/sparc64/sparc64/db_trace.c =================================================================== RCS file: src/sys/arch/sparc64/sparc64/db_trace.c,v retrieving revision 1.21 diff -u -p -r1.21 db_trace.c --- arch/sparc64/sparc64/db_trace.c 25 Mar 2020 14:59:23 -0000 1.21 +++ arch/sparc64/sparc64/db_trace.c 15 Apr 2020 15:55:09 -0000 @@ -189,12 +189,6 @@ stacktrace_save_at(struct stacktrace *st } void -stacktrace_save(struct stacktrace *st) -{ - return stacktrace_save_at(st, 0); -} - -void db_dump_window(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { int i; Index: sys/stacktrace.h =================================================================== RCS file: src/sys/sys/stacktrace.h,v retrieving revision 1.2 diff -u -p -r1.2 stacktrace.h --- sys/stacktrace.h 25 Mar 2020 14:59:23 -0000 1.2 +++ sys/stacktrace.h 15 Apr 2020 15:55:10 -0000 @@ -29,7 +29,12 @@ struct stacktrace { #ifdef _KERNEL void stacktrace_print(struct stacktrace *, int (*)(const char *, ...)); void stacktrace_save_at(struct stacktrace *, unsigned int); -void stacktrace_save(struct stacktrace *); + +static inline void +stacktrace_save(struct stacktrace *st) +{ + stacktrace_save_at(st, 0); +} #endif #endif /* _SYS_STACKTRACE_H_ */