Re: [PATCH v3 2/7] KVM: x86: Add emulation status for unhandleable vectoring

From: Sean Christopherson
Date: Wed Dec 18 2024 - 13:24:17 EST


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
>