Skip to content

Commit 66c721e

Browse files
Milton Millerozbenh
authored andcommitted
powerpc/kexec: Check crash_base for relocatable kernel
Enforce that the crash kernel region never overlaps the current kernel, as it will be written directly on kexec load. Also, default to the previous KDUMP_KERNELBASE if the start is 0. Other architectures (x86, ia64) state that specifying the start address 0 (or omitting it) will result in the kernel allocating it. Before the relocatable patch in 2.6.28, powerpc would adjust any other start value to the hardcoded KDUMP_KERNELBASE of 32M. Signed-off-by: Milton Miller <[email protected]> Signed-off-by: Benjamin Herrenschmidt <[email protected]>
1 parent e16459c commit 66c721e

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

arch/powerpc/kernel/machine_kexec.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,35 @@ void __init reserve_crashkernel(void)
9393
KDUMP_KERNELBASE);
9494

9595
crashk_res.start = KDUMP_KERNELBASE;
96+
#else
97+
if (!crashk_res.start) {
98+
/*
99+
* unspecified address, choose a region of specified size
100+
* can overlap with initrd (ignoring corruption when retained)
101+
* ppc64 requires kernel and some stacks to be in first segemnt
102+
*/
103+
crashk_res.start = KDUMP_KERNELBASE;
104+
}
105+
106+
crash_base = PAGE_ALIGN(crashk_res.start);
107+
if (crash_base != crashk_res.start) {
108+
printk("Crash kernel base must be aligned to 0x%lx\n",
109+
PAGE_SIZE);
110+
crashk_res.start = crash_base;
111+
}
112+
96113
#endif
97114
crash_size = PAGE_ALIGN(crash_size);
98115
crashk_res.end = crashk_res.start + crash_size - 1;
99116

117+
/* The crash region must not overlap the current kernel */
118+
if (overlaps_crashkernel(__pa(_stext), _end - _stext)) {
119+
printk(KERN_WARNING
120+
"Crash kernel can not overlap current kernel\n");
121+
crashk_res.start = crashk_res.end = 0;
122+
return;
123+
}
124+
100125
/* Crash kernel trumps memory limit */
101126
if (memory_limit && memory_limit <= crashk_res.end) {
102127
memory_limit = crashk_res.end + 1;

0 commit comments

Comments
 (0)