diff options
Diffstat (limited to 'arch/mips/kernel/setup.c')
| -rw-r--r-- | arch/mips/kernel/setup.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 53462500c3c..795f4379c0b 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -480,6 +480,37 @@ static int __init early_parse_mem(char *p)  }  early_param("mem", early_parse_mem); +#ifdef CONFIG_PROC_VMCORE +unsigned long setup_elfcorehdr, setup_elfcorehdr_size; +static int __init early_parse_elfcorehdr(char *p) +{ +	int i; + +	setup_elfcorehdr = memparse(p, &p); + +	for (i = 0; i < boot_mem_map.nr_map; i++) { +		unsigned long start = boot_mem_map.map[i].addr; +		unsigned long end = (boot_mem_map.map[i].addr + +				     boot_mem_map.map[i].size); +		if (setup_elfcorehdr >= start && setup_elfcorehdr < end) { +			/* +			 * Reserve from the elf core header to the end of +			 * the memory segment, that should all be kdump +			 * reserved memory. +			 */ +			setup_elfcorehdr_size = end - setup_elfcorehdr; +			break; +		} +	} +	/* +	 * If we don't find it in the memory map, then we shouldn't +	 * have to worry about it, as the new kernel won't use it. +	 */ +	return 0; +} +early_param("elfcorehdr", early_parse_elfcorehdr); +#endif +  static void __init arch_mem_addpart(phys_t mem, phys_t end, int type)  {  	phys_t size; @@ -547,6 +578,14 @@ static void __init arch_mem_init(char **cmdline_p)  	}  	bootmem_init(); +#ifdef CONFIG_PROC_VMCORE +	if (setup_elfcorehdr && setup_elfcorehdr_size) { +		printk(KERN_INFO "kdump reserved memory at %lx-%lx\n", +		       setup_elfcorehdr, setup_elfcorehdr_size); +		reserve_bootmem(setup_elfcorehdr, setup_elfcorehdr_size, +				BOOTMEM_DEFAULT); +	} +#endif  #ifdef CONFIG_KEXEC  	if (crashk_res.start != crashk_res.end)  		reserve_bootmem(crashk_res.start,  |