Emilio G. Cota <c...@braap.org> writes:
> Reviewed-by: Richard Henderson <richard.hender...@linaro.org> > Signed-off-by: Emilio G. Cota <c...@braap.org> > --- > accel/tcg/cpu-exec.c | 25 +++++++++++++++++++++---- > 1 file changed, 21 insertions(+), 4 deletions(-) > > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c > index 6c4a33262f..e3d72897e8 100644 > --- a/accel/tcg/cpu-exec.c > +++ b/accel/tcg/cpu-exec.c > @@ -425,14 +425,21 @@ static inline TranslationBlock *tb_find(CPUState *cpu, > return tb; > } > > -static inline bool cpu_handle_halt(CPUState *cpu) > +static inline bool cpu_handle_halt_locked(CPUState *cpu) > { > - if (cpu->halted) { > + g_assert(cpu_mutex_locked(cpu)); > + > + if (cpu_halted(cpu)) { > #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY) > if ((cpu->interrupt_request & CPU_INTERRUPT_POLL) > && replay_interrupt()) { > X86CPU *x86_cpu = X86_CPU(cpu); > + > + /* prevent deadlock; cpu_mutex must be acquired _after_ the BQL > */ > + cpu_mutex_unlock(cpu); > qemu_mutex_lock_iothread(); > + cpu_mutex_lock(cpu); > + *sigh* this is still fugly code I wish we could abstract out of the common code path. But I guess x86 wants to be special.... Nevertheless: Reviewed-by: Alex Bennée <alex.ben...@linaro.org> > apic_poll_irq(x86_cpu->apic_state); > cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL); > qemu_mutex_unlock_iothread(); > @@ -442,12 +449,22 @@ static inline bool cpu_handle_halt(CPUState *cpu) > return true; > } > > - cpu->halted = 0; > + cpu_halted_set(cpu, 0); > } > > return false; > } > > +static inline bool cpu_handle_halt(CPUState *cpu) > +{ > + bool ret; > + > + cpu_mutex_lock(cpu); > + ret = cpu_handle_halt_locked(cpu); > + cpu_mutex_unlock(cpu); > + return ret; > +} > + > static inline void cpu_handle_debug_exception(CPUState *cpu) > { > CPUClass *cc = CPU_GET_CLASS(cpu); > @@ -546,7 +563,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu, > } else if (interrupt_request & CPU_INTERRUPT_HALT) { > replay_interrupt(); > cpu->interrupt_request &= ~CPU_INTERRUPT_HALT; > - cpu->halted = 1; > + cpu_halted_set(cpu, 1); > cpu->exception_index = EXCP_HLT; > qemu_mutex_unlock_iothread(); > return true; -- Alex Bennée