Module Name: src Committed By: riastradh Date: Sat Nov 27 14:11:04 UTC 2021
Modified Files: src/sys/arch/aarch64/aarch64: db_trace.c Log Message: aarch64: Fix stack traces from jump-to-null. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/db_trace.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/aarch64/aarch64/db_trace.c diff -u src/sys/arch/aarch64/aarch64/db_trace.c:1.13 src/sys/arch/aarch64/aarch64/db_trace.c:1.14 --- src/sys/arch/aarch64/aarch64/db_trace.c:1.13 Fri Dec 11 18:03:33 2020 +++ src/sys/arch/aarch64/aarch64/db_trace.c Sat Nov 27 14:11:04 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.13 2020/12/11 18:03:33 skrll Exp $ */ +/* $NetBSD: db_trace.c,v 1.14 2021/11/27 14:11:04 riastradh Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -28,7 +28,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.13 2020/12/11 18:03:33 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.14 2021/11/27 14:11:04 riastradh Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -302,8 +302,21 @@ db_stack_trace_print(db_expr_t addr, boo lastfp = (uint64_t)tf; lastlr = lr; lr = fp = 0; - db_read_bytes((db_addr_t)&tf->tf_pc, sizeof(lr), (char *)&lr); - db_read_bytes((db_addr_t)&tf->tf_reg[29], sizeof(fp), (char *)&fp); + db_read_bytes((db_addr_t)&tf->tf_pc, sizeof(lr), + (char *)&lr); + if (lr == 0) { + /* + * The exception may have been from a + * jump to null, so the null pc we + * would return to is useless. Try + * x[30] instead -- that will be the + * return address for the jump. + */ + db_read_bytes((db_addr_t)&tf->tf_reg[30], + sizeof(lr), (char *)&lr); + } + db_read_bytes((db_addr_t)&tf->tf_reg[29], sizeof(fp), + (char *)&fp); lr = aarch64_strip_pac(lr); /*