]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
accel/tcg: also suppress asynchronous IRQs for cpu_io_recompile
authorAlex Bennée <alex.bennee@linaro.org>
Thu, 16 Jan 2025 16:02:51 +0000 (16:02 +0000)
committerAlex Bennée <alex.bennee@linaro.org>
Fri, 17 Jan 2025 10:44:59 +0000 (10:44 +0000)
While it would be technically correct to allow an IRQ to happen (as
the offending instruction never really completed) it messes up
instrumentation. We already take care to only use memory
instrumentation on the block, we should also suppress IRQs.

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Reviewed-by: Julian Ganz <neither@nut.email>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20250116160306.1709518-23-alex.bennee@linaro.org>

accel/tcg/translate-all.c

index 453eb20ec95cd5908dac9bdf3f8b50cceda91d2a..d56ca13cddfd4a14ec5fbc00301ec1fa248ccc5f 100644 (file)
@@ -633,9 +633,10 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
      * Exit the loop and potentially generate a new TB executing the
      * just the I/O insns. We also limit instrumentation to memory
      * operations only (which execute after completion) so we don't
-     * double instrument the instruction.
+     * double instrument the instruction. Also don't let an IRQ sneak
+     * in before we execute it.
      */
-    cpu->cflags_next_tb = curr_cflags(cpu) | CF_MEMI_ONLY | n;
+    cpu->cflags_next_tb = curr_cflags(cpu) | CF_MEMI_ONLY | CF_NOIRQ | n;
 
     if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
         vaddr pc = cpu->cc->get_pc(cpu);