diff --git a/cpus.c b/cpus.c index dd2fc29afa..e4079103ce 100644 --- a/cpus.c +++ b/cpus.c @@ -1090,6 +1090,12 @@ static void qemu_cpu_kick_thread(CPUState *cpu) #ifndef _WIN32 int err; + if (!tcg_enabled()) { + if (cpu->thread_kicked) { + return; + } + cpu->thread_kicked = true; + } err = pthread_kill(cpu->thread->thread, SIG_IPI); if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); @@ -1127,21 +1133,14 @@ static void qemu_cpu_kick_thread(CPUState *cpu) void qemu_cpu_kick(CPUState *cpu) { qemu_cond_broadcast(cpu->halt_cond); - if (!tcg_enabled() && !cpu->thread_kicked) { - qemu_cpu_kick_thread(cpu); - cpu->thread_kicked = true; - } + qemu_cpu_kick_thread(cpu); } void qemu_cpu_kick_self(void) { #ifndef _WIN32 assert(current_cpu); - - if (!current_cpu->thread_kicked) { - qemu_cpu_kick_thread(current_cpu); - current_cpu->thread_kicked = true; - } + qemu_cpu_kick_thread(current_cpu); #else abort(); #endif diff --git a/gdbstub.c b/gdbstub.c index ffe7e6efb2..a5a173ab45 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1362,7 +1362,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...) is still in the running state, which can cause packets to be dropped and state transition 'T' packets to be sent while the syscall is still being processed. */ - cpu_exit(s->c_cpu); + qemu_cpu_kick(s->c_cpu); #endif } diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 2986f94f03..9869bc9587 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -214,7 +214,7 @@ static void rtas_stop_self(PowerPCCPU *cpu, sPAPRMachineState *spapr, CPUPPCState *env = &cpu->env; cs->halted = 1; - cpu_exit(cs); + qemu_cpu_kick(cs); /* * While stopping a CPU, the guest calls H_CPPR which * effectively disables interrupts on XICS level.