aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/boot/memory.c3
-rw-r--r--arch/x86/kernel/e820.c9
-rw-r--r--arch/x86/kernel/e820_64.c6
-rw-r--r--arch/x86/mach-default/setup.c4
-rw-r--r--arch/x86/mach-voyager/setup.c4
-rw-r--r--include/asm-x86/e820.h3
-rw-r--r--include/asm-x86/setup.h1
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 */
145int __init sanitize_e820_map(struct e820entry *biosmap, char *pnr_map) 145int __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);
27extern int e820_all_mapped(u64 start, u64 end, unsigned type); 27extern int e820_all_mapped(u64 start, u64 end, unsigned type);
28extern void add_memory_region(u64 start, u64 size, int type); 28extern void add_memory_region(u64 start, u64 size, int type);
29extern void e820_print_map(char *who); 29extern void e820_print_map(char *who);
30extern int sanitize_e820_map(struct e820entry *biosmap, char *pnr_map); 30extern int
31sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, char *pnr_map);
31extern int copy_e820_map(struct e820entry *biosmap, int nr_map); 32extern int copy_e820_map(struct e820entry *biosmap, int nr_map);
32extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, 33extern 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);
56char *memory_setup(void); 56char *memory_setup(void);
57 57
58int __init copy_e820_map(struct e820entry *biosmap, int nr_map); 58int __init copy_e820_map(struct e820entry *biosmap, int nr_map);
59int __init sanitize_e820_map(struct e820entry *biosmap, char *pnr_map);
60void __init add_memory_region(unsigned long long start, 59void __init add_memory_region(unsigned long long start,
61 unsigned long long size, int type); 60 unsigned long long size, int type);
62 61