aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/e820.c5
-rw-r--r--arch/x86/kernel/e820_64.c7
-rw-r--r--arch/x86/mach-default/setup.c5
-rw-r--r--arch/x86/mach-voyager/setup.c5
-rw-r--r--include/asm-x86/e820.h2
5 files changed, 17 insertions, 7 deletions
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 3f7777b255aa..91abf5b2fb94 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -143,7 +143,7 @@ void __init e820_print_map(char *who)
143 * 143 *
144 */ 144 */
145int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, 145int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
146 char *pnr_map) 146 int *pnr_map)
147{ 147{
148 struct change_member { 148 struct change_member {
149 struct e820entry *pbios; /* pointer to original bios entry */ 149 struct e820entry *pbios; /* pointer to original bios entry */
@@ -204,6 +204,7 @@ static struct e820entry new_bios[E820_X_MAX] __initdata;
204 return -1; 204 return -1;
205 205
206 old_nr = *pnr_map; 206 old_nr = *pnr_map;
207 BUG_ON(old_nr > max_nr_map);
207 208
208 /* bail out if we find any unreasonable addresses in bios map */ 209 /* bail out if we find any unreasonable addresses in bios map */
209 for (i = 0; i < old_nr; i++) 210 for (i = 0; i < old_nr; i++)
@@ -401,7 +402,7 @@ u64 __init update_memory_range(u64 start, u64 size, unsigned old_type,
401 402
402void __init update_e820(void) 403void __init update_e820(void)
403{ 404{
404 u8 nr_map; 405 int nr_map;
405 406
406 nr_map = e820.nr_map; 407 nr_map = e820.nr_map;
407 if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr_map)) 408 if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr_map))
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c
index 58dc6eee4d4f..354fbb221709 100644
--- a/arch/x86/kernel/e820_64.c
+++ b/arch/x86/kernel/e820_64.c
@@ -407,15 +407,18 @@ static void early_panic(char *msg)
407char *__init machine_specific_memory_setup(void) 407char *__init machine_specific_memory_setup(void)
408{ 408{
409 char *who = "BIOS-e820"; 409 char *who = "BIOS-e820";
410 int new_nr;
410 /* 411 /*
411 * Try to copy the BIOS-supplied E820-map. 412 * Try to copy the BIOS-supplied E820-map.
412 * 413 *
413 * Otherwise fake a memory map; one section from 0k->640k, 414 * Otherwise fake a memory map; one section from 0k->640k,
414 * the next section from 1mb->appropriate_mem_k 415 * the next section from 1mb->appropriate_mem_k
415 */ 416 */
417 new_nr = boot_params.e820_entries;
416 sanitize_e820_map(boot_params.e820_map, 418 sanitize_e820_map(boot_params.e820_map,
417 ARRAY_SIZE(boot_params.e820_map), 419 ARRAY_SIZE(boot_params.e820_map),
418 &boot_params.e820_entries); 420 &new_nr);
421 boot_params.e820_entries = new_nr;
419 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) 422 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
420 early_panic("Cannot find a valid memory map"); 423 early_panic("Cannot find a valid memory map");
421 printk(KERN_INFO "BIOS-provided physical RAM map:\n"); 424 printk(KERN_INFO "BIOS-provided physical RAM map:\n");
@@ -484,7 +487,7 @@ early_param("memmap", parse_memmap_opt);
484void __init finish_e820_parsing(void) 487void __init finish_e820_parsing(void)
485{ 488{
486 if (userdef) { 489 if (userdef) {
487 char nr = e820.nr_map; 490 int nr = e820.nr_map;
488 491
489 if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0) 492 if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0)
490 early_panic("Invalid user supplied memory map"); 493 early_panic("Invalid user supplied memory map");
diff --git a/arch/x86/mach-default/setup.c b/arch/x86/mach-default/setup.c
index 38a856c4fc07..56b4c39cb7fa 100644
--- a/arch/x86/mach-default/setup.c
+++ b/arch/x86/mach-default/setup.c
@@ -153,6 +153,7 @@ late_initcall(print_ipi_mode);
153char * __init machine_specific_memory_setup(void) 153char * __init machine_specific_memory_setup(void)
154{ 154{
155 char *who; 155 char *who;
156 int new_nr;
156 157
157 158
158 who = "BIOS-e820"; 159 who = "BIOS-e820";
@@ -163,9 +164,11 @@ char * __init machine_specific_memory_setup(void)
163 * Otherwise fake a memory map; one section from 0k->640k, 164 * Otherwise fake a memory map; one section from 0k->640k,
164 * the next section from 1mb->appropriate_mem_k 165 * the next section from 1mb->appropriate_mem_k
165 */ 166 */
167 new_nr = boot_params.e820_entries;
166 sanitize_e820_map(boot_params.e820_map, 168 sanitize_e820_map(boot_params.e820_map,
167 ARRAY_SIZE(boot_params.e820_map), 169 ARRAY_SIZE(boot_params.e820_map),
168 &boot_params.e820_entries); 170 &new_nr);
171 boot_params.e820_entries = new_nr;
169 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) 172 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
170 < 0) { 173 < 0) {
171 unsigned long mem_size; 174 unsigned long mem_size;
diff --git a/arch/x86/mach-voyager/setup.c b/arch/x86/mach-voyager/setup.c
index 662b5c0a77d6..f4aca9fa9546 100644
--- a/arch/x86/mach-voyager/setup.c
+++ b/arch/x86/mach-voyager/setup.c
@@ -62,6 +62,7 @@ void __init time_init_hook(void)
62char *__init machine_specific_memory_setup(void) 62char *__init machine_specific_memory_setup(void)
63{ 63{
64 char *who; 64 char *who;
65 int new_nr;
65 66
66 who = "NOT VOYAGER"; 67 who = "NOT VOYAGER";
67 68
@@ -111,9 +112,11 @@ char *__init machine_specific_memory_setup(void)
111 * Otherwise fake a memory map; one section from 0k->640k, 112 * Otherwise fake a memory map; one section from 0k->640k,
112 * the next section from 1mb->appropriate_mem_k 113 * the next section from 1mb->appropriate_mem_k
113 */ 114 */
115 new_nr = boot_params.e820_entries;
114 sanitize_e820_map(boot_params.e820_map, 116 sanitize_e820_map(boot_params.e820_map,
115 ARRAY_SIZE(boot_params.e820_map), 117 ARRAY_SIZE(boot_params.e820_map),
116 &boot_params.e820_entries); 118 &new_nr);
119 boot_params.e820_entries = new_nr;
117 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) 120 if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
118 < 0) { 121 < 0) {
119 unsigned long mem_size; 122 unsigned long mem_size;
diff --git a/include/asm-x86/e820.h b/include/asm-x86/e820.h
index ab18457a95c0..1eb13b881437 100644
--- a/include/asm-x86/e820.h
+++ b/include/asm-x86/e820.h
@@ -63,7 +63,7 @@ extern int e820_all_mapped(u64 start, u64 end, unsigned type);
63extern void add_memory_region(u64 start, u64 size, int type); 63extern void add_memory_region(u64 start, u64 size, int type);
64extern void e820_print_map(char *who); 64extern void e820_print_map(char *who);
65extern int 65extern int
66sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, char *pnr_map); 66sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map);
67extern int copy_e820_map(struct e820entry *biosmap, int nr_map); 67extern int copy_e820_map(struct e820entry *biosmap, int nr_map);
68extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, 68extern u64 update_memory_range(u64 start, u64 size, unsigned old_type,
69 unsigned new_type); 69 unsigned new_type);