aboutsummaryrefslogtreecommitdiff
path: root/softmmu
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2021-11-29 14:09:26 +0000
committerAlex Bennée <alex.bennee@linaro.org>2021-11-29 15:12:37 +0000
commitaff0e204cb1f1c036a496c94c15f5dfafcd9b4b4 (patch)
tree3b7ca5c6f32f9635df139d4961c2c2aaa87d9007 /softmmu
parent48e14066ac10581db4e69f75eda107cfdafa6022 (diff)
downloadqemu-aff0e204cb1f1c036a496c94c15f5dfafcd9b4b4.zip
qemu-aff0e204cb1f1c036a496c94c15f5dfafcd9b4b4.tar.gz
qemu-aff0e204cb1f1c036a496c94c15f5dfafcd9b4b4.tar.bz2
accel/tcg: suppress IRQ check for special TBs
When we set cpu->cflags_next_tb it is because we want to carefully control the execution of the next TB. Currently there is a race that causes the second stage of watchpoint handling to get ignored if an IRQ is processed before we finish executing the instruction that triggers the watchpoint. Use the new CF_NOIRQ facility to avoid the race. We also suppress IRQs when handling precise self modifying code to avoid unnecessary bouncing. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Cc: Pavel Dovgalyuk <pavel.dovgalyuk@ispras.ru> Fixes: https://gitlab.com/qemu-project/qemu/-/issues/245 Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211129140932.4115115-3-alex.bennee@linaro.org>
Diffstat (limited to 'softmmu')
-rw-r--r--softmmu/physmem.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index 314f8b4..3524c04 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -912,7 +912,7 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
*/
if (!cpu->can_do_io) {
/* Force execution of one insn next time. */
- cpu->cflags_next_tb = 1 | CF_LAST_IO | curr_cflags(cpu);
+ cpu->cflags_next_tb = 1 | CF_LAST_IO | CF_NOIRQ | curr_cflags(cpu);
cpu_loop_exit_restore(cpu, ra);
}
/*
@@ -946,7 +946,7 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
cpu_loop_exit(cpu);
} else {
/* Force execution of one insn next time. */
- cpu->cflags_next_tb = 1 | CF_LAST_IO | curr_cflags(cpu);
+ cpu->cflags_next_tb = 1 | CF_LAST_IO | CF_NOIRQ | curr_cflags(cpu);
mmap_unlock();
cpu_loop_exit_noexc(cpu);
}