[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Z2MTNcV_MK_myHPh@google.com>
Date: Wed, 18 Dec 2024 10:23:49 -0800
From: Sean Christopherson <seanjc@...gle.com>
To: Ivan Orlov <iorlov@...zon.com>
Cc: bp@...en8.de, dave.hansen@...ux.intel.com, mingo@...hat.com,
pbonzini@...hat.com, shuah@...nel.org, tglx@...utronix.de, hpa@...or.com,
kvm@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-kselftest@...r.kernel.org, x86@...nel.org, dwmw@...zon.co.uk,
pdurrant@...zon.co.uk, jalliste@...zon.co.uk
Subject: Re: [PATCH v3 2/7] KVM: x86: Add emulation status for unhandleable vectoring
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@...zon.com>
> ---
> 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
>
Powered by blists - more mailing lists