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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 




[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux