• Ard Biesheuvel's avatar
    x86/boot/64: Clear most of CR4 in startup_64(), except PAE, MCE and LA57 · a0025f58
    Ard Biesheuvel authored
    The early 64-bit boot code must be entered with a 1:1 mapping of the
    bootable image, but it cannot operate without a 1:1 mapping of all the
    assets in memory that it accesses, and therefore, it creates such
    mappings for all known assets upfront, and additional ones on demand
    when a page fault happens on a memory address.
    
    These mappings are created with the global bit G set, as the flags used
    to create page table descriptors are based on __PAGE_KERNEL_LARGE_EXEC
    defined by the core kernel, even though the context where these mappings
    are used is very different.
    
    This means that the TLB maintenance carried out by the decompressor is
    not sufficient if it is entered with CR4.PGE enabled, which has been
    observed to happen with the stage0 bootloader of project Oak. While this
    is a dubious practice if no global mappings are being used to begin
    with, the decompressor is clearly at fault here for creating global
    mappings and not performing the appropriate TLB maintenance.
    
    Since commit:
    
      f97b67a7 ("x86/decompressor: Only call the trampoline when changing paging levels")
    
    CR4 is no longer modified by the decompressor if no change in the number
    of paging levels is needed. Before that, CR4 would always be set to a
    consistent value with PGE cleared.
    
    So let's reinstate a simplified version of the original logic to put CR4
    into a known state, and preserve the PAE, MCE and LA57 bits, none of
    which can be modified freely at this point (PAE and LA57 cannot be
    changed while running in long mode, and MCE cannot be cleared when
    running under some hypervisors).
    
    This effectively clears PGE and works around the project Oak bug.
    
    Fixes: f97b67a7 ("x86/decompressor: Only call the trampoline when ...")
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Link: https://lore.kernel.org/r/20240410151354.506098-2-ardb+git@google.com
    a0025f58
head_64.S 16.7 KB