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>
This commit is contained in:
parent
1a150d331d
commit
3718523d01
@ -92,6 +92,10 @@ G_NORETURN void helper_pause(CPUX86State *env)
|
|||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(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. */
|
/* Just let another CPU run. */
|
||||||
cs->exception_index = EXCP_INTERRUPT;
|
cs->exception_index = EXCP_INTERRUPT;
|
||||||
cpu_loop_exit(cs);
|
cpu_loop_exit(cs);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user