diff options
Diffstat (limited to 'arch/x86/kernel/setup_64.c')
-rw-r--r-- | arch/x86/kernel/setup_64.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index 5a19f0cc5b67..cdcba6975226 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -191,6 +191,37 @@ static inline void copy_edd(void) | |||
191 | } | 191 | } |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | #ifdef CONFIG_KEXEC | ||
195 | static void __init reserve_crashkernel(void) | ||
196 | { | ||
197 | unsigned long long free_mem; | ||
198 | unsigned long long crash_size, crash_base; | ||
199 | int ret; | ||
200 | |||
201 | free_mem = ((unsigned long long)max_low_pfn - min_low_pfn) << PAGE_SHIFT; | ||
202 | |||
203 | ret = parse_crashkernel(boot_command_line, free_mem, | ||
204 | &crash_size, &crash_base); | ||
205 | if (ret == 0 && crash_size) { | ||
206 | if (crash_base > 0) { | ||
207 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " | ||
208 | "for crashkernel (System RAM: %ldMB)\n", | ||
209 | (unsigned long)(crash_size >> 20), | ||
210 | (unsigned long)(crash_base >> 20), | ||
211 | (unsigned long)(free_mem >> 20)); | ||
212 | crashk_res.start = crash_base; | ||
213 | crashk_res.end = crash_base + crash_size - 1; | ||
214 | reserve_bootmem(crash_base, crash_size); | ||
215 | } else | ||
216 | printk(KERN_INFO "crashkernel reservation failed - " | ||
217 | "you have to specify a base address\n"); | ||
218 | } | ||
219 | } | ||
220 | #else | ||
221 | static inline void __init reserve_crashkernel(void) | ||
222 | {} | ||
223 | #endif | ||
224 | |||
194 | #define EBDA_ADDR_POINTER 0x40E | 225 | #define EBDA_ADDR_POINTER 0x40E |
195 | 226 | ||
196 | unsigned __initdata ebda_addr; | 227 | unsigned __initdata ebda_addr; |
@@ -357,13 +388,7 @@ void __init setup_arch(char **cmdline_p) | |||
357 | } | 388 | } |
358 | } | 389 | } |
359 | #endif | 390 | #endif |
360 | #ifdef CONFIG_KEXEC | 391 | reserve_crashkernel(); |
361 | if (crashk_res.start != crashk_res.end) { | ||
362 | reserve_bootmem_generic(crashk_res.start, | ||
363 | crashk_res.end - crashk_res.start + 1); | ||
364 | } | ||
365 | #endif | ||
366 | |||
367 | paging_init(); | 392 | paging_init(); |
368 | 393 | ||
369 | #ifdef CONFIG_PCI | 394 | #ifdef CONFIG_PCI |