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

Reply via email to