Module Name: src Committed By: riastradh Date: Tue Nov 21 14:35:01 UTC 2023
Modified Files: src/sys/arch/alpha/alpha: db_trace.c src/sys/arch/alpha/include: db_machdep.h src/sys/ddb: db_interface.h db_panic.c Log Message: ddb: New db_stack_trace_print_ra. Takes an optional extra argument for the return address so that the stack parser has a chance to use instruction-dependent interpretation of the frame to find parent frames. Implemented only on Alpha for now, which needs it. Other architectures just ignore the extra argument. PR port-alpha/57716 XXX pullup-10 XXX pullup-9 XXX pullup-8 To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/arch/alpha/alpha/db_trace.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/alpha/include/db_machdep.h cvs rdiff -u -r1.43 -r1.44 src/sys/ddb/db_interface.h cvs rdiff -u -r1.11 -r1.12 src/sys/ddb/db_panic.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/alpha/alpha/db_trace.c diff -u src/sys/arch/alpha/alpha/db_trace.c:1.32 src/sys/arch/alpha/alpha/db_trace.c:1.33 --- src/sys/arch/alpha/alpha/db_trace.c:1.32 Thu Jul 21 01:52:28 2022 +++ src/sys/arch/alpha/alpha/db_trace.c Tue Nov 21 14:35:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.32 2022/07/21 01:52:28 thorpej Exp $ */ +/* $NetBSD: db_trace.c,v 1.33 2023/11/21 14:35:01 riastradh Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.32 2022/07/21 01:52:28 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.33 2023/11/21 14:35:01 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -210,6 +210,17 @@ void db_stack_trace_print(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif, void (*pr)(const char *, ...)) { + + db_stack_trace_print_ra(/*ra*/0, /*have_ra*/false, addr, have_addr, + count, modif, pr); +} + +void +db_stack_trace_print_ra(db_expr_t ra, bool have_ra, + db_expr_t addr, bool have_addr, + db_expr_t count, + const char *modif, void (*pr)(const char *, ...)) +{ db_addr_t callpc, frame, symval; struct prologue_info pi; db_expr_t diff; @@ -261,6 +272,9 @@ db_stack_trace_print(db_expr_t addr, boo addr = (db_expr_t)pcbp->pcb_hw.apcb_ksp; callpc = pcbp->pcb_context[7]; (*pr)("at 0x%lx\n", addr); + } else if (have_ra) { + callpc = ra; + (*pr)("at 0x%lx pc 0x%lx\n", addr, callpc); } else { (*pr)("alpha trace requires known PC =eject=\n"); return; Index: src/sys/arch/alpha/include/db_machdep.h diff -u src/sys/arch/alpha/include/db_machdep.h:1.19 src/sys/arch/alpha/include/db_machdep.h:1.20 --- src/sys/arch/alpha/include/db_machdep.h:1.19 Mon Nov 6 03:47:45 2017 +++ src/sys/arch/alpha/include/db_machdep.h Tue Nov 21 14:35:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: db_machdep.h,v 1.19 2017/11/06 03:47:45 christos Exp $ */ +/* $NetBSD: db_machdep.h,v 1.20 2023/11/21 14:35:01 riastradh Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. @@ -183,4 +183,11 @@ typedef long kgdb_reg_t; /* Too much? Must be large enough for register transfer. */ #define KGDB_BUFLEN 1024 +/* + * Extra ddb options. + */ +#define __HAVE_DB_STACK_TRACE_PRINT_RA +void db_stack_trace_print_ra(db_expr_t, bool, db_expr_t, bool, + db_expr_t, const char *, void (*)(const char *, ...)); + #endif /* _ALPHA_DB_MACHDEP_H_ */ Index: src/sys/ddb/db_interface.h diff -u src/sys/ddb/db_interface.h:1.43 src/sys/ddb/db_interface.h:1.44 --- src/sys/ddb/db_interface.h:1.43 Thu Nov 2 10:31:55 2023 +++ src/sys/ddb/db_interface.h Tue Nov 21 14:35:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: db_interface.h,v 1.43 2023/11/02 10:31:55 martin Exp $ */ +/* $NetBSD: db_interface.h,v 1.44 2023/11/21 14:35:01 riastradh Exp $ */ /*- * Copyright (c) 1995, 2023 The NetBSD Foundation, Inc. @@ -89,11 +89,19 @@ void db_show_condvar(db_expr_t, bool, d /* kern/sys_select.c */ void db_show_selinfo(db_expr_t, bool, db_expr_t, const char *); +#ifndef __HAVE_DB_STACK_TRACE_PRINT_RA +#define db_stack_trace_print_ra(ra, have_ra, addr, have_addr, c, m, pr) \ + ((void)(ra), (void)(have_ra), \ + db_stack_trace_print(addr, have_addr, c, m, pr)) +#endif + /* The db_stacktrace_print macro may be overridden by an MD macro */ #ifndef db_stacktrace_print #define db_stacktrace_print(prfunc) \ - db_stack_trace_print((db_expr_t)(intptr_t)__builtin_frame_address(0), \ - true, 65535, "", prfunc) + db_stack_trace_print_ra( \ + (db_expr_t)(intptr_t)__builtin_return_address(0), true, \ + (db_expr_t)(intptr_t)__builtin_frame_address(0), true, \ + 65535, "", prfunc) #endif /* !db_stacktrace_print */ #define db_stacktrace() db_stacktrace_print(printf); Index: src/sys/ddb/db_panic.c diff -u src/sys/ddb/db_panic.c:1.11 src/sys/ddb/db_panic.c:1.12 --- src/sys/ddb/db_panic.c:1.11 Wed Oct 6 12:18:20 2021 +++ src/sys/ddb/db_panic.c Tue Nov 21 14:35:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: db_panic.c,v 1.11 2021/10/06 12:18:20 uwe Exp $ */ +/* $NetBSD: db_panic.c,v 1.12 2023/11/21 14:35:01 riastradh Exp $ */ /*- * Copyright (c) 2000, 2002, 2006, 2007, 2009, 2013 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_panic.c,v 1.11 2021/10/06 12:18:20 uwe Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_panic.c,v 1.12 2023/11/21 14:35:01 riastradh Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -52,7 +52,9 @@ db_panic(void) intrace = 1; printf("cpu%u: Begin traceback...\n", cpu_index(curcpu())); - db_stack_trace_print( + db_stack_trace_print_ra( + (db_expr_t)(intptr_t)__builtin_return_address(0), + true, (db_expr_t)(intptr_t)__builtin_frame_address(0), true, db_panicstackframes, "", printf); printf("cpu%u: End traceback...\n",