diff options
Diffstat (limited to 'arch/powerpc/kernel/machine_kexec.c')
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index b3abebb7ee6..d59e2b1bdcb 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c @@ -93,10 +93,35 @@ void __init reserve_crashkernel(void)  				KDUMP_KERNELBASE);  	crashk_res.start = KDUMP_KERNELBASE; +#else +	if (!crashk_res.start) { +		/* +		 * unspecified address, choose a region of specified size +		 * can overlap with initrd (ignoring corruption when retained) +		 * ppc64 requires kernel and some stacks to be in first segemnt +		 */ +		crashk_res.start = KDUMP_KERNELBASE; +	} + +	crash_base = PAGE_ALIGN(crashk_res.start); +	if (crash_base != crashk_res.start) { +		printk("Crash kernel base must be aligned to 0x%lx\n", +				PAGE_SIZE); +		crashk_res.start = crash_base; +	} +  #endif  	crash_size = PAGE_ALIGN(crash_size);  	crashk_res.end = crashk_res.start + crash_size - 1; +	/* The crash region must not overlap the current kernel */ +	if (overlaps_crashkernel(__pa(_stext), _end - _stext)) { +		printk(KERN_WARNING +			"Crash kernel can not overlap current kernel\n"); +		crashk_res.start = crashk_res.end = 0; +		return; +	} +  	/* Crash kernel trumps memory limit */  	if (memory_limit && memory_limit <= crashk_res.end) {  		memory_limit = crashk_res.end + 1;  |