]> exis.tech > repos - linux.git/commitdiff
KVM: selftests: sev_init2_tests: Derive SEV availability from KVM
authorDavid Woodhouse <dwmw@amazon.co.uk>
Mon, 20 Jul 2026 11:03:03 +0000 (12:03 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 21 Jul 2026 10:25:27 +0000 (12:25 +0200)
The test asserted that the X86_FEATURE_SEV CPUID bit exactly matches
whether KVM offers KVM_X86_SEV_VM.  That is not an invariant: when all
SEV ASIDs are assigned to SEV-SNP, KVM does not offer the SEV VM type
even though CPUID reports SEV, so the test aborts on an SNP-only host.

Derive SEV availability from KVM_CAP_VM_TYPES (as already done for SEV-ES
and SNP), assert only the one-way implication that a type offered by KVM
is also reported in CPUID, and TEST_REQUIRE() the SEV VM type so the test
skips cleanly when it is unavailable.

Reviewed-by: Tycho Andersen (AMD) <tycho@kernel.org>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Message-ID: <5d3c345113748f39b7982e365d241abaf3e11086.1784545391.git.dwmw@amazon.co.uk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/x86/sev_init2_tests.c

index 8db88c355f1654525822700657b492ad025e2580..689390c10f7c37a5905085862247c3eb868d6960 100644 (file)
@@ -130,12 +130,18 @@ int main(int argc, char *argv[])
                            KVM_X86_SEV_VMSA_FEATURES,
                            &supported_vmsa_features);
 
-       have_sev = kvm_cpu_has(X86_FEATURE_SEV);
-       TEST_ASSERT(have_sev == !!(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM)),
-                   "sev: KVM_CAP_VM_TYPES (%x) does not match cpuid (checking %x)",
-                   kvm_check_cap(KVM_CAP_VM_TYPES), 1 << KVM_X86_SEV_VM);
+       /*
+        * Whether a VM type is available depends on KVM, not just CPUID: e.g.
+        * when all SEV ASIDs are assigned to SEV-SNP, KVM does not offer the
+        * SEV VM type even though X86_FEATURE_SEV is set.  Derive availability
+        * from KVM_CAP_VM_TYPES and only assert the one-way implication that a
+        * type offered by KVM must also be reported in CPUID.
+        */
+       have_sev = kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM);
+       TEST_ASSERT(!have_sev || kvm_cpu_has(X86_FEATURE_SEV),
+                   "sev: SEV_VM supported without SEV in CPUID");
 
-       TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM));
+       TEST_REQUIRE(have_sev);
        have_sev_es = kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_ES_VM);
 
        TEST_ASSERT(!have_sev_es || kvm_cpu_has(X86_FEATURE_SEV_ES),