On Fri, Feb 23, 2024, Paolo Bonzini wrote: > Allow the backend to specify which VM types are supported. Hmm, rather than another kvm_x86_ops hook, I vote to add kvm_caps.supported_vm_types, and use the existing harware_setup() hook to fill in the vendor specific types. As a very incomplete stub: diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3bc69b0c9822..bb7d979db2df 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4576,17 +4576,9 @@ static int kvm_ioctl_get_supported_hv_cpuid(struct kvm_vcpu *vcpu, } #endif -static inline bool __kvm_is_vm_type_supported(unsigned long type) -{ - return type == KVM_X86_DEFAULT_VM || - (type == KVM_X86_SW_PROTECTED_VM && - IS_ENABLED(CONFIG_KVM_SW_PROTECTED_VM) && tdp_mmu_enabled); -} - static bool kvm_is_vm_type_supported(unsigned long type) { - return __kvm_is_vm_type_supported(type) || - static_call(kvm_x86_is_vm_type_supported)(type); + return kvm_caps.supported_vm_types & BIT(type); } int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) @@ -4787,13 +4779,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) r = kvm_caps.has_notify_vmexit; break; case KVM_CAP_VM_TYPES: - r = BIT(KVM_X86_DEFAULT_VM); - if (kvm_is_vm_type_supported(KVM_X86_SW_PROTECTED_VM)) - r |= BIT(KVM_X86_SW_PROTECTED_VM); - if (kvm_is_vm_type_supported(KVM_X86_SEV_VM)) - r |= BIT(KVM_X86_SEV_VM); - if (kvm_is_vm_type_supported(KVM_X86_SEV_ES_VM)) - r |= BIT(KVM_X86_SEV_ES_VM); + r = kvm_caps.supported_vm_types; break; default: break; diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 2f7e19166658..802ac1ead055 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -29,6 +29,8 @@ struct kvm_caps { u64 supported_xcr0; u64 supported_xss; u64 supported_perf_cap; + + u32 supported_vm_types; }; void kvm_spurious_fault(void);