diff options
-rw-r--r-- | arch/x86/kernel/e820.c | 5 | ||||
-rw-r--r-- | arch/x86/kernel/e820_64.c | 7 | ||||
-rw-r--r-- | arch/x86/mach-default/setup.c | 5 | ||||
-rw-r--r-- | arch/x86/mach-voyager/setup.c | 5 | ||||
-rw-r--r-- | include/asm-x86/e820.h | 2 |
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 | */ |
145 | int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, | 145 | int __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 | ||
402 | void __init update_e820(void) | 403 | void __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) | |||
407 | char *__init machine_specific_memory_setup(void) | 407 | char *__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); | |||
484 | void __init finish_e820_parsing(void) | 487 | void __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); | |||
153 | char * __init machine_specific_memory_setup(void) | 153 | char * __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) | |||
62 | char *__init machine_specific_memory_setup(void) | 62 | char *__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); | |||
63 | extern void add_memory_region(u64 start, u64 size, int type); | 63 | extern void add_memory_region(u64 start, u64 size, int type); |
64 | extern void e820_print_map(char *who); | 64 | extern void e820_print_map(char *who); |
65 | extern int | 65 | extern int |
66 | sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, char *pnr_map); | 66 | sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map); |
67 | extern int copy_e820_map(struct e820entry *biosmap, int nr_map); | 67 | extern int copy_e820_map(struct e820entry *biosmap, int nr_map); |
68 | extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, | 68 | extern u64 update_memory_range(u64 start, u64 size, unsigned old_type, |
69 | unsigned new_type); | 69 | unsigned new_type); |