Sean Christopherson <seanjc@xxxxxxxxxx> writes: > On Thu, Jul 14, 2022, Vitaly Kuznetsov wrote: >> SECONDARY_EXEC_ENCLS_EXITING is conditionally added to the 'optional' >> checklist in setup_vmcs_config() but there's little value in doing so. >> First, as the control is optional, we can always check for its >> presence, no harm done. Second, the only real value cpu_has_sgx() check >> gives is that on the CPUs which support SECONDARY_EXEC_ENCLS_EXITING but >> don't support SGX, the control is not getting enabled. It's highly unlikely >> such CPUs exist but it's possible that some hypervisors expose broken vCPU >> models. > > It's not just broken vCPU models, SGX can be "soft-disabled" on bare metal, e.g. if > software writes MCE control MSRs or there's an uncorrectable #MC (may not be the > case on all platforms). This is architectural behavior and needs to be handled in > KVM. Obviously if SGX gets disabled after KVM is loaded then we're out of luck, but > having the ENCL-exiting control without SGX being enabled is 100% valid. > > As for why KVM bothers with the check, it's to work around a suspected hardware > or XuCode bug (I'm still a bit shocked that's public now :-) ) where SGX got > _hard_ disabled across S3 on some CPUs and made the fields magically disappear. > The workaround was to soft-disable SGX in BIOS so that KVM wouldn't attempt to > enable the ENCLS-exiting control Oh, thanks for this insight, I had no idea! I'll adjust my commit message accordingly. > >> Preserve cpu_has_sgx() check but filter the result of adjust_vmx_controls() >> instead of the input. >> >> Reviewed-by: Jim Mattson <jmattson@xxxxxxxxxx> >> Reviewed-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx> >> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> >> --- >> arch/x86/kvm/vmx/vmx.c | 9 ++++++--- >> 1 file changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c >> index ce54f13d8da1..566be73c6509 100644 >> --- a/arch/x86/kvm/vmx/vmx.c >> +++ b/arch/x86/kvm/vmx/vmx.c >> @@ -2528,9 +2528,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, >> SECONDARY_EXEC_PT_CONCEAL_VMX | >> SECONDARY_EXEC_ENABLE_VMFUNC | >> SECONDARY_EXEC_BUS_LOCK_DETECTION | >> - SECONDARY_EXEC_NOTIFY_VM_EXITING; >> - if (cpu_has_sgx()) >> - opt2 |= SECONDARY_EXEC_ENCLS_EXITING; >> + SECONDARY_EXEC_NOTIFY_VM_EXITING | >> + SECONDARY_EXEC_ENCLS_EXITING; >> + >> if (adjust_vmx_controls(min2, opt2, >> MSR_IA32_VMX_PROCBASED_CTLS2, >> &_cpu_based_2nd_exec_control) < 0) >> @@ -2577,6 +2577,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, >> vmx_cap->vpid = 0; >> } >> >> + if (!cpu_has_sgx()) >> + _cpu_based_2nd_exec_control &= ~SECONDARY_EXEC_ENCLS_EXITING; >> + >> if (_cpu_based_exec_control & CPU_BASED_ACTIVATE_TERTIARY_CONTROLS) { >> u64 opt3 = TERTIARY_EXEC_IPI_VIRT; >> >> -- >> 2.35.3 >> > -- Vitaly