mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
MIPS: kexec: Add crashkernel=YM handling
When the kernel crashkernel parameter is specified with just a size, we are supposed to allocate a region from RAM to store the crashkernel. However, MIPS merely reserves physical address zero with no checking that there is even RAM there. Fix this by lifting similar code from x86, importing it to MIPS with the MIPS specific parameters added. In the absence of any platform specific information, we allocate the crashkernel region from the first 512MB of physical memory (limited to CKSEG0 or KSEG0 address range). When X is not specified, crash_base defaults to 0 (crashkernel=YM@XM). E.g. without this patch: The environment as follows: [ 0.000000] MIPS: machine is loongson,loongson64c-4core-ls7a ... [ 0.000000] Kernel command line: root=/dev/sda2 crashkernel=96M ... The warning as follows: [ 0.000000] Invalid memory region reserved for crash kernel And the iomem as follows: 00200000-0effffff : System RAM 00200000-00b47f87 : Kernel code 00b47f88-00dfffff : Kernel data 00e60000-01f73c7f : Kernel bss 1a000000-1bffffff : pci@1a000000 ... With this patch: After increasing crash_base <= 0 handling. And the iomem as follows: 00200000-0effffff : System RAM 00200000-00b47f87 : Kernel code 00b47f88-00dfffff : Kernel data 00e60000-01f73c7f : Kernel bss 04000000-09ffffff : Crash kernel 1a000000-1bffffff : pci@1a000000 ... Signed-off-by: Youling Tang <tangyouling@loongson.cn> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:
parent
5fa1f7680f
commit
2626239614
|
@ -477,6 +477,11 @@ early_param("elfcorehdr", early_parse_elfcorehdr);
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
|
||||
/* 64M alignment for crash kernel regions */
|
||||
#define CRASH_ALIGN SZ_64M
|
||||
#define CRASH_ADDR_MAX SZ_512M
|
||||
|
||||
static void __init mips_parse_crashkernel(void)
|
||||
{
|
||||
unsigned long long total_mem;
|
||||
|
@ -489,10 +494,23 @@ static void __init mips_parse_crashkernel(void)
|
|||
if (ret != 0 || crash_size <= 0)
|
||||
return;
|
||||
|
||||
if (!memblock_find_in_range(crash_base, crash_base + crash_size, crash_size, 1)) {
|
||||
if (crash_base <= 0) {
|
||||
crash_base = memblock_find_in_range(CRASH_ALIGN, CRASH_ADDR_MAX,
|
||||
crash_size, CRASH_ALIGN);
|
||||
if (!crash_base) {
|
||||
pr_warn("crashkernel reservation failed - No suitable area found.\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
unsigned long long start;
|
||||
|
||||
start = memblock_find_in_range(crash_base, crash_base + crash_size,
|
||||
crash_size, 1);
|
||||
if (start != crash_base) {
|
||||
pr_warn("Invalid memory region reserved for crash kernel\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
|
|
Loading…
Reference in a new issue