• Rick Edgecombe's avatar
    KVM: VMX: Move RSB stuffing to before the first RET after VM-Exit · f2fde6a5
    Rick Edgecombe authored
    The not-so-recent change to move VMX's VM-Exit handing to a dedicated
    "function" unintentionally exposed KVM to a speculative attack from the
    guest by executing a RET prior to stuffing the RSB.  Make RSB stuffing
    happen immediately after VM-Exit, before any unpaired returns.
    
    Alternatively, the VM-Exit path could postpone full RSB stuffing until
    its current location by stuffing the RSB only as needed, or by avoiding
    returns in the VM-Exit path entirely, but both alternatives are beyond
    ugly since vmx_vmexit() has multiple indirect callers (by way of
    vmx_vmenter()).  And putting the RSB stuffing immediately after VM-Exit
    makes it much less likely to be re-broken in the future.
    
    Note, the cost of PUSH/POP could be avoided in the normal flow by
    pairing the PUSH RAX with the POP RAX in __vmx_vcpu_run() and adding an
    a POP to nested_vmx_check_vmentry_hw(), but such a weird/subtle
    dependency is likely to cause problems in the long run, and PUSH/POP
    will take all of a few cycles, which is peanuts compared to the number
    of cycles required to fill the RSB.
    
    Fixes: 453eafbe ("KVM: VMX: Move VM-Enter + VM-Exit handling to non-inline sub-routines")
    Reported-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Co-developed-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f2fde6a5
vmenter.S 5.72 KB