• Will Deacon's avatar
    efi/libstub/arm64: Retain 2MB kernel Image alignment if !KASLR · 7c116db2
    Will Deacon authored
    Since commit 82046702 ("efi/libstub/arm64: Replace 'preferred' offset
    with alignment check"), loading a relocatable arm64 kernel at a physical
    address which is not 2MB aligned and subsequently booting with EFI will
    leave the Image in-place, relying on the kernel to relocate itself early
    during boot. In conjunction with commit dd4bc607 ("arm64: warn on
    incorrect placement of the kernel by the bootloader"), which enables
    CONFIG_RELOCATABLE by default, this effectively means that entering an
    arm64 kernel loaded at an alignment smaller than 2MB with EFI (e.g. using
    QEMU) will result in silent relocation at runtime.
    
    Unfortunately, this has a subtle but confusing affect for developers
    trying to inspect the PC value during a crash and comparing it to the
    symbol addresses in vmlinux using tools such as 'nm' or 'addr2line';
    all text addresses will be displaced by a sub-2MB offset, resulting in
    the wrong symbol being identified in many cases. Passing "nokaslr" on
    the command line or disabling "CONFIG_RANDOMIZE_BASE" does not help,
    since the EFI stub only copies the kernel Image to a 2MB boundary if it
    is not relocatable.
    
    Adjust the EFI stub for arm64 so that the minimum Image alignment is 2MB
    unless KASLR is in use.
    
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: David Brazdil <dbrazdil@google.com>
    Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    7c116db2
arm64-stub.c 3.29 KB