aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2023-09-29 13:55:48 +0000
committerAndrew Turner <andrew@FreeBSD.org>2024-02-19 12:40:25 +0000
commitf323ecb4e075f48f23d94f91b2b4b99074c21ebf (patch)
tree85af006ff8e186593ab10b06aca73eda454db0c0
parent2bcdaf2b58badd91686af190825d994cddfcdc38 (diff)
arm64: Raise a SIGBUS on a user external abort
When userspace triggers an external abort allow it to handle the abort by raising a SIGBUS. Reviewed by: markj, kib Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D42018 (cherry picked from commit a69450102ff1fe1466077a021a16bb265274d3a2)
-rw-r--r--sys/arm64/arm64/trap.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c
index d6f847d6b88c..74122cd508ab 100644
--- a/sys/arm64/arm64/trap.c
+++ b/sys/arm64/arm64/trap.c
@@ -223,19 +223,25 @@ static void
external_abort(struct thread *td, struct trapframe *frame, uint64_t esr,
uint64_t far, int lower)
{
+ if (lower) {
+ call_trapsignal(td, SIGBUS, BUS_OBJERR, (void *)far,
+ ESR_ELx_EXCEPTION(frame->tf_esr));
+ userret(td, frame);
+ return;
+ }
/*
* Try to handle synchronous external aborts caused by
* bus_space_peek() and/or bus_space_poke() functions.
*/
- if (!lower && test_bs_fault((void *)frame->tf_elr)) {
+ if (test_bs_fault((void *)frame->tf_elr)) {
frame->tf_elr = (uint64_t)generic_bs_fault;
return;
}
print_registers(frame);
print_gp_register("far", far);
- panic("Unhandled EL%d external data abort", lower ? 0: 1);
+ panic("Unhandled external data abort");
}
static void