Browse Source

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 <pbonzini@redhat.com>
pull/267/head
Paolo Bonzini 2 years ago
parent
commit
3718523d01
  1. 4
      target/i386/tcg/misc_helper.c

4
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);

Loading…
Cancel
Save