In em_{rd,wr}msr(), it returns X86EMUL_IO_NEEDED if MSR accesses needed to exit to userspace. However, x86_emulate_insn() doesn't return X86EMUL_*, so x86_emulate_instruction() doesn't directly act on X86EMUL_IO_NEEDED, it instead looks for other signals to differentiate between PIO, MMIO, etc... So RDMSR/WRMSR emulation won't exit to userspace now. The userspace_msr_exit_test testcase in seftests had tested RDMSR/WRMSR emulation with kvm.force_enable_prefix enabled and it was passed. Because x86_emulate_instruction() returns 1 and guest continues, but RIP has been updated to point to RDMSR/WRMSR. Then guest would execute RDMSR/WRMSR and exit to userspace by kvm_emulate_{rd,wr}msr() finally. In such situation, instruction emulation didn't take effect but userspace exit information had been filled, which was inappropriate. Since X86EMUL_IO_NEEDED path would provide a complete_userspace_io callback, x86_emulate_instruction() should return 0 if callback is not NULL. Then RDMSR/WRMSR instruction emulation can exit to userspace and skip RDMSR/WRMSR execution and inteception. Fixes: 1ae099540e8c7 ("KVM: x86: Allow deflecting unknown MSR accesses to user space") Signed-off-by: Hou Wenlong <houwenlong93@xxxxxxxxxxxxxxxxx> --- arch/x86/kvm/x86.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 5eadf5ddba3e..f5573f010a8e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8214,6 +8214,9 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, writeback = false; r = 0; vcpu->arch.complete_userspace_io = complete_emulated_mmio; + } else if (vcpu->arch.complete_userspace_io) { + writeback = false; + r = 0; } else if (r == EMULATION_RESTART) goto restart; else -- 2.31.1