On Mon, May 05, 2025, Ashish Kalra wrote:
On 5/5/2025 6:15 PM, Sean Christopherson wrote:
@@ -3067,12 +3075,6 @@ void __init sev_hardware_setup(void) if (!sev_enabled) return;
/*
* Do both SNP and SEV initialization at KVM module load.
*/
init_args.probe = true;
sev_platform_init(&init_args);
} void sev_hardware_unsetup(void) --
Ashish, what am I missing?
As far as setting sev*_enabled is concerned, i believe they are more specific to SNP/SEV/SEV-ES being enabled in the system, which is separate from SEV_INIT/SNP_INIT (SNP_INIT success indicates that RMP been initialized, SNP has to be already enabled via MSR_SYSCFG before SNP_INIT is called), though SEV_INIT/SNP_INIT may fail but SEV/SNP support will still be enabled on the system.
No, if SNP_INIT fails and has zero chance of succeeding, then SNP is *NOT* supported *by KVM*. The platform may be configured to support SNP, but that matters not at all if KVM can't actually use the functionality.
Additionally as SEV_INIT/SNP_INIT during sev_platform_init() have failed, so any SEV/SEV-ES/SNP VM launch will fail as the firmware will return invalid platform state as INITs have failed.
Yeah, and that's *awful* behavior for KVM. Imagine if KVM did that for every feature, i.e. enumerated hardware support irrespective of KVM support.
The API is KVM_GET_SUPPORTED_CPUID, not KVM_GET_MOSTLY_SUPPORTED_CPUID.
From my understanding, sev*_enabled indicates the user support to enable/disable support for SEV/SEV-ES/SEV-SNP,
Yes, and they're also used to reflect and enumerate KVM support:
if (sev_enabled) { kvm_cpu_cap_set(X86_FEATURE_SEV); kvm_caps.supported_vm_types |= BIT(KVM_X86_SEV_VM); } if (sev_es_enabled) { kvm_cpu_cap_set(X86_FEATURE_SEV_ES); kvm_caps.supported_vm_types |= BIT(KVM_X86_SEV_ES_VM); } if (sev_snp_enabled) { kvm_cpu_cap_set(X86_FEATURE_SEV_SNP); kvm_caps.supported_vm_types |= BIT(KVM_X86_SNP_VM); }
as the sev*_enabled are the KVM module parameters, while sev*_supported indicates if platform has that support enabled.
sev*_supported are completely irrelevant. They are function local scratch variables that exist so that KVM doesn't clobber userspace's inputs while computing what is fully supported and enabled.
And before the SEV/SNP init support was moved to KVM from CCP module, doing SEV/SNP INIT could fail but that still had KVM detecting SEV/SNP support enabled, so this moving SEV/SNP init stuff to KVM module from CCP driver is consistent with the previous behavior.
And one of my driving motivations for getting the initialization into KVM was to fix that previous behavior.