Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: do not substitute SVM/VMX check with KVM_CAP_NESTED_STATE check

state_test/smm_test use KVM_CAP_NESTED_STATE check as an indicator for
nested VMX/SVM presence and this is incorrect. Check for the required
features dirrectly.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20200610135847.754289-2-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Vitaly Kuznetsov and committed by
Paolo Bonzini
41a23ab3 77f81f37

+30 -17
+1
tools/testing/selftests/kvm/include/x86_64/svm_util.h
··· 33 33 struct svm_test_data *vcpu_alloc_svm(struct kvm_vm *vm, vm_vaddr_t *p_svm_gva); 34 34 void generic_svm_setup(struct svm_test_data *svm, void *guest_rip, void *guest_rsp); 35 35 void run_guest(struct vmcb *vmcb, uint64_t vmcb_gpa); 36 + bool nested_svm_supported(void); 36 37 void nested_svm_check_supported(void); 37 38 38 39 static inline bool cpu_has_svm(void)
+1
tools/testing/selftests/kvm/include/x86_64/vmx.h
··· 603 603 void prepare_vmcs(struct vmx_pages *vmx, void *guest_rip, void *guest_rsp); 604 604 bool load_vmcs(struct vmx_pages *vmx); 605 605 606 + bool nested_vmx_supported(void); 606 607 void nested_vmx_check_supported(void); 607 608 608 609 void nested_pg_map(struct vmx_pages *vmx, struct kvm_vm *vm,
+7 -3
tools/testing/selftests/kvm/lib/x86_64/svm.c
··· 148 148 : "r15", "memory"); 149 149 } 150 150 151 - void nested_svm_check_supported(void) 151 + bool nested_svm_supported(void) 152 152 { 153 153 struct kvm_cpuid_entry2 *entry = 154 154 kvm_get_supported_cpuid_entry(0x80000001); 155 155 156 - if (!(entry->ecx & CPUID_SVM)) { 156 + return entry->ecx & CPUID_SVM; 157 + } 158 + 159 + void nested_svm_check_supported(void) 160 + { 161 + if (!nested_svm_supported()) { 157 162 print_skip("nested SVM not enabled"); 158 163 exit(KSFT_SKIP); 159 164 } 160 165 } 161 -
+7 -2
tools/testing/selftests/kvm/lib/x86_64/vmx.c
··· 379 379 init_vmcs_guest_state(guest_rip, guest_rsp); 380 380 } 381 381 382 - void nested_vmx_check_supported(void) 382 + bool nested_vmx_supported(void) 383 383 { 384 384 struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1); 385 385 386 - if (!(entry->ecx & CPUID_VMX)) { 386 + return entry->ecx & CPUID_VMX; 387 + } 388 + 389 + void nested_vmx_check_supported(void) 390 + { 391 + if (!nested_vmx_supported()) { 387 392 print_skip("nested VMX not enabled"); 388 393 exit(KSFT_SKIP); 389 394 }
+7 -6
tools/testing/selftests/kvm/x86_64/smm_test.c
··· 118 118 vcpu_set_msr(vm, VCPU_ID, MSR_IA32_SMBASE, SMRAM_GPA); 119 119 120 120 if (kvm_check_cap(KVM_CAP_NESTED_STATE)) { 121 - if (kvm_get_supported_cpuid_entry(0x80000001)->ecx & CPUID_SVM) 121 + if (nested_svm_supported()) 122 122 vcpu_alloc_svm(vm, &nested_gva); 123 - else 123 + else if (nested_vmx_supported()) 124 124 vcpu_alloc_vmx(vm, &nested_gva); 125 - vcpu_args_set(vm, VCPU_ID, 1, nested_gva); 126 - } else { 127 - pr_info("will skip SMM test with VMX enabled\n"); 128 - vcpu_args_set(vm, VCPU_ID, 1, 0); 129 125 } 126 + 127 + if (!nested_gva) 128 + pr_info("will skip SMM test with VMX enabled\n"); 129 + 130 + vcpu_args_set(vm, VCPU_ID, 1, nested_gva); 130 131 131 132 for (stage = 1;; stage++) { 132 133 _vcpu_run(vm, VCPU_ID);
+7 -6
tools/testing/selftests/kvm/x86_64/state_test.c
··· 171 171 vcpu_regs_get(vm, VCPU_ID, &regs1); 172 172 173 173 if (kvm_check_cap(KVM_CAP_NESTED_STATE)) { 174 - if (kvm_get_supported_cpuid_entry(0x80000001)->ecx & CPUID_SVM) 174 + if (nested_svm_supported()) 175 175 vcpu_alloc_svm(vm, &nested_gva); 176 - else 176 + else if (nested_vmx_supported()) 177 177 vcpu_alloc_vmx(vm, &nested_gva); 178 - vcpu_args_set(vm, VCPU_ID, 1, nested_gva); 179 - } else { 180 - pr_info("will skip nested state checks\n"); 181 - vcpu_args_set(vm, VCPU_ID, 1, 0); 182 178 } 179 + 180 + if (!nested_gva) 181 + pr_info("will skip nested state checks\n"); 182 + 183 + vcpu_args_set(vm, VCPU_ID, 1, nested_gva); 183 184 184 185 for (stage = 1;; stage++) { 185 186 _vcpu_run(vm, VCPU_ID);