aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorPaul Jackson <pj@sgi.com>2008-05-14 11:15:34 -0400
committerThomas Gleixner <tglx@linutronix.de>2008-05-25 04:55:11 -0400
commitc3965bd15118742d72b4bc1a290d37b3f081eb98 (patch)
tree3c3acbdb900a54800d9f427b19ffb156ab16308f /arch/x86
parentb25e31cec7788ccba5749d10f8f4343fffff4750 (diff)
x86 boot: proper use of ARRAY_SIZE instead of repeated E820MAX constant
This patch is motivated by a subsequent patch which will allow for more memory map entries on EFI supported systems than can be passed via the x86 legacy BIOS E820 interface. The legacy interface is limited to E820MAX == 128 memory entries, and that "E820MAX" manifest constant was used as the size for several arrays and loops over those arrays. The primary change in this patch is to change code loop sizes over those arrays from using the constant E820MAX, to using the ARRAY_SIZE() macro evaluated for the array being looped. That way, a subsequent patch can change the size of some of these arrays, without breaking this code. This patch also adds a parameter to the sanitize_e820_map() routine, which had an implicit size for the array passed it of E820MAX entries. This new parameter explicitly passes the size of said array. Once again, this will allow a subsequent patch to change that array size for some calls to sanitize_e820_map() without breaking the code. As part of enhancing the sanitize_e820_map() interface this way, I further combined the unnecessarily distinct x86_32 and x86_64 declarations for this routine into a single, commonly used, declaration. This patch in itself should make no difference to the resulting kernel binary. [ mingo@elte.hu: merged to -tip ] Signed-off-by: Paul Jackson <pj@sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-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
5 files changed, 17 insertions, 9 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;