KVM: SVM: Refuse to load kvm_amd if NX support is not available
Refuse to load KVM if NX support is not available. Shadow paging has assumed NX support since commit9167ab7993
("KVM: vmx, svm: always run with EFER.NXE=1 when shadow paging is active"), and NPT has assumed NX support since commitb8e8c8303f
("kvm: mmu: ITLB_MULTIHIT mitigation"). While the NX huge pages mitigation should not be enabled by default for AMD CPUs, it can be turned on by userspace at will. Unlike Intel CPUs, AMD does not provide a way for firmware to disable NX support, and Linux always sets EFER.NX=1 if it is supported. Given that it's extremely unlikely that a CPU supports NPT but not NX, making NX a formal requirement is far simpler than adding requirements to the mitigation flow. Fixes:9167ab7993
("KVM: vmx, svm: always run with EFER.NXE=1 when shadow paging is active") Fixes:b8e8c8303f
("kvm: mmu: ITLB_MULTIHIT mitigation") Signed-off-by: Sean Christopherson <seanjc@google.com> Reviewed-by: Jim Mattson <jmattson@google.com> Message-Id: <20210615164535.2146172-3-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
23f079c249
Коммит
b26a71a1a5
|
@ -952,6 +952,16 @@ static __init int svm_hardware_setup(void)
|
|||
int r;
|
||||
unsigned int order = get_order(IOPM_SIZE);
|
||||
|
||||
/*
|
||||
* NX is required for shadow paging and for NPT if the NX huge pages
|
||||
* mitigation is enabled.
|
||||
*/
|
||||
if (!boot_cpu_has(X86_FEATURE_NX)) {
|
||||
pr_err_ratelimited("NX (Execute Disable) not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
kvm_enable_efer_bits(EFER_NX);
|
||||
|
||||
iopm_pages = alloc_pages(GFP_KERNEL, order);
|
||||
|
||||
if (!iopm_pages)
|
||||
|
@ -965,9 +975,6 @@ static __init int svm_hardware_setup(void)
|
|||
|
||||
supported_xcr0 &= ~(XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_NX))
|
||||
kvm_enable_efer_bits(EFER_NX);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_FXSR_OPT))
|
||||
kvm_enable_efer_bits(EFER_FFXSR);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче