selftests: kvm: switch to using KVM_X86_*_VM
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Apr 2024 12:13:25 +0000 (08:13 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 11 Apr 2024 17:08:27 +0000 (13:08 -0400)
This removes the concept of "subtypes", instead letting the tests use proper
VM types that were recently added.  While the sev_init_vm() and sev_es_init_vm()
are still able to operate with the legacy KVM_SEV_INIT and KVM_SEV_ES_INIT
ioctls, this is limited to VMs that are created manually with
vm_create_barebones().

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20240404121327.3107131-16-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/include/kvm_util_base.h
tools/testing/selftests/kvm/include/x86_64/processor.h
tools/testing/selftests/kvm/include/x86_64/sev.h
tools/testing/selftests/kvm/lib/kvm_util.c
tools/testing/selftests/kvm/lib/x86_64/processor.c
tools/testing/selftests/kvm/lib/x86_64/sev.c

index 7c06ceb366438fef92fe4cdb8a84276aff293344..8acca8237687007088cabae5e23df8e341dd8d9c 100644 (file)
@@ -93,7 +93,6 @@ enum kvm_mem_region_type {
 struct kvm_vm {
        int mode;
        unsigned long type;
-       uint8_t subtype;
        int kvm_fd;
        int fd;
        unsigned int pgtable_levels;
@@ -200,8 +199,8 @@ enum vm_guest_mode {
 struct vm_shape {
        uint32_t type;
        uint8_t  mode;
-       uint8_t  subtype;
-       uint16_t padding;
+       uint8_t  pad0;
+       uint16_t pad1;
 };
 
 kvm_static_assert(sizeof(struct vm_shape) == sizeof(uint64_t));
index 81ce37ec407dd18b04abab3ff0a40c8deca9cd65..74a59c7ce7edda840bf64f071acf9af9ffb13af6 100644 (file)
 extern bool host_cpu_is_intel;
 extern bool host_cpu_is_amd;
 
-enum vm_guest_x86_subtype {
-       VM_SUBTYPE_NONE = 0,
-       VM_SUBTYPE_SEV,
-       VM_SUBTYPE_SEV_ES,
-};
-
 /* Forced emulation prefix, used to invoke the emulator unconditionally. */
 #define KVM_FEP "ud2; .byte 'k', 'v', 'm';"
 
index 8a1bf88474c92f176069a8888171067c90387d37..0719f083351ad8a1b99cf48364ee02082f63bedf 100644 (file)
@@ -67,20 +67,8 @@ kvm_static_assert(SEV_RET_SUCCESS == 0);
        __TEST_ASSERT_VM_VCPU_IOCTL(!ret, #cmd, ret, vm);               \
 })
 
-static inline void sev_vm_init(struct kvm_vm *vm)
-{
-       vm->arch.sev_fd = open_sev_dev_path_or_exit();
-
-       vm_sev_ioctl(vm, KVM_SEV_INIT, NULL);
-}
-
-
-static inline void sev_es_vm_init(struct kvm_vm *vm)
-{
-       vm->arch.sev_fd = open_sev_dev_path_or_exit();
-
-       vm_sev_ioctl(vm, KVM_SEV_ES_INIT, NULL);
-}
+void sev_vm_init(struct kvm_vm *vm);
+void sev_es_vm_init(struct kvm_vm *vm);
 
 static inline void sev_register_encrypted_memory(struct kvm_vm *vm,
                                                 struct userspace_mem_region *region)
index b2262b5fad9e79a509f9c686e675baf2b95b00a0..9da388100f3a35a70afacd8816dafe2d8c2e8f95 100644 (file)
@@ -276,7 +276,6 @@ struct kvm_vm *____vm_create(struct vm_shape shape)
 
        vm->mode = shape.mode;
        vm->type = shape.type;
-       vm->subtype = shape.subtype;
 
        vm->pa_bits = vm_guest_mode_params[vm->mode].pa_bits;
        vm->va_bits = vm_guest_mode_params[vm->mode].va_bits;
index 74a4c736c9ae1e9849c22199af984dc75872d9ef..9f87ca8b7ab6021e45b8104c471421396672337e 100644 (file)
@@ -578,10 +578,11 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm)
        sync_global_to_guest(vm, host_cpu_is_intel);
        sync_global_to_guest(vm, host_cpu_is_amd);
 
-       if (vm->subtype == VM_SUBTYPE_SEV)
-               sev_vm_init(vm);
-       else if (vm->subtype == VM_SUBTYPE_SEV_ES)
-               sev_es_vm_init(vm);
+       if (vm->type == KVM_X86_SEV_VM || vm->type == KVM_X86_SEV_ES_VM) {
+               struct kvm_sev_init init = { 0 };
+
+               vm_sev_ioctl(vm, KVM_SEV_INIT2, &init);
+       }
 }
 
 void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code)
