Allocating the crashkernel region outside lowmem causes the kernel to
oops while trying to kexec into the new kernel:
Loading crashdump kernel...
Unable to handle kernel NULL pointer dereference at virtual address
00000000
pgd =
edd70000
[
00000000] *pgd=
de19e835
Internal error: Oops: 817 [#2] SMP ARM
Modules linked in: ...
CPU: 0 PID: 689 Comm: sh Not tainted
4.12.0-rc3-next-20170601-04015-gc3a5a20
Hardware name: Generic DRA74X (Flattened Device Tree)
task:
edb32f00 task.stack:
edf18000
PC is at memcpy+0x50/0x330
LR is at 0xe3c34001
pc : [<
c04baf30>] lr : [<
e3c34001>] psr:
800c0193
sp :
edf19c2c ip :
0a000001 fp :
c0553170
r10:
c055316e r9 :
00000001 r8 :
e3130001
r7 :
e4903004 r6 :
0a000014 r5 :
e3500000 r4 :
e59f106c
r3 :
e59f0074 r2 :
ffffffe8 r1 :
c010fb88 r0 :
00000000
Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none
Control:
10c5387d Table:
add7006a DAC:
00000051
Process sh (pid: 689, stack limit = 0xedf18218)
Stack: (0xedf19c2c to 0xedf1a000)
...
[<
c04baf30>] (memcpy) from [<
c010fae0>] (machine_kexec+0xa8/0x12c)
[<
c010fae0>] (machine_kexec) from [<
c01e4104>] (__crash_kexec+0x5c/0x98)
[<
c01e4104>] (__crash_kexec) from [<
c01e419c>] (crash_kexec+0x5c/0x68)
[<
c01e419c>] (crash_kexec) from [<
c010c5c0>] (die+0x228/0x490)
[<
c010c5c0>] (die) from [<
c011e520>] (__do_kernel_fault.part.0+0x54/0x1e4)
[<
c011e520>] (__do_kernel_fault.part.0) from [<
c082412c>] (do_page_fault+0x1e8/0x400)
[<
c082412c>] (do_page_fault) from [<
c010135c>] (do_DataAbort+0x38/0xb8)
[<
c010135c>] (do_DataAbort) from [<
c0823584>] (__dabt_svc+0x64/0xa0)
This is caused by image->control_code_page being a highmem page, so
page_address(image->control_code_page) returns NULL. In any case, we
don't want the control page to be a highmem page.
We already limit the crash kernel region to the top of 32-bit physical
memory space. Also limit it to the top of lowmem in physical space.
Reported-by: Keerthy <j-keerthy@ti.com>
Tested-by: Keerthy <j-keerthy@ti.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>