On 11/10/2011 12:01 PM, Nadav Har'El wrote:
> If we let L1 use EPT, we should probably also support the INVEPT instruction.
>
> +     case VMX_EPT_EXTENT_CONTEXT:
> +             if (!(nested_vmx_ept_caps & VMX_EPT_EXTENT_CONTEXT_BIT))
> +                     nested_vmx_failValid(vcpu,
> +                             VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
> +             else {
> +                     /*
> +                      * We efficiently handle the common case, of L1
> +                      * invalidating the last eptp it used to run L2.
> +                      * TODO: Instead of saving one last_eptp02, look up
> +                      * operand.eptp in the shadow EPT table cache, to
> +                      * find its shadow. Then last_eptp02 won't be needed.
> +                      */
> +                     struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
> +                     struct vcpu_vmx *vmx = to_vmx(vcpu);
> +                     if (vmcs12 && nested_cpu_has_ept(vmcs12) &&
> +                         (vmcs12->ept_pointer == operand.eptp) &&
> +                         vmx->nested.last_eptp02)
> +                             ept_sync_context(vmx->nested.last_eptp02);
> +                     else
> +                             ept_sync_global();

Are either of these needed?  Won't a write to a shadowed EPT table cause
them anyway?

> +                     nested_vmx_succeed(vcpu);
> +             }
> +             break;
> +     case VMX_EPT_EXTENT_INDIVIDUAL_ADDR:
> +             if (!(nested_vmx_ept_caps & VMX_EPT_EXTENT_INDIVIDUAL_BIT))
> +                     nested_vmx_failValid(vcpu,
> +                             VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
> +             else {
> +                     struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
> +                     struct vcpu_vmx *vmx = to_vmx(vcpu);
> +                     if (vmcs12 && nested_cpu_has_ept(vmcs12) &&
> +                         (vmcs12->ept_pointer == operand.eptp) &&
> +                         vmx->nested.last_eptp02)
> +                             ept_sync_individual_addr(
> +                                     vmx->nested.last_eptp02, operand.gpa);

Same here.

> +                     else
> +                             ept_sync_global();
> +                     nested_vmx_succeed(vcpu);
> +             }
> +             break;
> +     default:
> +             nested_vmx_failValid(vcpu,
> +                     VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
> +     }
> +
> +     skip_emulated_instruction(vcpu);
> +     return 1;
> +}
> +
>

-- 
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to