• Ard Biesheuvel's avatar
    efi: Drop type and attribute checks in efi_mem_desc_lookup() · 7e1550b8
    Ard Biesheuvel authored
    The current implementation of efi_mem_desc_lookup() includes the
    following check on the memory descriptor it returns:
    
        if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
            md->type != EFI_BOOT_SERVICES_DATA &&
            md->type != EFI_RUNTIME_SERVICES_DATA) {
                continue;
        }
    
    This means that only EfiBootServicesData or EfiRuntimeServicesData
    regions are considered, or any other region type provided that it
    has the EFI_MEMORY_RUNTIME attribute set.
    
    Given what the name of the function implies, and the fact that any
    physical address can be described in the UEFI memory map only a single
    time, it does not make sense to impose this condition in the body of the
    loop, but instead, should be imposed by the caller depending on the value
    that is returned to it.
    
    Two such callers exist at the moment:
    
    - The BGRT code when running on x86, via efi_mem_reserve() and
      efi_arch_mem_reserve(). In this case, the region is already known to
      be EfiBootServicesData, and so the check is redundant.
    
    - The ESRT handling code which introduced this function, which calls it
      both directly from efi_esrt_init() and again via efi_mem_reserve() and
      efi_arch_mem_reserve() [on x86].
    
    So let's move this check into the callers instead. This preserves the
    current behavior both for BGRT and ESRT handling, and allows the lookup
    routine to be reused by other [upcoming] users that don't have this
    limitation.
    
    In the ESRT case, keep the entire condition, so that platforms that
    deviate from the UEFI spec and use something other than
    EfiBootServicesData for the ESRT table will keep working as before.
    
    For x86's efi_arch_mem_reserve() implementation, limit the type to
    EfiBootServicesData, since it is the only type the reservation code
    expects to operate on in the first place.
    
    While we're at it, drop the __init annotation so that drivers can use it
    as well.
    Tested-by: default avatarLaszlo Ersek <lersek@redhat.com>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Jones <pjones@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-efi@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180711094040.12506-8-ard.biesheuvel@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    7e1550b8
efi.c 23.8 KB