|
@@ -128,6 +128,37 @@ static void __init register_bootmem_low_pages(void)
|
|
|
free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages));
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_KEXEC
|
|
|
+static void __init reserve_crashkernel(void)
|
|
|
+{
|
|
|
+ unsigned long long free_mem;
|
|
|
+ unsigned long long crash_size, crash_base;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ free_mem = ((unsigned long long)max_low_pfn - min_low_pfn) << PAGE_SHIFT;
|
|
|
+
|
|
|
+ ret = parse_crashkernel(boot_command_line, free_mem,
|
|
|
+ &crash_size, &crash_base);
|
|
|
+ if (ret == 0 && crash_size) {
|
|
|
+ if (crash_base > 0) {
|
|
|
+ printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
|
|
+ "for crashkernel (System RAM: %ldMB)\n",
|
|
|
+ (unsigned long)(crash_size >> 20),
|
|
|
+ (unsigned long)(crash_base >> 20),
|
|
|
+ (unsigned long)(free_mem >> 20));
|
|
|
+ crashk_res.start = crash_base;
|
|
|
+ crashk_res.end = crash_base + crash_size - 1;
|
|
|
+ reserve_bootmem(crash_base, crash_size);
|
|
|
+ } else
|
|
|
+ printk(KERN_INFO "crashkernel reservation failed - "
|
|
|
+ "you have to specify a base address\n");
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void __init reserve_crashkernel(void)
|
|
|
+{}
|
|
|
+#endif
|
|
|
+
|
|
|
void __init setup_bootmem_allocator(unsigned long free_pfn)
|
|
|
{
|
|
|
unsigned long bootmap_size;
|
|
@@ -189,11 +220,8 @@ void __init setup_bootmem_allocator(unsigned long free_pfn)
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
-#ifdef CONFIG_KEXEC
|
|
|
- if (crashk_res.start != crashk_res.end)
|
|
|
- reserve_bootmem(crashk_res.start,
|
|
|
- crashk_res.end - crashk_res.start + 1);
|
|
|
-#endif
|
|
|
+
|
|
|
+ reserve_crashkernel();
|
|
|
}
|
|
|
|
|
|
#ifndef CONFIG_NEED_MULTIPLE_NODES
|