mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
KVM: x86: Exit to userspace if fastpath triggers one on instruction skip
Exit to userspace if a fastpath handler triggers such an exit, which can
happen when skipping the instruction, e.g. due to userspace
single-stepping the guest via KVM_GUESTDBG_SINGLESTEP or because of an
emulation failure.
Fixes: 404d5d7bff ("KVM: X86: Introduce more exit_fastpath_completion enum values")
Link: https://lore.kernel.org/r/20240802195120.325560-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
ea60229af7
commit
f7f39c50ed
|
|
@ -211,6 +211,7 @@ enum exit_fastpath_completion {
|
|||
EXIT_FASTPATH_NONE,
|
||||
EXIT_FASTPATH_REENTER_GUEST,
|
||||
EXIT_FASTPATH_EXIT_HANDLED,
|
||||
EXIT_FASTPATH_EXIT_USERSPACE,
|
||||
};
|
||||
typedef enum exit_fastpath_completion fastpath_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -2206,8 +2206,10 @@ fastpath_t handle_fastpath_set_msr_irqoff(struct kvm_vcpu *vcpu)
|
|||
}
|
||||
|
||||
if (handled) {
|
||||
kvm_skip_emulated_instruction(vcpu);
|
||||
ret = EXIT_FASTPATH_REENTER_GUEST;
|
||||
if (!kvm_skip_emulated_instruction(vcpu))
|
||||
ret = EXIT_FASTPATH_EXIT_USERSPACE;
|
||||
else
|
||||
ret = EXIT_FASTPATH_REENTER_GUEST;
|
||||
trace_kvm_msr_write(msr, data);
|
||||
} else {
|
||||
ret = EXIT_FASTPATH_NONE;
|
||||
|
|
@ -11196,6 +11198,9 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
|||
if (vcpu->arch.apic_attention)
|
||||
kvm_lapic_sync_from_vapic(vcpu);
|
||||
|
||||
if (unlikely(exit_fastpath == EXIT_FASTPATH_EXIT_USERSPACE))
|
||||
return 0;
|
||||
|
||||
r = kvm_x86_call(handle_exit)(vcpu, exit_fastpath);
|
||||
return r;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user