• Sean Christopherson's avatar
    KVM: VMX: Add a trampoline to fix VMREAD error handling · 842f4be9
    Sean Christopherson authored
    Add a hand coded assembly trampoline to preserve volatile registers
    across vmread_error(), and to handle the calling convention differences
    between 64-bit and 32-bit due to asmlinkage on vmread_error().  Pass
    @field and @fault on the stack when invoking the trampoline to avoid
    clobbering volatile registers in the context of the inline assembly.
    
    Calling vmread_error() directly from inline assembly is partially broken
    on 64-bit, and completely broken on 32-bit.  On 64-bit, it will clobber
    %rdi and %rsi (used to pass @field and @fault) and any volatile regs
    written by vmread_error().  On 32-bit, asmlinkage means vmread_error()
    expects the parameters to be passed on the stack, not via regs.
    
    Opportunistically zero out the result in the trampoline to save a few
    bytes of code for every VMREAD.  A happy side effect of the trampoline
    is that the inline code footprint is reduced by three bytes on 64-bit
    due to PUSH/POP being more efficent (in terms of opcode bytes) than MOV.
    
    Fixes: 6e202097 ("KVM: VMX: Add error handling to VMREAD helper")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Message-Id: <20200326160712.28803-1-sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    842f4be9
vmenter.S 6.91 KB