diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2005-06-22 16:43:10 -0400 |
---|---|---|
committer | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2005-06-22 16:43:10 -0400 |
commit | 3a66941106855215127f8bf1afd06099b72dc75b (patch) | |
tree | 69a0ebb1143bcd2732b4d6e013207e8613ebc5b7 | |
parent | b46a58fd4e3cdd107ffccedaa5e233deeb94c5c0 (diff) |
[PATCH] ARM: Ensure memory information is page aligned
Ensure that meminfo.bank[] array contains page-aligned start/size
information.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/kernel/setup.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 9fed5fa194d9..8cf733daa800 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -395,6 +395,20 @@ static void __init early_initrd(char **p) | |||
395 | } | 395 | } |
396 | __early_param("initrd=", early_initrd); | 396 | __early_param("initrd=", early_initrd); |
397 | 397 | ||
398 | static void __init add_memory(unsigned long start, unsigned long size) | ||
399 | { | ||
400 | /* | ||
401 | * Ensure that start/size are aligned to a page boundary. | ||
402 | * Size is appropriately rounded down, start is rounded up. | ||
403 | */ | ||
404 | size -= start & ~PAGE_MASK; | ||
405 | |||
406 | meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start); | ||
407 | meminfo.bank[meminfo.nr_banks].size = size & PAGE_MASK; | ||
408 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); | ||
409 | meminfo.nr_banks += 1; | ||
410 | } | ||
411 | |||
398 | /* | 412 | /* |
399 | * Pick out the memory size. We look for mem=size@start, | 413 | * Pick out the memory size. We look for mem=size@start, |
400 | * where start and size are "size[KkMm]" | 414 | * where start and size are "size[KkMm]" |
@@ -419,10 +433,7 @@ static void __init early_mem(char **p) | |||
419 | if (**p == '@') | 433 | if (**p == '@') |
420 | start = memparse(*p + 1, p); | 434 | start = memparse(*p + 1, p); |
421 | 435 | ||
422 | meminfo.bank[meminfo.nr_banks].start = start; | 436 | add_memory(start, size); |
423 | meminfo.bank[meminfo.nr_banks].size = size; | ||
424 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); | ||
425 | meminfo.nr_banks += 1; | ||
426 | } | 437 | } |
427 | __early_param("mem=", early_mem); | 438 | __early_param("mem=", early_mem); |
428 | 439 | ||
@@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag) | |||
564 | tag->u.mem.start, tag->u.mem.size / 1024); | 575 | tag->u.mem.start, tag->u.mem.size / 1024); |
565 | return -EINVAL; | 576 | return -EINVAL; |
566 | } | 577 | } |
567 | meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start; | 578 | add_memory(tag->u.mem.start, tag->u.mem.size); |
568 | meminfo.bank[meminfo.nr_banks].size = tag->u.mem.size; | ||
569 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(tag->u.mem.start); | ||
570 | meminfo.nr_banks += 1; | ||
571 | |||
572 | return 0; | 579 | return 0; |
573 | } | 580 | } |
574 | 581 | ||