summaryrefslogtreecommitdiffstats
path: root/linux-user
diff options
context:
space:
mode:
authorRichard Henderson2021-10-04 19:06:10 +0200
committerRichard Henderson2021-11-02 12:00:52 +0100
commit12ed56407e60371d45ffa3b7f2fd00c4d7efa580 (patch)
treec326b99af2e21200b19fc92cc8fd35391fcfde8b /linux-user
parenthw/core: Add TCGCPUOps.record_sigbus (diff)
downloadqemu-12ed56407e60371d45ffa3b7f2fd00c4d7efa580.tar.gz
qemu-12ed56407e60371d45ffa3b7f2fd00c4d7efa580.tar.xz
qemu-12ed56407e60371d45ffa3b7f2fd00c4d7efa580.zip
linux-user: Add cpu_loop_exit_sigbus
This is a new interface to be provided by the os emulator for raising SIGBUS on fault. Use the new record_sigbus target hook. Reviewed-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/signal.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 9d60abc038..df2c8678d0 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -706,6 +706,20 @@ void cpu_loop_exit_sigsegv(CPUState *cpu, target_ulong addr,
cpu_loop_exit_restore(cpu, ra);
}
+void cpu_loop_exit_sigbus(CPUState *cpu, target_ulong addr,
+ MMUAccessType access_type, uintptr_t ra)
+{
+ const struct TCGCPUOps *tcg_ops = CPU_GET_CLASS(cpu)->tcg_ops;
+
+ if (tcg_ops->record_sigbus) {
+ tcg_ops->record_sigbus(cpu, addr, access_type, ra);
+ }
+
+ force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN, addr);
+ cpu->exception_index = EXCP_INTERRUPT;
+ cpu_loop_exit_restore(cpu, ra);
+}
+
/* abort execution with signal */
static void QEMU_NORETURN dump_core_and_abort(int target_sig)
{