• A
    efi/x86: Simplify 64-bit EFI firmware call wrapper · e5f930fe
    Ard Biesheuvel 提交于
    The efi_call() wrapper used to invoke EFI runtime services serves
    a number of purposes:
    - realign the stack to 16 bytes
    - preserve FP and CR0 register state
    - translate from SysV to MS calling convention.
    
    Preserving CR0.TS is no longer necessary in Linux, and preserving the
    FP register state is also redundant in most cases, since efi_call() is
    almost always used from within the scope of a pair of kernel_fpu_begin()/
    kernel_fpu_end() calls, with the exception of the early call to
    SetVirtualAddressMap() and the SGI UV support code.
    
    So let's add a pair of kernel_fpu_begin()/_end() calls there as well,
    and remove the unnecessary code from the assembly implementation of
    efi_call(), and only keep the pieces that deal with the stack
    alignment and the ABI translation.
    Signed-off-by: NArd Biesheuvel <ardb@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arvind Sankar <nivedita@alum.mit.edu>
    Cc: Matthew Garrett <mjg59@google.com>
    Cc: linux-efi@vger.kernel.org
    Link: https://lkml.kernel.org/r/20200103113953.9571-10-ardb@kernel.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
    e5f930fe
efi_64.c 26.5 KB