From: David Woodhouse <[email protected]>

sev_smoke_test ran the plain SEV subtest unconditionally, gated only on
the X86_FEATURE_SEV CPUID bit, while gating SEV-ES and SNP on the
KVM_CAP_VM_TYPES bits.  CPUID reporting SEV does not mean KVM offers the
SEV VM type: when all SEV ASIDs are assigned to SEV-SNP, KVM_X86_SEV_VM
is unavailable even though X86_FEATURE_SEV is set.  On such a host the
test aborts in KVM_CREATE_VM instead of exercising the available modes.

Gate the SEV subtest on KVM_CAP_VM_TYPES like the others, so the test
runs the VM types the host actually offers.

Signed-off-by: David Woodhouse <[email protected]>
---
 tools/testing/selftests/kvm/x86/sev_smoke_test.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/x86/sev_smoke_test.c 
b/tools/testing/selftests/kvm/x86/sev_smoke_test.c
index 6b2cbe2a90b7..bf27b6187afa 100644
--- a/tools/testing/selftests/kvm/x86/sev_smoke_test.c
+++ b/tools/testing/selftests/kvm/x86/sev_smoke_test.c
@@ -247,7 +247,14 @@ int main(int argc, char *argv[])
 {
        TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV));
 
-       test_sev_smoke(guest_sev_code, KVM_X86_SEV_VM, 0);
+       /*
+        * Only exercise VM types the host actually offers.  CPUID reporting
+        * SEV does not guarantee KVM offers the SEV VM type: when all SEV
+        * ASIDs are assigned to SEV-SNP, KVM_X86_SEV_VM is unavailable even
+        * though X86_FEATURE_SEV is set.  Gate every type on KVM_CAP_VM_TYPES.
+        */
+       if (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_VM))
+               test_sev_smoke(guest_sev_code, KVM_X86_SEV_VM, 0);
 
        if (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SEV_ES_VM))
                test_sev_smoke(guest_sev_es_code, KVM_X86_SEV_ES_VM, 
SEV_POLICY_ES);

base-commit: 0e35b9b6ec0ffcc5e23cbdec09f5c622ad532b53
-- 
2.54.0

Reply via email to