• Sean Christopherson's avatar
    x86/retpoline: Don't clobber RFLAGS during srso_safe_ret() · ba5ca5e5
    Sean Christopherson authored
    Use LEA instead of ADD when adjusting %rsp in srso_safe_ret{,_alias}()
    so as to avoid clobbering flags.  Drop one of the INT3 instructions to
    account for the LEA consuming one more byte than the ADD.
    
    KVM's emulator makes indirect calls into a jump table of sorts, where
    the destination of each call is a small blob of code that performs fast
    emulation by executing the target instruction with fixed operands.
    
    E.g. to emulate ADC, fastop() invokes adcb_al_dl():
    
      adcb_al_dl:
        <+0>:  adc    %dl,%al
        <+2>:  jmp    <__x86_return_thunk>
    
    A major motivation for doing fast emulation is to leverage the CPU to
    handle consumption and manipulation of arithmetic flags, i.e. RFLAGS is
    both an input and output to the target of the call.  fastop() collects
    the RFLAGS result by pushing RFLAGS onto the stack and popping them back
    into a variable (held in %rdi in this case):
    
      asm("push %[flags]; popf; " CALL_NOSPEC " ; pushf; pop %[flags]\n"
    
      <+71>: mov    0xc0(%r8),%rdx
      <+78>: mov    0x100(%r8),%rcx
      <+85>: push   %rdi
      <+86>: popf
      <+87>: call   *%rsi
      <+89>: nop
      <+90>: nop
      <+91>: nop
      <+92>: pushf
      <+93>: pop    %rdi
    
    and then propagating the arithmetic flags into the vCPU's emulator state:
    
      ctxt->eflags = (ctxt->eflags & ~EFLAGS_MASK) | (flags & EFLAGS_MASK);
    
      <+64>:  and    $0xfffffffffffff72a,%r9
      <+94>:  and    $0x8d5,%edi
      <+109>: or     %rdi,%r9
      <+122>: mov    %r9,0x10(%r8)
    
    The failures can be most easily reproduced by running the "emulator"
    test in KVM-Unit-Tests.
    
    If you're feeling a bit of deja vu, see commit b63f20a7
    ("x86/retpoline: Don't clobber RFLAGS during CALL_NOSPEC on i386").
    
    In addition, this breaks booting of clang-compiled guest on
    a gcc-compiled host where the host contains the %rsp-modifying SRSO
    mitigations.
    
      [ bp: Massage commit message, extend, remove addresses. ]
    
    Fixes: fb3bd914 ("x86/srso: Add a Speculative RAS Overflow mitigation")
    Closes: https://lore.kernel.org/all/de474347-122d-54cd-eabf-9dcc95ab9eae@amd.comReported-by: default avatarSrikanth Aithal <sraithal@amd.com>
    Reported-by: default avatarNathan Chancellor <nathan@kernel.org>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/20230810013334.GA5354@dev-arch.thelio-3990X/
    Link: https://lore.kernel.org/r/20230811155255.250835-1-seanjc@google.com
    ba5ca5e5
retpoline.S 7.62 KB