linux/arch/x86/boot
Baoquan He da63b6b200 x86/KASLR: Fix kexec kernel boot crash when KASLR randomization fails
Dave found that a kdump kernel with KASLR enabled will reset to the BIOS
immediately if physical randomization failed to find a new position for
the kernel. A kernel with the 'nokaslr' option works in this case.

The reason is that KASLR will install a new page table for the identity
mapping, while it missed building it for the original kernel location
if KASLR physical randomization fails.

This only happens in the kexec/kdump kernel, because the identity mapping
has been built for kexec/kdump in the 1st kernel for the whole memory by
calling init_pgtable(). Here if physical randomizaiton fails, it won't build
the identity mapping for the original area of the kernel but change to a
new page table '_pgtable'. Then the kernel will triple fault immediately
caused by no identity mappings.

The normal kernel won't see this bug, because it comes here via startup_32()
and CR3 will be set to _pgtable already. In startup_32() the identity
mapping is built for the 0~4G area. In KASLR we just append to the existing
area instead of entirely overwriting it for on-demand identity mapping
building. So the identity mapping for the original area of kernel is still
there.

To fix it we just switch to the new identity mapping page table when physical
KASLR succeeds. Otherwise we keep the old page table unchanged just like
"nokaslr" does.

Signed-off-by: Baoquan He <bhe@redhat.com>
Signed-off-by: Dave Young <dyoung@redhat.com>
Acked-by: Kees Cook <keescook@chromium.org>
Cc: Borislav Petkov <bp@suse.de>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Yinghai Lu <yinghai@kernel.org>
Link: http://lkml.kernel.org/r/1493278940-5885-1-git-send-email-bhe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2017-04-28 08:31:15 +02:00
..
compressed x86/KASLR: Fix kexec kernel boot crash when KASLR randomization fails 2017-04-28 08:31:15 +02:00
tools x86/boot: Remove unused 'is_big_kernel' variable 2016-02-16 09:16:58 +01:00
.gitignore
a20.c
apm.c
bioscall.S
bitops.h x86, asm: use bool for bitops and other assembly outputs 2016-06-08 12:41:20 -07:00
boot.h x86/boot: Fix BSS corruption/overwrite bug in early x86 kernel startup 2017-04-20 10:05:23 +02:00
cmdline.c
code16gcc.h
copy.S
cpu.c Revert "x86/boot: Fail the boot if !M486 and CPUID is missing" 2016-12-19 11:54:20 +01:00
cpucheck.c x86/mm: Disallow running with 32-bit PTEs to work around erratum 2016-07-13 09:43:25 +02:00
cpuflags.c x86/mm: Disallow running with 32-bit PTEs to work around erratum 2016-07-13 09:43:25 +02:00
cpuflags.h x86/mm: Disallow running with 32-bit PTEs to work around erratum 2016-07-13 09:43:25 +02:00
ctype.h
early_serial_console.c x86/boot: Add missing file header comments 2016-05-10 10:12:03 +02:00
edd.c
header.S x86/boot/e820: Remove assembly guard from asm/e820/types.h 2017-01-28 09:31:15 +01:00
install.sh
main.c
Makefile x86/boot/build: Remove always empty $(USERINCLUDE) 2016-11-07 07:30:01 +01:00
memory.c x86/boot/e820: Separate the E820 ABI structures from the in-kernel structures 2017-01-29 13:39:32 +01:00
mkcpustr.c
mtools.conf.in
pm.c
pmjump.S
printf.c
regs.c
setup.ld
string.c Merge branch 'linus' into x86/boot, to pick up fixes 2017-01-28 09:30:11 +01:00
string.h x86/boot: Add missing declaration of string functions 2017-01-09 11:53:05 +01:00
tty.c
version.c
vesa.h
video-bios.c
video-mode.c
video-vesa.c
video-vga.c
video.c
video.h