qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Ruihan Li <lrh2000@pku.edu.cn>,
	Richard Henderson <richard.henderson@linaro.org>
Subject: [PULL 01/46] target/i386: Give IRQs a chance when resetting HF_INHIBIT_IRQ_MASK
Date: Mon,  6 May 2024 09:50:40 +0200	[thread overview]
Message-ID: <20240506075125.8238-2-pbonzini@redhat.com> (raw)
In-Reply-To: <20240506075125.8238-1-pbonzini@redhat.com>

From: Ruihan Li <lrh2000@pku.edu.cn>

When emulated with QEMU, interrupts will never come in the following
loop. However, if the NOP instruction is uncommented, interrupts will
fire as normal.

	loop:
		cli
    		call do_sti
		jmp loop

	do_sti:
		sti
		# nop
		ret

This behavior is different from that of a real processor. For example,
if KVM is enabled, interrupts will always fire regardless of whether the
NOP instruction is commented or not. Also, the Intel Software Developer
Manual states that after the STI instruction is executed, the interrupt
inhibit should end as soon as the next instruction (e.g., the RET
instruction if the NOP instruction is commented) is executed.

This problem is caused because the previous code may choose not to end
the TB even if the HF_INHIBIT_IRQ_MASK has just been reset (e.g., in the
case where the STI instruction is immediately followed by the RET
instruction), so that IRQs may not have a change to trigger. This commit
fixes the problem by always terminating the current TB to give IRQs a
chance to trigger when HF_INHIBIT_IRQ_MASK is reset.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Ruihan Li <lrh2000@pku.edu.cn>
Message-ID: <20240415064518.4951-4-lrh2000@pku.edu.cn>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 target/i386/tcg/translate.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
index c05d9e52259..051ffb5e1fd 100644
--- a/target/i386/tcg/translate.c
+++ b/target/i386/tcg/translate.c
@@ -2798,13 +2798,17 @@ static void gen_bnd_jmp(DisasContext *s)
 static void
 do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr)
 {
+    bool inhibit_reset;
+
     gen_update_cc_op(s);
 
     /* If several instructions disable interrupts, only the first does it.  */
-    if (inhibit && !(s->flags & HF_INHIBIT_IRQ_MASK)) {
-        gen_set_hflag(s, HF_INHIBIT_IRQ_MASK);
-    } else {
+    inhibit_reset = false;
+    if (s->flags & HF_INHIBIT_IRQ_MASK) {
         gen_reset_hflag(s, HF_INHIBIT_IRQ_MASK);
+        inhibit_reset = true;
+    } else if (inhibit) {
+        gen_set_hflag(s, HF_INHIBIT_IRQ_MASK);
     }
 
     if (s->base.tb->flags & HF_RF_MASK) {
@@ -2815,7 +2819,9 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr)
         tcg_gen_exit_tb(NULL, 0);
     } else if (s->flags & HF_TF_MASK) {
         gen_helper_single_step(tcg_env);
-    } else if (jr) {
+    } else if (jr &&
+               /* give irqs a chance to happen */
+               !inhibit_reset) {
         tcg_gen_lookup_and_goto_ptr();
     } else {
         tcg_gen_exit_tb(NULL, 0);
-- 
2.44.0



  reply	other threads:[~2024-05-06  7:53 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-06  7:50 [PULL 00/46] Mostly build system and other cleanups patches for 2024-05-06 Paolo Bonzini
2024-05-06  7:50 ` Paolo Bonzini [this message]
2024-05-06  7:50 ` [PULL 02/46] Kconfig: kvm: allow building without any board Paolo Bonzini
2024-05-06  7:50 ` [PULL 03/46] tests/qtest: skip m48t59-test if the machine is absent Paolo Bonzini
2024-05-06  7:50 ` [PULL 04/46] gitlab-ci: adjust msys2-64bit to be able to run qtest Paolo Bonzini
2024-05-06  7:50 ` [PULL 05/46] kvm: ppc: disable sPAPR code if CONFIG_PSERIES is disabled Paolo Bonzini
2024-05-06  7:50 ` [PULL 06/46] configs: list "implied" device groups in the default configs Paolo Bonzini
2024-05-06  7:50 ` [PULL 07/46] alpha: switch boards to "default y" Paolo Bonzini
2024-05-06  7:50 ` [PULL 08/46] arm: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 09/46] avr: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 10/46] cris: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 11/46] hppa: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 12/46] i386: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 13/46] loongarch: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 14/46] m68k: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 15/46] microblaze: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 16/46] meson: make target endianneess available to Kconfig Paolo Bonzini
2024-05-06  7:50 ` [PULL 17/46] mips: switch boards to "default y" Paolo Bonzini
2024-05-06  7:50 ` [PULL 18/46] openrisc: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 19/46] ppc: " Paolo Bonzini
2024-05-06  7:50 ` [PULL 20/46] riscv: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 21/46] rx: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 22/46] s390x: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 23/46] sh4: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 24/46] sparc: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 25/46] tricore: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 26/46] xtensa: " Paolo Bonzini
2024-05-06  7:51 ` [PULL 27/46] docs: document new convention for Kconfig board symbols Paolo Bonzini
2024-05-06  7:51 ` [PULL 28/46] target/i386: Introduce SapphireRapids-v3 to add missing features Paolo Bonzini
2024-05-06  7:51 ` [PULL 29/46] bitmap: Use g_try_new0/g_new0/g_renew Paolo Bonzini
2024-05-06  7:51 ` [PULL 30/46] build: do not build virtio-vga-gl if virgl/opengl not available Paolo Bonzini
2024-05-06  7:51 ` [PULL 31/46] fw_cfg: remove useless declarations from typedefs.h Paolo Bonzini
2024-05-06  7:51 ` [PULL 32/46] qdev-core: remove DeviceListener " Paolo Bonzini
2024-05-06  7:51 ` [PULL 33/46] numa: remove types " Paolo Bonzini
2024-05-06  7:51 ` [PULL 34/46] net: remove AnnounceTimer " Paolo Bonzini
2024-05-06  7:51 ` [PULL 35/46] qemu-option: remove QemuOpt " Paolo Bonzini
2024-05-06  7:51 ` [PULL 36/46] intc: remove PICCommonState " Paolo Bonzini
2024-05-06  7:51 ` [PULL 37/46] lockable: remove QemuLockable " Paolo Bonzini
2024-05-06  7:51 ` [PULL 38/46] migration: remove PostcopyDiscardState " Paolo Bonzini
2024-05-06  7:51 ` [PULL 39/46] monitor: remove MonitorDef " Paolo Bonzini
2024-05-06  7:51 ` [PULL 40/46] qapi/machine: remove types " Paolo Bonzini
2024-05-06  7:51 ` [PULL 41/46] display: remove GraphicHwOps " Paolo Bonzini
2024-05-06  7:51 ` [PULL 42/46] tcg: remove CPU* types " Paolo Bonzini
2024-05-06  7:51 ` [PULL 43/46] pci: remove some " Paolo Bonzini
2024-05-06  7:51 ` [PULL 44/46] kvm: move target-dependent interrupt routing out of kvm-all.c Paolo Bonzini
2024-05-06  7:51 ` [PULL 45/46] migration: do not include coroutine_int.h Paolo Bonzini
2024-05-06  7:51 ` [PULL 46/46] qga/commands-posix: fix typo in qmp_guest_set_user_password Paolo Bonzini
2024-05-06 17:17 ` [PULL 00/46] Mostly build system and other cleanups patches for 2024-05-06 Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240506075125.8238-2-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=lrh2000@pku.edu.cn \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).