> From: Nadav Har'El
> Sent: Tuesday, May 17, 2011 3:55 AM
> 
> This patch adds a bunch of tests of the validity of the vmcs12 fields,
> according to what the VMX spec and our implementation allows. If fields
> we cannot (or don't want to) honor are discovered, an entry failure is
> emulated.
> 
> According to the spec, there are two types of entry failures: If the problem
> was in vmcs12's host state or control fields, the VMLAUNCH instruction simply
> fails. But a problem is found in the guest state, the behavior is more
> similar to that of an exit.
> 
> Signed-off-by: Nadav Har'El <n...@il.ibm.com>
> ---
>  arch/x86/include/asm/vmx.h |    8 ++
>  arch/x86/kvm/vmx.c         |   94
> +++++++++++++++++++++++++++++++++++
>  2 files changed, 102 insertions(+)
> 
> --- .before/arch/x86/kvm/vmx.c        2011-05-16 22:36:49.000000000 +0300
> +++ .after/arch/x86/kvm/vmx.c 2011-05-16 22:36:49.000000000 +0300
> @@ -870,6 +870,10 @@ static inline bool nested_cpu_has2(struc
>               (vmcs12->secondary_vm_exec_control & bit);
>  }
> 
> +static void nested_vmx_entry_failure(struct kvm_vcpu *vcpu,
> +                     struct vmcs12 *vmcs12,
> +                     u32 reason, unsigned long qualification);
> +
>  static int __find_msr_index(struct vcpu_vmx *vmx, u32 msr)
>  {
>       int i;
> @@ -6160,6 +6164,79 @@ static int nested_vmx_run(struct kvm_vcp
> 
>       vmcs12 = get_vmcs12(vcpu);
> 
> +     /*
> +      * The nested entry process starts with enforcing various prerequisites
> +      * on vmcs12 as required by the Intel SDM, and act appropriately when
> +      * they fail: As the SDM explains, some conditions should cause the
> +      * instruction to fail, while others will cause the instruction to seem
> +      * to succeed, but return an EXIT_REASON_INVALID_STATE.
> +      * To speed up the normal (success) code path, we should avoid checking
> +      * for misconfigurations which will anyway be caught by the processor
> +      * when using the merged vmcs02.
> +      */
> +     if (vmcs12->launch_state == launch) {
> +             nested_vmx_failValid(vcpu,
> +                     launch ? VMXERR_VMLAUNCH_NONCLEAR_VMCS
> +                            : VMXERR_VMRESUME_NONLAUNCHED_VMCS);
> +             return 1;
> +     }

from SDM:
        ELSIF (VMLAUNCH and launch state of current VMCS is not "clear")
                THEN VMfailValid(VMLAUNCH with non-clear VMCS);
        ELSIF (VMRESUME and launch state of current VMCS is not "launched")
                THEN VMfailValid(VMRESUME with non-launched VMCS);

So it's legal to use VMLAUNCH on a launched VMCS. However here you
changes this behavior. On the other hand, do you want to add a 'clear' state
along with L1 VMCLEAR to catch the failure here?

Thanks
Kevin
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to