@@ -1081,9 +1082,12 @@ void kvm_get_cpu_address_width(unsigned int *pa_bits, unsigned int *va_bits)
 
 void kvm_init_vm_address_properties(struct kvm_vm *vm)
 {
-       if (vm->subtype == VM_SUBTYPE_SEV || vm->subtype == VM_SUBTYPE_SEV_ES) {
+       if (vm->type == KVM_X86_SEV_VM || vm->type == KVM_X86_SEV_ES_VM) {
+               vm->arch.sev_fd = open_sev_dev_path_or_exit();
                vm->arch.c_bit = BIT_ULL(this_cpu_property(X86_PROPERTY_SEV_C_BIT));
                vm->gpa_tag_mask = vm->arch.c_bit;
+       } else {
+               vm->arch.sev_fd = -1;
        }
 }
 
index e248d3364b9c3b21fc375647920d5f558d5bca96..597994fa4f416b7da20b7d6f40d26e49f495f9e5 100644 (file)
@@ -35,6 +35,32 @@ static void encrypt_region(struct kvm_vm *vm, struct userspace_mem_region *regio
        }
 }
 
+void sev_vm_init(struct kvm_vm *vm)
+{
+       if (vm->type == KVM_X86_DEFAULT_VM) {
+               assert(vm->arch.sev_fd == -1);
+               vm->arch.sev_fd = open_sev_dev_path_or_exit();
+               vm_sev_ioctl(vm, KVM_SEV_INIT, NULL);
+       } else {
+               struct kvm_sev_init init = { 0 };
+               assert(vm->type == KVM_X86_SEV_VM);
+               vm_sev_ioctl(vm, KVM_SEV_INIT2, &init);
+       }
+}
+
+void sev_es_vm_init(struct kvm_vm *vm)
+{
+       if (vm->type == KVM_X86_DEFAULT_VM) {
+               assert(vm->arch.sev_fd == -1);
+               vm->arch.sev_fd = open_sev_dev_path_or_exit();
+               vm_sev_ioctl(vm, KVM_SEV_ES_INIT, NULL);
+       } else {
+               struct kvm_sev_init init = { 0 };
+               assert(vm->type == KVM_X86_SEV_ES_VM);
+               vm_sev_ioctl(vm, KVM_SEV_INIT2, &init);
+       }
+}
+
 void sev_vm_launch(struct kvm_vm *vm, uint32_t policy)
 {
        struct kvm_sev_launch_start launch_start = {
@@ -91,10 +117,8 @@ struct kvm_vm *vm_sev_create_with_one_vcpu(uint32_t policy, void *guest_code,
                                           struct kvm_vcpu **cpu)
 {
        struct vm_shape shape = {
-               .type = VM_TYPE_DEFAULT,
                .mode = VM_MODE_DEFAULT,
-               .subtype = policy & SEV_POLICY_ES ? VM_SUBTYPE_SEV_ES :
-                                                   VM_SUBTYPE_SEV,
+               .type = policy & SEV_POLICY_ES ? KVM_X86_SEV_ES_VM : KVM_X86_SEV_VM,
        };
        struct kvm_vm *vm;
        struct kvm_vcpu *cpus[1];