Skip to content

Commit ecb89a5

Browse files
dmatlacksean-jc
authored andcommitted
KVM: selftests: Check for KVM nEPT support using "feature" MSRs
When checking for nEPT support in KVM, use kvm_get_feature_msr() instead of vcpu_get_msr() to retrieve KVM's default TRUE_PROCBASED_CTLS and PROCBASED_CTLS2 MSR values, i.e. don't require a VM+vCPU to query nEPT support. Suggested-by: Sean Christopherson <[email protected]> Signed-off-by: David Matlack <[email protected]> Link: https://lore.kernel.org/r/[email protected] [sean: rebase on merged code, write changelog] Signed-off-by: Sean Christopherson <[email protected]>
1 parent b941ba2 commit ecb89a5

File tree

2 files changed

+5
-9
lines changed
  • tools/testing/selftests/kvm

2 files changed

+5
-9
lines changed

tools/testing/selftests/kvm/include/x86_64/vmx.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ void nested_map_memslot(struct vmx_pages *vmx, struct kvm_vm *vm,
572572
uint32_t memslot);
573573
void nested_identity_map_1g(struct vmx_pages *vmx, struct kvm_vm *vm,
574574
uint64_t addr, uint64_t size);
575-
bool kvm_vm_has_ept(struct kvm_vm *vm);
575+
bool kvm_cpu_has_ept(void);
576576
void prepare_eptp(struct vmx_pages *vmx, struct kvm_vm *vm,
577577
uint32_t eptp_memslot);
578578
void prepare_virtualize_apic_accesses(struct vmx_pages *vmx, struct kvm_vm *vm);

tools/testing/selftests/kvm/lib/x86_64/vmx.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -544,26 +544,22 @@ void nested_identity_map_1g(struct vmx_pages *vmx, struct kvm_vm *vm,
544544
__nested_map(vmx, vm, addr, addr, size, PG_LEVEL_1G);
545545
}
546546

547-
bool kvm_vm_has_ept(struct kvm_vm *vm)
547+
bool kvm_cpu_has_ept(void)
548548
{
549-
struct kvm_vcpu *vcpu;
550549
uint64_t ctrl;
551550

552-
vcpu = list_first_entry(&vm->vcpus, struct kvm_vcpu, list);
553-
TEST_ASSERT(vcpu, "Cannot determine EPT support without vCPUs.\n");
554-
555-
ctrl = vcpu_get_msr(vcpu, MSR_IA32_VMX_TRUE_PROCBASED_CTLS) >> 32;
551+
ctrl = kvm_get_feature_msr(MSR_IA32_VMX_TRUE_PROCBASED_CTLS) >> 32;
556552
if (!(ctrl & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS))
557553
return false;
558554

559-
ctrl = vcpu_get_msr(vcpu, MSR_IA32_VMX_PROCBASED_CTLS2) >> 32;
555+
ctrl = kvm_get_feature_msr(MSR_IA32_VMX_PROCBASED_CTLS2) >> 32;
560556
return ctrl & SECONDARY_EXEC_ENABLE_EPT;
561557
}
562558

563559
void prepare_eptp(struct vmx_pages *vmx, struct kvm_vm *vm,
564560
uint32_t eptp_memslot)
565561
{
566-
TEST_REQUIRE(kvm_vm_has_ept(vm));
562+
TEST_REQUIRE(kvm_cpu_has_ept());
567563

568564
vmx->eptp = (void *)vm_vaddr_alloc_page(vm);
569565
vmx->eptp_hva = addr_gva2hva(vm, (uintptr_t)vmx->eptp);

0 commit comments

Comments
 (0)