• Baoquan He's avatar
    x86/efi: Correct EFI identity mapping under 'efi=old_map' when KASLR is enabled · 94133e46
    Baoquan He authored
    For EFI with the 'efi=old_map' kernel option specified, the kernel will panic
    when KASLR is enabled:
    
      BUG: unable to handle kernel paging request at 000000007febd57e
      IP: 0x7febd57e
      PGD 1025a067
      PUD 0
    
      Oops: 0010 [#1] SMP
      Call Trace:
       efi_enter_virtual_mode()
       start_kernel()
       x86_64_start_reservations()
       x86_64_start_kernel()
       start_cpu()
    
    The root cause is that the identity mapping is not built correctly
    in the 'efi=old_map' case.
    
    On 'nokaslr' kernels, PAGE_OFFSET is 0xffff880000000000 which is PGDIR_SIZE
    aligned. We can borrow the PUD table from the direct mappings safely. Given a
    physical address X, we have pud_index(X) == pud_index(__va(X)).
    
    However, on KASLR kernels, PAGE_OFFSET is PUD_SIZE aligned. For a given physical
    address X, pud_index(X) != pud_index(__va(X)). We can't just copy the PGD entry
    from direct mapping to build identity mapping, instead we need to copy the
    PUD entries one by one from the direct mapping.
    
    Fix it.
    Signed-off-by: default avatarBaoquan He <bhe@redhat.com>
    Signed-off-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Bhupesh Sharma <bhsharma@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: Frank Ramsay <frank.ramsay@hpe.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Russ Anderson <rja@sgi.com>
    Cc: Thomas Garnier <thgarnie@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-efi@vger.kernel.org
    Link: http://lkml.kernel.org/r/20170526113652.21339-5-matt@codeblueprint.co.uk
    [ Fixed and reworded the changelog and code comments to be more readable. ]
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    94133e46
efi_64.c 22.2 KB