• Kirill A. Shutemov's avatar
    x86/boot/compressed/64: Use page table in trampoline memory · 0a1756bd
    Kirill A. Shutemov authored
    If a bootloader enables 64-bit mode with 4-level paging, we might need to
    switch over to 5-level paging. The switching requires the disabling
    paging. It works fine if kernel itself is loaded below 4G.
    
    But if the bootloader put the kernel above 4G (i.e. in kexec() case),
    we would lose control as soon as paging is disabled, because the code
    becomes unreachable to the CPU.
    
    To handle the situation, we need a trampoline in lower memory that would
    take care of switching on 5-level paging.
    
    Apart from the trampoline code itself we also need a place to store
    top-level page table in lower memory as we don't have a way to load
    64-bit values into CR3 in 32-bit mode. We only really need 8 bytes there
    as we only use the very first entry of the page table. But we allocate a
    whole page anyway.
    
    This patch switches 32-bit code to use page table in trampoline memory.
    Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Borislav Petkov <bp@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-mm@kvack.org
    Link: http://lkml.kernel.org/r/20180312100246.89175-4-kirill.shutemov@linux.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    0a1756bd
head_64.S 13 KB