|
@@ -191,6 +191,37 @@ static inline void copy_edd(void)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#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
|
|
|
|
+
|
|
#define EBDA_ADDR_POINTER 0x40E
|
|
#define EBDA_ADDR_POINTER 0x40E
|
|
|
|
|
|
unsigned __initdata ebda_addr;
|
|
unsigned __initdata ebda_addr;
|
|
@@ -357,13 +388,7 @@ void __init setup_arch(char **cmdline_p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
-#ifdef CONFIG_KEXEC
|
|
|
|
- if (crashk_res.start != crashk_res.end) {
|
|
|
|
- reserve_bootmem_generic(crashk_res.start,
|
|
|
|
- crashk_res.end - crashk_res.start + 1);
|
|
|
|
- }
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
|
|
+ reserve_crashkernel();
|
|
paging_init();
|
|
paging_init();
|
|
|
|
|
|
#ifdef CONFIG_PCI
|
|
#ifdef CONFIG_PCI
|