From 11ae599cb8066c32ce8448ccf747e1c521a30135 Mon Sep 17 00:00:00 2001 From: Claudio Fontana Date: Thu, 4 Mar 2021 16:33:13 -0500 Subject: [PATCH] target/arm: do not use cc->do_interrupt for KVM directly cc->do_interrupt is in theory a TCG callback used in accel/tcg only, to prepare the emulated architecture to take an interrupt as defined in the hardware specifications, but in reality the _do_interrupt style of functions in targets are also occasionally reused by KVM to prepare the architecture state in a similar way where userspace code has identified that it needs to deliver an exception to the guest. In the case of ARM, that includes: 1) the vcpu thread got a SIGBUS indicating a memory error, and we need to deliver a Synchronous External Abort to the guest to let it know about the error. 2) the kernel told us about a debug exception (breakpoint, watchpoint) but it is not for one of QEMU's own gdbstub breakpoints/watchpoints so it must be a breakpoint the guest itself has set up, therefore we need to deliver it to the guest. So in order to reuse code, the same arm_do_interrupt function is used. This is all fine, but we need to avoid calling it using the callback registered in CPUClass, since that one is now TCG-only. Fortunately this is easily solved by replacing calls to CPUClass::do_interrupt() with explicit calls to arm_do_interrupt(). Backports 853bfef4e6d60244fd131ec55bbf1e7caa52599b. We don't support KVM, so we just bring the comment addition over. --- qemu/target/arm/helper.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qemu/target/arm/helper.c b/qemu/target/arm/helper.c index 05e760dd..7a907030 100644 --- a/qemu/target/arm/helper.c +++ b/qemu/target/arm/helper.c @@ -9683,6 +9683,10 @@ static inline bool check_for_semihosting(CPUState *cs) * Do any appropriate logging, handle PSCI calls, and then hand off * to the AArch64-entry or AArch32-entry function depending on the * target exception level's register width. + * + * Note: this is used for both TCG (as the do_interrupt tcg op), + * and KVM to re-inject guest debug exceptions, and to + * inject a Synchronous-External-Abort. */ void arm_cpu_do_interrupt(CPUState *cs) {