• Alex Thorlton's avatar
    x86/uv: Update uv_bios_call() to use efi_call_virt_pointer() · d1be84a2
    Alex Thorlton authored
    Now that the efi_call_virt() macro has been generalized to be able to
    use EFI system tables besides efi.systab, we are able to convert our
    uv_bios_call() wrapper to use this standard EFI callback mechanism.
    
    This simple change is part of a much larger effort to recover from some
    issues with the way we were mapping in some of our MMRs, and the way
    that we were doing our BIOS callbacks, which were uncovered by commit
    67a9108e ("x86/efi: Build our own page table structures").
    
    The first issue that this uncovered was that we were relying on the EFI
    memory mapping mechanism to map in our MMR space for us, which, while
    reliable, was technically a bug, as it relied on "undefined" behavior in
    the mapping code.
    
    The reason we were able to piggyback on the EFI memory mapping code to
    map in our MMRs was because, previously, EFI code used the
    trampoline_pgd, which shares a few entries with the main kernel pgd.  It
    just so happened, that the memory range containing our MMRs was inside
    one of those shared regions, which kept our code working without issue
    for quite a while.
    
    Anyways, once we discovered this problem, we brought back our original
    code to map in the MMRs with commit:
    
      08914f43 ("x86/platform/UV: Bring back the call to map_low_mmrs in uv_system_init")
    
    This got our systems a little further along, but we were still running
    into trouble with our EFI callbacks, which prevented us from booting
    all the way up.
    
    Our first step towards fixing the BIOS callbacks was to get our
    uv_bios_call() wrapper updated to use efi_call_virt() instead of the plain
    efi_call().  The previous patch took care of the effort needed to make
    that possible.  Along the way, we hit a major issue with some confusion
    about how to properly pull arguments higher than number 6 off the stack
    in the efi_call() code, which resulted in the following commit from Linus:
    
      683ad809 ("x86/efi: Fix 7-parameter efi_call()s")
    
    Now that all of those issues are out of the way, we're able to make this
    simple change to use the new efi_call_virt_pointer() in uv_bios_call()
    which gets our machines booting, running properly, and able to execute our
    callbacks with 6+ arguments.
    
    Note that, since we are now using the EFI page table when we make our
    function call, we are no longer able to make the call using the __va()
    of our function pointer, since the memory range containing that address
    isn't mapped into the EFI page table.  For now, we will use the physical
    address of the function directly, since that is mapped into the EFI page
    table.  In the near future, we're going to get some code added in to
    properly update our function pointer to its virtual address during
    SetVirtualAddressMap.
    Signed-off-by: default avatarAlex Thorlton <athorlton@sgi.com>
    Signed-off-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Dimitri Sivanich <sivanich@sgi.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Roy Franz <roy.franz@linaro.org>
    Cc: Russ Anderson <rja@sgi.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-efi@vger.kernel.org
    Link: http://lkml.kernel.org/r/1466839230-12781-6-git-send-email-matt@codeblueprint.co.ukSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    d1be84a2
bios_uv.c 5.24 KB