• Linus Torvalds's avatar
    x86/efi: Fix 7-parameter efi_call()s · 683ad809
    Linus Torvalds authored
    Alex Thorlton reported that the SGI/UV code crashes in the efi_call()
    code when invoked with 7 parameters, due to:
    
            mov (%rsp), %rax
            mov 8(%rax), %rax
            ...
            mov %rax, 40(%rsp)
    
    Offset 8 is only true if CONFIG_FRAME_POINTERS is disabled,
    with frame pointers enabled it should be 16.
    
    Furthermore, the SAVE_XMM code saves the old stack pointer, but
    that's just crazy. It saves the stack pointer *AFTER* we've done
    the:
    
            FRAME_BEGIN
    
    ... which will have *changed* the stack pointer, depending on whether
    stack frames are enabled or not.
    
    So when the code then does:
    
            mov (%rsp), %rax
    
    ... we now move that old stack pointer into %rax, but the offset off that
    stack pointer will depend on whether that FRAME_BEGIN saved off %rbp
    or not.
    
    So that whole 8-vs-16 offset confusion depends on the frame pointer!
    If frame pointers were enabled, it will be 16. If they weren't, it
    will be 8.
    
    The right fix is to just get rid of that silly conditional frame
    pointer thing, and always use frame pointers in this stub function.
    And then we don't need that (odd) load to get the old stack
    pointer into %rax - we can just use the frame pointer.
    Reported-by: default avatarAlex Thorlton <athorlton@sgi.com>
    Tested-by: default avatarAlex Thorlton <athorlton@sgi.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Matt Fleming <matt@codeblueprint.co.uk>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Link: http://lkml.kernel.org/r/CA%2B55aFzBS2v%3DWnEH83cUDg7XkOremFqJ30BJwF40dCYjReBkUQ@mail.gmail.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    683ad809
efi_stub_64.S 1.14 KB