diff options
| -rw-r--r-- | arch/i386/kernel/efi.c | 4 | ||||
| -rw-r--r-- | arch/i386/kernel/setup.c | 32 | ||||
| -rw-r--r-- | arch/i386/mm/discontig.c | 2 |
3 files changed, 38 insertions, 0 deletions
diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c index f732f427b418..385883ea8c19 100644 --- a/arch/i386/kernel/efi.c +++ b/arch/i386/kernel/efi.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/ioport.h> | 30 | #include <linux/ioport.h> |
| 31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
| 32 | #include <linux/efi.h> | 32 | #include <linux/efi.h> |
| 33 | #include <linux/kexec.h> | ||
| 33 | 34 | ||
| 34 | #include <asm/setup.h> | 35 | #include <asm/setup.h> |
| 35 | #include <asm/io.h> | 36 | #include <asm/io.h> |
| @@ -598,6 +599,9 @@ efi_initialize_iomem_resources(struct resource *code_resource, | |||
| 598 | if (md->type == EFI_CONVENTIONAL_MEMORY) { | 599 | if (md->type == EFI_CONVENTIONAL_MEMORY) { |
| 599 | request_resource(res, code_resource); | 600 | request_resource(res, code_resource); |
| 600 | request_resource(res, data_resource); | 601 | request_resource(res, data_resource); |
| 602 | #ifdef CONFIG_KEXEC | ||
| 603 | request_resource(res, &crashk_res); | ||
| 604 | #endif | ||
| 601 | } | 605 | } |
| 602 | } | 606 | } |
| 603 | } | 607 | } |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 6337157f5df3..d88ebdfa6ccd 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
| @@ -43,7 +43,10 @@ | |||
| 43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
| 44 | #include <linux/edd.h> | 44 | #include <linux/edd.h> |
| 45 | #include <linux/nodemask.h> | 45 | #include <linux/nodemask.h> |
| 46 | #include <linux/kexec.h> | ||
| 47 | |||
| 46 | #include <video/edid.h> | 48 | #include <video/edid.h> |
| 49 | |||
| 47 | #include <asm/apic.h> | 50 | #include <asm/apic.h> |
| 48 | #include <asm/e820.h> | 51 | #include <asm/e820.h> |
| 49 | #include <asm/mpspec.h> | 52 | #include <asm/mpspec.h> |
| @@ -846,6 +849,27 @@ static void __init parse_cmdline_early (char ** cmdline_p) | |||
| 846 | lapic_disable(); | 849 | lapic_disable(); |
| 847 | #endif /* CONFIG_X86_LOCAL_APIC */ | 850 | #endif /* CONFIG_X86_LOCAL_APIC */ |
| 848 | 851 | ||
| 852 | #ifdef CONFIG_KEXEC | ||
| 853 | /* crashkernel=size@addr specifies the location to reserve for | ||
| 854 | * a crash kernel. By reserving this memory we guarantee | ||
| 855 | * that linux never set's it up as a DMA target. | ||
| 856 | * Useful for holding code to do something appropriate | ||
| 857 | * after a kernel panic. | ||
| 858 | */ | ||
| 859 | else if (!memcmp(from, "crashkernel=", 12)) { | ||
| 860 | unsigned long size, base; | ||
| 861 | size = memparse(from+12, &from); | ||
| 862 | if (*from == '@') { | ||
| 863 | base = memparse(from+1, &from); | ||
| 864 | /* FIXME: Do I want a sanity check | ||
| 865 | * to validate the memory range? | ||
| 866 | */ | ||
| 867 | crashk_res.start = base; | ||
| 868 | crashk_res.end = base + size - 1; | ||
| 869 | } | ||
| 870 | } | ||
| 871 | #endif | ||
| 872 | |||
| 849 | /* | 873 | /* |
| 850 | * highmem=size forces highmem to be exactly 'size' bytes. | 874 | * highmem=size forces highmem to be exactly 'size' bytes. |
| 851 | * This works even on boxes that have no highmem otherwise. | 875 | * This works even on boxes that have no highmem otherwise. |
| @@ -1181,6 +1205,11 @@ void __init setup_bootmem_allocator(void) | |||
| 1181 | } | 1205 | } |
| 1182 | } | 1206 | } |
| 1183 | #endif | 1207 | #endif |
| 1208 | #ifdef CONFIG_KEXEC | ||
| 1209 | if (crashk_res.start != crashk_res.end) | ||
| 1210 | reserve_bootmem(crashk_res.start, | ||
| 1211 | crashk_res.end - crashk_res.start + 1); | ||
| 1212 | #endif | ||
| 1184 | } | 1213 | } |
| 1185 | 1214 | ||
| 1186 | /* | 1215 | /* |
| @@ -1234,6 +1263,9 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat | |||
| 1234 | */ | 1263 | */ |
| 1235 | request_resource(res, code_resource); | 1264 | request_resource(res, code_resource); |
| 1236 | request_resource(res, data_resource); | 1265 | request_resource(res, data_resource); |
| 1266 | #ifdef CONFIG_KEXEC | ||
| 1267 | request_resource(res, &crashk_res); | ||
| 1268 | #endif | ||
| 1237 | } | 1269 | } |
| 1238 | } | 1270 | } |
| 1239 | } | 1271 | } |
diff --git a/arch/i386/mm/discontig.c b/arch/i386/mm/discontig.c index f429c871e845..b358f0702a44 100644 --- a/arch/i386/mm/discontig.c +++ b/arch/i386/mm/discontig.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include <linux/initrd.h> | 30 | #include <linux/initrd.h> |
| 31 | #include <linux/nodemask.h> | 31 | #include <linux/nodemask.h> |
| 32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
| 33 | #include <linux/kexec.h> | ||
| 34 | |||
| 33 | #include <asm/e820.h> | 35 | #include <asm/e820.h> |
| 34 | #include <asm/setup.h> | 36 | #include <asm/setup.h> |
| 35 | #include <asm/mmzone.h> | 37 | #include <asm/mmzone.h> |
