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_ */