]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - tools/testing/selftests/kvm/x86_64/vmx_set_nested_state_test.c
KVM: nVMX: reorganize initial steps of vmx_set_nested_state
[mirror_ubuntu-hirsute-kernel.git] / tools / testing / selftests / kvm / x86_64 / vmx_set_nested_state_test.c
index 61a2163cf9f182ec7b5e6c4a689d8d91677d21b1..e64ca20b315a9312fd1775154eb39ff6f4393e87 100644 (file)
@@ -75,7 +75,7 @@ void set_revision_id_for_vmcs12(struct kvm_nested_state *state,
                                u32 vmcs12_revision)
 {
        /* Set revision_id in vmcs12 to vmcs12_revision. */
-       *(u32 *)(state->data) = vmcs12_revision;
+       memcpy(&state->data, &vmcs12_revision, sizeof(u32));
 }
 
 void set_default_state(struct kvm_nested_state *state)
@@ -95,9 +95,9 @@ void set_default_vmx_state(struct kvm_nested_state *state, int size)
                        KVM_STATE_NESTED_EVMCS;
        state->format = 0;
        state->size = size;
-       state->vmx.vmxon_pa = 0x1000;
-       state->vmx.vmcs_pa = 0x2000;
-       state->vmx.smm.flags = 0;
+       state->hdr.vmx.vmxon_pa = 0x1000;
+       state->hdr.vmx.vmcs12_pa = 0x2000;
+       state->hdr.vmx.smm.flags = 0;
        set_revision_id_for_vmcs12(state, VMCS12_REVISION);
 }
 
@@ -123,39 +123,47 @@ void test_vmx_nested_state(struct kvm_vm *vm)
        /*
         * We cannot virtualize anything if the guest does not have VMX
         * enabled.  We expect KVM_SET_NESTED_STATE to return 0 if vmxon_pa
-        * is set to -1ull.
+        * is set to -1ull, but the flags must be zero.
         */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = -1ull;
+       state->hdr.vmx.vmxon_pa = -1ull;
+       test_nested_state_expect_einval(vm, state);
+
+       state->hdr.vmx.vmcs12_pa = -1ull;
+       state->flags = KVM_STATE_NESTED_EVMCS;
+       test_nested_state_expect_einval(vm, state);
+
+       state->flags = 0;
        test_nested_state(vm, state);
 
        /* Enable VMX in the guest CPUID. */
        vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
 
-       /* It is invalid to have vmxon_pa == -1ull and SMM flags non-zero. */
+       /*
+        * Setting vmxon_pa == -1ull and vmcs_pa == -1ull exits early without
+        * setting the nested state but flags other than eVMCS must be clear.
+        */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = -1ull;
-       state->vmx.smm.flags = 1;
+       state->hdr.vmx.vmxon_pa = -1ull;
+       state->hdr.vmx.vmcs12_pa = -1ull;
        test_nested_state_expect_einval(vm, state);
 
-       /* It is invalid to have vmxon_pa == -1ull and vmcs_pa != -1ull. */
-       set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = -1ull;
-       state->vmx.vmcs_pa = 0;
+       state->flags = KVM_STATE_NESTED_EVMCS;
+       test_nested_state(vm, state);
+
+       /* It is invalid to have vmxon_pa == -1ull and SMM flags non-zero. */
+       state->hdr.vmx.smm.flags = 1;
        test_nested_state_expect_einval(vm, state);
 
-       /*
-        * Setting vmxon_pa == -1ull and vmcs_pa == -1ull exits early without
-        * setting the nested state.
-        */
+       /* It is invalid to have vmxon_pa == -1ull and vmcs_pa != -1ull. */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = -1ull;
-       state->vmx.vmcs_pa = -1ull;
-       test_nested_state(vm, state);
+       state->hdr.vmx.vmxon_pa = -1ull;
+       state->flags = 0;
+       test_nested_state_expect_einval(vm, state);
 
        /* It is invalid to have vmxon_pa set to a non-page aligned address. */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = 1;
+       state->hdr.vmx.vmxon_pa = 1;
        test_nested_state_expect_einval(vm, state);
 
        /*
@@ -165,7 +173,7 @@ void test_vmx_nested_state(struct kvm_vm *vm)
        set_default_vmx_state(state, state_sz);
        state->flags = KVM_STATE_NESTED_GUEST_MODE  |
                      KVM_STATE_NESTED_RUN_PENDING;
-       state->vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
+       state->hdr.vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
        test_nested_state_expect_einval(vm, state);
 
        /*
@@ -174,14 +182,14 @@ void test_vmx_nested_state(struct kvm_vm *vm)
         *      KVM_STATE_NESTED_SMM_VMXON
         */
        set_default_vmx_state(state, state_sz);
-       state->vmx.smm.flags = ~(KVM_STATE_NESTED_SMM_GUEST_MODE |
+       state->hdr.vmx.smm.flags = ~(KVM_STATE_NESTED_SMM_GUEST_MODE |
                                KVM_STATE_NESTED_SMM_VMXON);
        test_nested_state_expect_einval(vm, state);
 
        /* Outside SMM, SMM flags must be zero. */
        set_default_vmx_state(state, state_sz);
        state->flags = 0;
-       state->vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
+       state->hdr.vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
        test_nested_state_expect_einval(vm, state);
 
        /* Size must be large enough to fit kvm_nested_state and vmcs12. */
@@ -191,8 +199,8 @@ void test_vmx_nested_state(struct kvm_vm *vm)
 
        /* vmxon_pa cannot be the same address as vmcs_pa. */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = 0;
-       state->vmx.vmcs_pa = 0;
+       state->hdr.vmx.vmxon_pa = 0;
+       state->hdr.vmx.vmcs12_pa = 0;
        test_nested_state_expect_einval(vm, state);
 
        /* The revision id for vmcs12 must be VMCS12_REVISION. */
@@ -205,16 +213,16 @@ void test_vmx_nested_state(struct kvm_vm *vm)
         * it again.
         */
        set_default_vmx_state(state, state_sz);
-       state->vmx.vmxon_pa = -1ull;
-       state->vmx.vmcs_pa = -1ull;
+       state->hdr.vmx.vmxon_pa = -1ull;
+       state->hdr.vmx.vmcs12_pa = -1ull;
        state->flags = 0;
        test_nested_state(vm, state);
        vcpu_nested_state_get(vm, VCPU_ID, state);
        TEST_ASSERT(state->size >= sizeof(*state) && state->size <= state_sz,
                    "Size must be between %d and %d.  The size returned was %d.",
                    sizeof(*state), state_sz, state->size);
-       TEST_ASSERT(state->vmx.vmxon_pa == -1ull, "vmxon_pa must be -1ull.");
-       TEST_ASSERT(state->vmx.vmcs_pa == -1ull, "vmcs_pa must be -1ull.");
+       TEST_ASSERT(state->hdr.vmx.vmxon_pa == -1ull, "vmxon_pa must be -1ull.");
+       TEST_ASSERT(state->hdr.vmx.vmcs12_pa == -1ull, "vmcs_pa must be -1ull.");
 
        free(state);
 }