• David Matlack's avatar
    kvm: x86: nVMX: maintain internal copy of current VMCS · 4f2777bc
    David Matlack authored
    KVM maintains L1's current VMCS in guest memory, at the guest physical
    page identified by the argument to VMPTRLD. This makes hairy
    time-of-check to time-of-use bugs possible,as VCPUs can be writing
    the the VMCS page in memory while KVM is emulating VMLAUNCH and
    VMRESUME.
    
    The spec documents that writing to the VMCS page while it is loaded is
    "undefined". Therefore it is reasonable to load the entire VMCS into
    an internal cache during VMPTRLD and ignore writes to the VMCS page
    -- the guest should be using VMREAD and VMWRITE to access the current
    VMCS.
    
    To adhere to the spec, KVM should flush the current VMCS during VMPTRLD,
    and the target VMCS during VMCLEAR (as given by the operand to VMCLEAR).
    Since this implementation of VMCS caching only maintains the the current
    VMCS, VMCLEAR will only do a flush if the operand to VMCLEAR is the
    current VMCS pointer.
    
    KVM will also flush during VMXOFF, which is not mandated by the spec,
    but also not in conflict with the spec.
    Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    4f2777bc
vmx.c 320 KB