[PATCH] arm64/traps: show fault address in exception trace

Baruch Siach baruch at tkos.co.il
Tue Apr 29 00:15:24 PDT 2025


The FAR (fault address) register provides useful information when
debugging an unhandled exception.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm64/kernel/traps.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 4e26bd356a48..14eb598e33a7 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -239,7 +239,7 @@ void die(const char *str, struct pt_regs *regs, long err)
 		make_task_dead(SIGSEGV);
 }
 
-static void arm64_show_signal(int signo, const char *str)
+static void arm64_show_signal(int signo, const char *str, unsigned long far)
 {
 	static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
 				      DEFAULT_RATELIMIT_BURST);
@@ -256,6 +256,7 @@ static void arm64_show_signal(int signo, const char *str)
 	pr_info("%s[%d]: unhandled exception: ", tsk->comm, task_pid_nr(tsk));
 	if (esr)
 		pr_cont("%s, ESR 0x%016lx, ", esr_get_class_string(esr), esr);
+	pr_cont("FAR 0x%016lx, ", far);
 
 	pr_cont("%s", str);
 	print_vma_addr(KERN_CONT " in ", regs->pc);
@@ -266,7 +267,7 @@ static void arm64_show_signal(int signo, const char *str)
 void arm64_force_sig_fault(int signo, int code, unsigned long far,
 			   const char *str)
 {
-	arm64_show_signal(signo, str);
+	arm64_show_signal(signo, str, far);
 	if (signo == SIGKILL)
 		force_sig(SIGKILL);
 	else
@@ -275,21 +276,21 @@ void arm64_force_sig_fault(int signo, int code, unsigned long far,
 
 void arm64_force_sig_fault_pkey(unsigned long far, const char *str, int pkey)
 {
-	arm64_show_signal(SIGSEGV, str);
+	arm64_show_signal(SIGSEGV, str, far);
 	force_sig_pkuerr((void __user *)far, pkey);
 }
 
 void arm64_force_sig_mceerr(int code, unsigned long far, short lsb,
 			    const char *str)
 {
-	arm64_show_signal(SIGBUS, str);
+	arm64_show_signal(SIGBUS, str, far);
 	force_sig_mceerr(code, (void __user *)far, lsb);
 }
 
 void arm64_force_sig_ptrace_errno_trap(int errno, unsigned long far,
 				       const char *str)
 {
-	arm64_show_signal(SIGTRAP, str);
+	arm64_show_signal(SIGTRAP, str, far);
 	force_sig_ptrace_errno_trap(errno, (void __user *)far);
 }
 
-- 
2.47.2




More information about the linux-arm-kernel mailing list