if (kvm_state->format != KVM_STATE_NESTED_FORMAT_VMX)
                return -EINVAL;
 
-       if (!nested_vmx_allowed(vcpu))
-               return kvm_state->hdr.vmx.vmxon_pa == -1ull ? 0 : -EINVAL;
-
        if (kvm_state->hdr.vmx.vmxon_pa == -1ull) {
                if (kvm_state->hdr.vmx.smm.flags)
                        return -EINVAL;
                if (kvm_state->hdr.vmx.vmcs12_pa != -1ull)
                        return -EINVAL;
 
-               vmx_leave_nested(vcpu);
-               return 0;
-       }
+               if (kvm_state->flags & ~KVM_STATE_NESTED_EVMCS)
+                       return -EINVAL;
+       } else {
+               if (!nested_vmx_allowed(vcpu))
+                       return -EINVAL;
 
-       if (!page_address_valid(vcpu, kvm_state->hdr.vmx.vmxon_pa))
-               return -EINVAL;
+               if (!page_address_valid(vcpu, kvm_state->hdr.vmx.vmxon_pa))
+                       return -EINVAL;
+       }
 
        if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
            (kvm_state->flags & KVM_STATE_NESTED_GUEST_MODE))
                return -EINVAL;
 
        vmx_leave_nested(vcpu);
-       if (kvm_state->hdr.vmx.vmxon_pa == -1ull)
-               return 0;
+       if (kvm_state->flags & KVM_STATE_NESTED_EVMCS) {
+               if (!nested_vmx_allowed(vcpu))
+                       return -EINVAL;
 
-       if (kvm_state->flags & KVM_STATE_NESTED_EVMCS)
                nested_enable_evmcs(vcpu, NULL);
+       }
+
+       if (kvm_state->hdr.vmx.vmxon_pa == -1ull)
+               return 0;
 
        vmx->nested.vmxon_ptr = kvm_state->hdr.vmx.vmxon_pa;
        ret = enter_vmx_operation(vcpu);
 
        /*
         * 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->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->hdr.vmx.vmxon_pa = -1ull;
+       state->hdr.vmx.vmcs12_pa = -1ull;
+       test_nested_state_expect_einval(vm, state);
+
+       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);
 
        /* It is invalid to have vmxon_pa == -1ull and vmcs_pa != -1ull. */
        set_default_vmx_state(state, state_sz);
        state->hdr.vmx.vmxon_pa = -1ull;
-       state->hdr.vmx.vmcs12_pa = 0;
+       state->flags = 0;
        test_nested_state_expect_einval(vm, state);
 
-       /*
-        * Setting vmxon_pa == -1ull and vmcs_pa == -1ull exits early without
-        * setting the nested state.
-        */
-       set_default_vmx_state(state, state_sz);
-       state->hdr.vmx.vmxon_pa = -1ull;
-       state->hdr.vmx.vmcs12_pa = -1ull;
-       test_nested_state(vm, state);
-
        /* It is invalid to have vmxon_pa set to a non-page aligned address. */
        set_default_vmx_state(state, state_sz);
        state->hdr.vmx.vmxon_pa = 1;