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);
 
 			/*

Reply via email to