[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 08/11] target/i386: fix INHIBIT_IRQ/TF/RF handling for PAUSE
From: |
Paolo Bonzini |
Subject: |
[PATCH 08/11] target/i386: fix INHIBIT_IRQ/TF/RF handling for PAUSE |
Date: |
Tue, 4 Jun 2024 09:18:30 +0200 |
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>
---
target/i386/tcg/misc_helper.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c
index 8316d42ffcd..ed4cda8001e 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);
--
2.45.1
- Re: [PATCH 05/11] target/i386: implement DR7.GD, (continued)
[PATCH 10/11] target/i386: document incorrect semantics of watchpoint following MOV/POP SS, Paolo Bonzini, 2024/06/04
[PATCH 11/11] target/i386: document use of DISAS_NORETURN, Paolo Bonzini, 2024/06/04