From: Paolo Bonzini Date: Sat, 25 May 2024 08:47:31 +0000 (+0200) Subject: target/i386: fix INHIBIT_IRQ/TF/RF handling for PAUSE X-Git-Tag: qemu-xen-4.20.0~119^2~34 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=3718523d011e898d414f09a4ed43cf13d76de0b4;p=qemu-xen.git target/i386: fix INHIBIT_IRQ/TF/RF handling for PAUSE PAUSE uses DISAS_NORETURN because the corresponding helper calls cpu_loop_exit(). However, while HLT clear HF_INHIBIT_IRQ_MASK to correctly handle "STI; HLT", the same is missing from PAUSE. And also gen_eob() clears HF_RF_MASK and synthesizes a #DB exception if single-step is active; none of this is done by HLT and PAUSE. Start fixing PAUSE, HLT will follow. Signed-off-by: Paolo Bonzini --- diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c index 8316d42ffc..ed4cda8001 100644 --- a/target/i386/tcg/misc_helper.c +++ b/target/i386/tcg/misc_helper.c @@ -92,6 +92,10 @@ G_NORETURN void helper_pause(CPUX86State *env) { CPUState *cs = env_cpu(env); + /* Do gen_eob() tasks before going back to the main loop. */ + do_end_instruction(env); + helper_rechecking_single_step(env); + /* Just let another CPU run. */ cs->exception_index = EXCP_INTERRUPT; cpu_loop_exit(cs);