diff options
-rw-r--r-- | arch/x86/boot/memory.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/e820.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/e820_64.c | 6 | ||||
-rw-r--r-- | arch/x86/mach-default/setup.c | 4 | ||||
-rw-r--r-- | arch/x86/mach-voyager/setup.c | 4 | ||||
-rw-r--r-- | include/asm-x86/e820.h | 3 | ||||
-rw-r--r-- | include/asm-x86/setup.h | 1 |
7 files changed, 19 insertions, 11 deletions
diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c index acad32eb4290..53165c97336b 100644 --- a/arch/x86/boot/memory.c +++ b/arch/x86/boot/memory.c | |||
@@ -13,6 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include "boot.h" | 15 | #include "boot.h" |
16 | #include <linux/kernel.h> | ||
16 | 17 | ||
17 | #define SMAP 0x534d4150 /* ASCII "SMAP" */ | 18 | #define SMAP 0x534d4150 /* ASCII "SMAP" */ |
18 | 19 | ||
@@ -53,7 +54,7 @@ static int detect_memory_e820(void) | |||
53 | 54 | ||
54 | count++; | 55 | count++; |
55 | desc++; | 56 | desc++; |
56 | } while (next && count < E820MAX); | 57 | } while (next && count < ARRAY_SIZE(boot_params.e820_map)); |
57 | 58 | ||
58 | return boot_params.e820_entries = count; | 59 | return boot_params.e820_entries = count; |
59 | } | 60 | } |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 2cb686f60d0d..2396b9da8027 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -95,7 +95,7 @@ void __init add_memory_region(u64 start, u64 size, int type) | |||
95 | { | 95 | { |
96 | int x = e820.nr_map; | 96 | int x = e820.nr_map; |
97 | 97 | ||
98 | if (x == E820MAX) { | 98 | if (x == ARRAY_SIZE(e820.map)) { |
99 | printk(KERN_ERR "Ooops! Too many entries in the memory map!\n"); | 99 | printk(KERN_ERR "Ooops! Too many entries in the memory map!\n"); |
100 | return; | 100 | return; |
101 | } | 101 | } |
@@ -142,7 +142,8 @@ void __init e820_print_map(char *who) | |||
142 | * replaces the original e820 map with a new one, removing overlaps. | 142 | * replaces the original e820 map with a new one, removing overlaps. |
143 | * | 143 | * |
144 | */ | 144 | */ |
145 | int __init sanitize_e820_map(struct e820entry *biosmap, char *pnr_map) | 145 | int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, |
146 | char *pnr_map) | ||
146 | { | 147 | { |
147 | struct change_member { | 148 | struct change_member { |
148 | struct e820entry *pbios; /* pointer to original bios entry */ | 149 | struct e820entry *pbios; /* pointer to original bios entry */ |
@@ -314,7 +315,7 @@ int __init sanitize_e820_map(struct e820entry *biosmap, char *pnr_map) | |||
314 | * no more space left for new | 315 | * no more space left for new |
315 | * bios entries ? | 316 | * bios entries ? |
316 | */ | 317 | */ |
317 | if (++new_bios_entry >= E820MAX) | 318 | if (++new_bios_entry >= max_nr_map) |
318 | break; | 319 | break; |
319 | } | 320 | } |
320 | if (current_type != 0) { | 321 | if (current_type != 0) { |
@@ -403,7 +404,7 @@ void __init update_e820(void) | |||
403 | u8 nr_map; | 404 | u8 nr_map; |
404 | 405 | ||
405 | nr_map = e820.nr_map; | 406 | nr_map = e820.nr_map; |
406 | if (sanitize_e820_map(e820.map, &nr_map)) | 407 | if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr_map)) |
407 | return; | 408 | return; |
408 | e820.nr_map = nr_map; | 409 | e820.nr_map = nr_map; |
409 | printk(KERN_INFO "modified physical RAM map:\n"); | 410 | printk(KERN_INFO "modified physical RAM map:\n"); |
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c index c10b4aece5e4..58dc6eee4d4f 100644 --- a/arch/x86/kernel/e820_64.c +++ b/arch/x86/kernel/e820_64.c | |||
@@ -413,7 +413,9 @@ char *__init machine_specific_memory_setup(void) | |||
413 | * Otherwise fake a memory map; one section from 0k->640k, | 413 | * Otherwise fake a memory map; one section from 0k->640k, |
414 | * the next section from 1mb->appropriate_mem_k | 414 | * the next section from 1mb->appropriate_mem_k |
415 | */ | 415 | */ |
416 | sanitize_e820_map(boot_params.e820_map, &boot_params.e820_entries); | 416 | sanitize_e820_map(boot_params.e820_map, |
417 | ARRAY_SIZE(boot_params.e820_map), | ||
418 | &boot_params.e820_entries); | ||
417 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) | 419 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) |
418 | early_panic("Cannot find a valid memory map"); | 420 | early_panic("Cannot find a valid memory map"); |
419 | printk(KERN_INFO "BIOS-provided physical RAM map:\n"); | 421 | printk(KERN_INFO "BIOS-provided physical RAM map:\n"); |
@@ -484,7 +486,7 @@ void __init finish_e820_parsing(void) | |||
484 | if (userdef) { | 486 | if (userdef) { |
485 | char nr = e820.nr_map; | 487 | char nr = e820.nr_map; |
486 | 488 | ||
487 | if (sanitize_e820_map(e820.map, &nr) < 0) | 489 | if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0) |
488 | early_panic("Invalid user supplied memory map"); | 490 | early_panic("Invalid user supplied memory map"); |
489 | e820.nr_map = nr; | 491 | e820.nr_map = nr; |
490 | 492 | ||
diff --git a/arch/x86/mach-default/setup.c b/arch/x86/mach-default/setup.c index 0c28a071824c..38a856c4fc07 100644 --- a/arch/x86/mach-default/setup.c +++ b/arch/x86/mach-default/setup.c | |||
@@ -163,7 +163,9 @@ char * __init machine_specific_memory_setup(void) | |||
163 | * Otherwise fake a memory map; one section from 0k->640k, | 163 | * Otherwise fake a memory map; one section from 0k->640k, |
164 | * the next section from 1mb->appropriate_mem_k | 164 | * the next section from 1mb->appropriate_mem_k |
165 | */ | 165 | */ |
166 | sanitize_e820_map(boot_params.e820_map, &boot_params.e820_entries); | 166 | sanitize_e820_map(boot_params.e820_map, |
167 | ARRAY_SIZE(boot_params.e820_map), | ||
168 | &boot_params.e820_entries); | ||
167 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) | 169 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) |
168 | < 0) { | 170 | < 0) { |
169 | unsigned long mem_size; | 171 | unsigned long mem_size; |
diff --git a/arch/x86/mach-voyager/setup.c b/arch/x86/mach-voyager/setup.c index 5ae5466b9eb9..662b5c0a77d6 100644 --- a/arch/x86/mach-voyager/setup.c +++ b/arch/x86/mach-voyager/setup.c | |||
@@ -111,7 +111,9 @@ char *__init machine_specific_memory_setup(void) | |||
111 | * Otherwise fake a memory map; one section from 0k->640k, | 111 | * Otherwise fake a memory map; one section from 0k->640k, |
112 | * the next section from 1mb->appropriate_mem_k | 112 | * the next section from 1mb->appropriate_mem_k |
113 | */ | 113 | */ |
114 | sanitize_e820_map(boot_params.e820_map, &boot_params.e820_entries); | 114 | sanitize_e820_map(boot_params.e820_map, |
115 | ARRAY_SIZE(boot_params.e820_map), | ||
116 | &boot_params.e820_entries); | ||
115 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) | 117 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) |
116 | < 0) { | 118 | < 0) { |
117 | unsigned long mem_size; | 119 | unsigned long mem_size; |
diff --git a/include/asm-x86/e820.h b/include/asm-x86/e820.h index b5b519feba1d..65c891d2a4cb 100644 --- a/include/asm-x86/e820.h +++ b/include/asm-x86/e820.h | |||
@@ -27,7 +27,8 @@ extern int e820_any_mapped(u64 start, u64 end, unsigned type); | |||
27 | extern int e820_all_mapped(u64 start, u64 end, unsigned type); | 27 | extern int e820_all_mapped(u64 start, u64 end, unsigned type); |
28 | extern void add_memory_region(u64 start, u64 size, int type); | 28 | extern void add_memory_region(u64 start, u64 size, int type); |
29 | extern void e820_print_map(char *who); | 29 | extern void e820_print_map(char *who); |
30 | extern int sanitize_e820_map(struct e820entry *biosmap, char *pnr_map); | 30 | extern int |
31 | sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, char *pnr_map); | ||
31 | extern int copy_e820_map(struct e820entry *biosmap, int nr_map); | 32 | extern int copy_e820_map(struct e820entry *biosmap, int nr_map); |
32 | extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, | 33 | extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, |
33 | unsigned new_type); | 34 | unsigned new_type); |
diff --git a/include/asm-x86/setup.h b/include/asm-x86/setup.h index fa6763af8d26..ffa0f540fc7f 100644 --- a/include/asm-x86/setup.h +++ b/include/asm-x86/setup.h | |||
@@ -56,7 +56,6 @@ char * __init machine_specific_memory_setup(void); | |||
56 | char *memory_setup(void); | 56 | char *memory_setup(void); |
57 | 57 | ||
58 | int __init copy_e820_map(struct e820entry *biosmap, int nr_map); | 58 | int __init copy_e820_map(struct e820entry *biosmap, int nr_map); |
59 | int __init sanitize_e820_map(struct e820entry *biosmap, char *pnr_map); | ||
60 | void __init add_memory_region(unsigned long long start, | 59 | void __init add_memory_region(unsigned long long start, |
61 | unsigned long long size, int type); | 60 | unsigned long long size, int type); |
62 | 61 | ||