|
@@ -208,6 +208,48 @@ static int __init register_memory(void)
|
|
|
|
|
|
__initcall(register_memory);
|
|
|
|
|
|
+
|
|
|
+#ifdef CONFIG_KEXEC
|
|
|
+static void __init setup_crashkernel(unsigned long total, int *n)
|
|
|
+{
|
|
|
+ unsigned long long base = 0, size = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = parse_crashkernel(boot_command_line, total,
|
|
|
+ &size, &base);
|
|
|
+ if (ret == 0 && size > 0) {
|
|
|
+ if (!base) {
|
|
|
+ sort_regions(rsvd_region, *n);
|
|
|
+ base = kdump_find_rsvd_region(size,
|
|
|
+ rsvd_region, *n);
|
|
|
+ }
|
|
|
+ if (base != ~0UL) {
|
|
|
+ printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
|
|
+ "for crashkernel (System RAM: %ldMB)\n",
|
|
|
+ (unsigned long)(size >> 20),
|
|
|
+ (unsigned long)(base >> 20),
|
|
|
+ (unsigned long)(total >> 20));
|
|
|
+ rsvd_region[*n].start =
|
|
|
+ (unsigned long)__va(base);
|
|
|
+ rsvd_region[*n].end =
|
|
|
+ (unsigned long)__va(base + size);
|
|
|
+ (*n)++;
|
|
|
+ crashk_res.start = base;
|
|
|
+ crashk_res.end = base + size - 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ efi_memmap_res.start = ia64_boot_param->efi_memmap;
|
|
|
+ efi_memmap_res.end = efi_memmap_res.start +
|
|
|
+ ia64_boot_param->efi_memmap_size;
|
|
|
+ boot_param_res.start = __pa(ia64_boot_param);
|
|
|
+ boot_param_res.end = boot_param_res.start +
|
|
|
+ sizeof(*ia64_boot_param);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void __init setup_crashkernel(unsigned long total, int *n)
|
|
|
+{}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* reserve_memory - setup reserved memory areas
|
|
|
*
|
|
@@ -219,6 +261,7 @@ void __init
|
|
|
reserve_memory (void)
|
|
|
{
|
|
|
int n = 0;
|
|
|
+ unsigned long total_memory;
|
|
|
|
|
|
/*
|
|
|
* none of the entries in this table overlap
|
|
@@ -254,50 +297,11 @@ reserve_memory (void)
|
|
|
n++;
|
|
|
#endif
|
|
|
|
|
|
- efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
|
|
|
+ total_memory = efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
|
|
|
n++;
|
|
|
|
|
|
-#ifdef CONFIG_KEXEC
|
|
|
- /* crashkernel=size@offset specifies the size to reserve for a crash
|
|
|
- * kernel. If offset is 0, then it is determined automatically.
|
|
|
- * By reserving this memory we guarantee that linux never set's it
|
|
|
- * up as a DMA target.Useful for holding code to do something
|
|
|
- * appropriate after a kernel panic.
|
|
|
- */
|
|
|
- {
|
|
|
- char *from = strstr(boot_command_line, "crashkernel=");
|
|
|
- unsigned long base, size;
|
|
|
- if (from) {
|
|
|
- size = memparse(from + 12, &from);
|
|
|
- if (*from == '@')
|
|
|
- base = memparse(from+1, &from);
|
|
|
- else
|
|
|
- base = 0;
|
|
|
- if (size) {
|
|
|
- if (!base) {
|
|
|
- sort_regions(rsvd_region, n);
|
|
|
- base = kdump_find_rsvd_region(size,
|
|
|
- rsvd_region, n);
|
|
|
- }
|
|
|
- if (base != ~0UL) {
|
|
|
- rsvd_region[n].start =
|
|
|
- (unsigned long)__va(base);
|
|
|
- rsvd_region[n].end =
|
|
|
- (unsigned long)__va(base + size);
|
|
|
- n++;
|
|
|
- crashk_res.start = base;
|
|
|
- crashk_res.end = base + size - 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- efi_memmap_res.start = ia64_boot_param->efi_memmap;
|
|
|
- efi_memmap_res.end = efi_memmap_res.start +
|
|
|
- ia64_boot_param->efi_memmap_size;
|
|
|
- boot_param_res.start = __pa(ia64_boot_param);
|
|
|
- boot_param_res.end = boot_param_res.start +
|
|
|
- sizeof(*ia64_boot_param);
|
|
|
- }
|
|
|
-#endif
|
|
|
+ setup_crashkernel(total_memory, &n);
|
|
|
+
|
|
|
/* end of memory marker */
|
|
|
rsvd_region[n].start = ~0UL;
|
|
|
rsvd_region[n].end = ~0UL;
|