On Tue, Dec 17, 2024, Ivan Orlov wrote: > Add emulation status for unhandleable vectoring, i.e. when KVM can't > emulate an instruction during vectoring. Such a situation can occur > if guest sets the IDT descriptor base to point to MMIO region, and > triggers an exception after that. > > Exit to userspace with event delivery error when KVM can't emulate > an instruction when vectoring an event. > > Signed-off-by: Ivan Orlov <iorlov@xxxxxxxxxx> > --- > V1 -> V2: > - This patch wasn't included in V1. > V2 -> V3: > - Make new X86EMUL_ code more generic to allow using it for any type > of unhandleable vectoring > > arch/x86/kvm/kvm_emulate.h | 2 ++ > arch/x86/kvm/x86.c | 5 +++++ > 2 files changed, 7 insertions(+) > > diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h > index 10495fffb890..5bcf50ffc3de 100644 > --- a/arch/x86/kvm/kvm_emulate.h > +++ b/arch/x86/kvm/kvm_emulate.h > @@ -88,6 +88,8 @@ struct x86_instruction_info { > #define X86EMUL_CMPXCHG_FAILED 4 /* cmpxchg did not see expected value */ > #define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */ > #define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */ > +/* Vectroing can't be emulated */ Typo. I think it's also worth elaborating a bit, e.g. /* Emulation during event vectoring is unsupported */ > +#define X86EMUL_UNHANDLEABLE_VECTORING 7 > > /* x86-specific emulation flags */ > #define X86EMUL_F_WRITE BIT(0) > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 7ce9cdb66f19..849a6fc364b3 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -9107,6 +9107,11 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, > if (r == X86EMUL_RETRY_INSTR || r == X86EMUL_PROPAGATE_FAULT) > return 1; > > + if (r == X86EMUL_UNHANDLEABLE_VECTORING) { > + kvm_prepare_event_vectoring_exit(vcpu, cr2_or_gpa); > + return 0; > + } > + > WARN_ON_ONCE(r != X86EMUL_UNHANDLEABLE); > return handle_emulation_failure(vcpu, emulation_type); > } > -- > 2.43.0 >