[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