diff options
Diffstat (limited to 'arch/x86/kernel/e820.c')
-rw-r--r-- | arch/x86/kernel/e820.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 294f26da0c0c..3e2ef8425316 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/crash_dump.h> | ||
14 | #include <linux/bootmem.h> | 15 | #include <linux/bootmem.h> |
15 | #include <linux/pfn.h> | 16 | #include <linux/pfn.h> |
16 | #include <linux/suspend.h> | 17 | #include <linux/suspend.h> |
@@ -667,21 +668,15 @@ __init void e820_setup_gap(void) | |||
667 | * boot_params.e820_map, others are passed via SETUP_E820_EXT node of | 668 | * boot_params.e820_map, others are passed via SETUP_E820_EXT node of |
668 | * linked list of struct setup_data, which is parsed here. | 669 | * linked list of struct setup_data, which is parsed here. |
669 | */ | 670 | */ |
670 | void __init parse_e820_ext(struct setup_data *sdata, unsigned long pa_data) | 671 | void __init parse_e820_ext(struct setup_data *sdata) |
671 | { | 672 | { |
672 | u32 map_len; | ||
673 | int entries; | 673 | int entries; |
674 | struct e820entry *extmap; | 674 | struct e820entry *extmap; |
675 | 675 | ||
676 | entries = sdata->len / sizeof(struct e820entry); | 676 | entries = sdata->len / sizeof(struct e820entry); |
677 | map_len = sdata->len + sizeof(struct setup_data); | ||
678 | if (map_len > PAGE_SIZE) | ||
679 | sdata = early_ioremap(pa_data, map_len); | ||
680 | extmap = (struct e820entry *)(sdata->data); | 677 | extmap = (struct e820entry *)(sdata->data); |
681 | __append_e820_map(extmap, entries); | 678 | __append_e820_map(extmap, entries); |
682 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); | 679 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); |
683 | if (map_len > PAGE_SIZE) | ||
684 | early_iounmap(sdata, map_len); | ||
685 | printk(KERN_INFO "extended physical RAM map:\n"); | 680 | printk(KERN_INFO "extended physical RAM map:\n"); |
686 | e820_print_map("extended"); | 681 | e820_print_map("extended"); |
687 | } | 682 | } |
@@ -847,15 +842,21 @@ static int __init parse_memopt(char *p) | |||
847 | if (!p) | 842 | if (!p) |
848 | return -EINVAL; | 843 | return -EINVAL; |
849 | 844 | ||
850 | #ifdef CONFIG_X86_32 | ||
851 | if (!strcmp(p, "nopentium")) { | 845 | if (!strcmp(p, "nopentium")) { |
846 | #ifdef CONFIG_X86_32 | ||
852 | setup_clear_cpu_cap(X86_FEATURE_PSE); | 847 | setup_clear_cpu_cap(X86_FEATURE_PSE); |
853 | return 0; | 848 | return 0; |
854 | } | 849 | #else |
850 | printk(KERN_WARNING "mem=nopentium ignored! (only supported on x86_32)\n"); | ||
851 | return -EINVAL; | ||
855 | #endif | 852 | #endif |
853 | } | ||
856 | 854 | ||
857 | userdef = 1; | 855 | userdef = 1; |
858 | mem_size = memparse(p, &p); | 856 | mem_size = memparse(p, &p); |
857 | /* don't remove all of memory when handling "mem={invalid}" param */ | ||
858 | if (mem_size == 0) | ||
859 | return -EINVAL; | ||
859 | e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1); | 860 | e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1); |
860 | 861 | ||
861 | return 0; | 862 | return 0; |