qemu/target/i386
Ruihan Li 6a5a63f74b target/i386: Give IRQs a chance when resetting HF_INHIBIT_IRQ_MASK
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>
2024-05-03 14:15:48 +02:00
..
hvf accel/hvf: Use accel-specific per-vcpu @dirty field 2024-04-26 17:03:00 +02:00
kvm target/i386: SEV: use KVM_SEV_INIT2 if possible 2024-04-23 17:35:25 +02:00
nvmm accel/nvmm: Use accel-specific per-vcpu @dirty field 2024-04-26 17:02:56 +02:00
tcg target/i386: Give IRQs a chance when resetting HF_INHIBIT_IRQ_MASK 2024-05-03 14:15:48 +02:00
whpx accel/whpx: Use accel-specific per-vcpu @dirty field 2024-04-26 17:02:24 +02:00
arch_dump.c
arch_memory_mapping.c memory: follow Error API guidelines 2023-10-19 23:13:27 +02:00
confidential-guest.c target/i386: introduce x86-confidential-guest 2024-04-23 17:35:25 +02:00
confidential-guest.h target/i386: Implement mc->kvm_type() to get VM type 2024-04-23 17:35:25 +02:00
cpu-apic.c target/i386: Move APIC related code to cpu-apic.c 2024-04-25 10:12:54 +02:00
cpu-dump.c
cpu-internal.h
cpu-param.h target: Define TCG_GUEST_DEFAULT_MO in 'cpu-param.h' 2024-04-26 15:31:37 +02:00
cpu-qom.h target: Move ArchCPUClass definition to 'cpu.h' 2023-11-07 13:08:48 +01:00
cpu-sysemu.c target/i386: Move APIC related code to cpu-apic.c 2024-04-25 10:12:54 +02:00
cpu.c target/i386/cpu: Remove "x86" prefix from the CPU list 2024-04-29 09:37:26 +03:00
cpu.h target: Define TCG_GUEST_DEFAULT_MO in 'cpu-param.h' 2024-04-26 15:31:37 +02:00
gdbstub.c gdbstub: move register helpers into standalone include 2023-03-07 20:44:08 +00:00
helper.c target/i386: Revert monitor_puts() in do_inject_x86_mce() 2024-03-20 09:47:00 +01:00
helper.h target/i386: implement SYSCALL/SYSRET in 32-bit emulators 2023-06-26 10:23:56 +02:00
host-cpu.c target/i386/host-cpu: Consolidate the use of warn_report_once() 2024-04-23 17:35:26 +02:00
host-cpu.h
Kconfig
machine.c target/i386: Constify VMState in machine.c 2023-12-29 11:17:30 +11:00
meson.build target/i386: Move APIC related code to cpu-apic.c 2024-04-25 10:12:54 +02:00
monitor.c target/i386: Move APIC related code to cpu-apic.c 2024-04-25 10:12:54 +02:00
ops_sse.h target/i386: implement SHA instructions 2023-10-25 17:35:07 +02:00
sev-sysemu-stub.c
sev.c hw/i386/sev: Use legacy SEV VM types for older machine types 2024-04-23 17:35:25 +02:00
sev.h i386/sev: Switch to use confidential_guest_kvm_init() 2024-04-23 17:35:25 +02:00
svm.h target/i386: check intercept for XSETBV 2023-10-17 15:20:53 +02:00
trace-events
trace.h
xsave_helper.c