We are going to disallow tb_flush from within the context of a running cpu. Introduce a tcg-internal exception to return out of the cpu run loop and perform the flush there.
Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- include/exec/cpu-common.h | 1 + accel/tcg/tcg-accel-ops-mttcg.c | 7 +++++++ accel/tcg/tcg-accel-ops-rr.c | 9 +++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 9b658a3f48..ce9f116ac3 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -20,6 +20,7 @@ #define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */ #define EXCP_YIELD 0x10004 /* cpu wants to yield timeslice to another */ #define EXCP_ATOMIC 0x10005 /* stop-the-world and emulate atomic */ +#define EXCP_TB_FLUSH 0x10006 /* stop-the-world and flush all tb */ void cpu_exec_init_all(void); void cpu_exec_step_atomic(CPUState *cpu); diff --git a/accel/tcg/tcg-accel-ops-mttcg.c b/accel/tcg/tcg-accel-ops-mttcg.c index 337b993d3d..f21c86dc84 100644 --- a/accel/tcg/tcg-accel-ops-mttcg.c +++ b/accel/tcg/tcg-accel-ops-mttcg.c @@ -27,6 +27,7 @@ #include "system/tcg.h" #include "system/replay.h" #include "exec/icount.h" +#include "exec/tb-flush.h" #include "qemu/main-loop.h" #include "qemu/notify.h" #include "qemu/guest-random.h" @@ -107,6 +108,12 @@ static void *mttcg_cpu_thread_fn(void *arg) bql_unlock(); cpu_exec_step_atomic(cpu); bql_lock(); + break; + case EXCP_TB_FLUSH: + start_exclusive(); + tb_flush__exclusive(); + end_exclusive(); + break; default: /* Ignore everything else? */ break; diff --git a/accel/tcg/tcg-accel-ops-rr.c b/accel/tcg/tcg-accel-ops-rr.c index 6eec5c9eee..d4bf092736 100644 --- a/accel/tcg/tcg-accel-ops-rr.c +++ b/accel/tcg/tcg-accel-ops-rr.c @@ -32,6 +32,7 @@ #include "qemu/notify.h" #include "qemu/guest-random.h" #include "exec/cpu-common.h" +#include "exec/tb-flush.h" #include "tcg/startup.h" #include "tcg-accel-ops.h" #include "tcg-accel-ops-rr.h" @@ -264,14 +265,18 @@ static void *rr_cpu_thread_fn(void *arg) } bql_lock(); - if (r == EXCP_DEBUG) { + switch (r) { + case EXCP_DEBUG: cpu_handle_guest_debug(cpu); break; - } else if (r == EXCP_ATOMIC) { + case EXCP_ATOMIC: bql_unlock(); cpu_exec_step_atomic(cpu); bql_lock(); break; + case EXCP_TB_FLUSH: + tb_flush__exclusive(); + break; } } else if (cpu->stop) { if (cpu->unplug) { -- 2.43.0