[PATCH] ARM: Ensure memory information is page aligned
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Wed, 22 Jun 2005 20:43:10 +0000 (21:43 +0100)
committerRussell King <rmk@dyn-67.arm.linux.org.uk>
Wed, 22 Jun 2005 20:43:10 +0000 (21:43 +0100)
Ensure that meminfo.bank[] array contains page-aligned start/size
information.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/setup.c

index 9fed5fa194d9022830e4ecc83b206f03a15a832d..8cf733daa8008f70090587f42be4d77c7acfc1a5 100644 (file)
@@ -395,6 +395,20 @@ static void __init early_initrd(char **p)
 }
 __early_param("initrd=", early_initrd);
 
 }
 __early_param("initrd=", early_initrd);
 
+static void __init add_memory(unsigned long start, unsigned long size)
+{
+       /*
+        * Ensure that start/size are aligned to a page boundary.
+        * Size is appropriately rounded down, start is rounded up.
+        */
+       size -= start & ~PAGE_MASK;
+
+       meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start);
+       meminfo.bank[meminfo.nr_banks].size  = size & PAGE_MASK;
+       meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(start);
+       meminfo.nr_banks += 1;
+}
+
 /*
  * Pick out the memory size.  We look for mem=size@start,
  * where start and size are "size[KkMm]"
 /*
  * Pick out the memory size.  We look for mem=size@start,
  * where start and size are "size[KkMm]"
@@ -419,10 +433,7 @@ static void __init early_mem(char **p)
        if (**p == '@')
                start = memparse(*p + 1, p);
 
        if (**p == '@')
                start = memparse(*p + 1, p);
 
-       meminfo.bank[meminfo.nr_banks].start = start;
-       meminfo.bank[meminfo.nr_banks].size  = size;
-       meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(start);
-       meminfo.nr_banks += 1;
+       add_memory(start, size);
 }
 __early_param("mem=", early_mem);
 
 }
 __early_param("mem=", early_mem);
 
@@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag)
                        tag->u.mem.start, tag->u.mem.size / 1024);
                return -EINVAL;
        }
                        tag->u.mem.start, tag->u.mem.size / 1024);
                return -EINVAL;
        }
-       meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start;
-       meminfo.bank[meminfo.nr_banks].size  = tag->u.mem.size;
-       meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(tag->u.mem.start);
-       meminfo.nr_banks += 1;
-
+       add_memory(tag->u.mem.start, tag->u.mem.size);
        return 0;
 }
 
        return 0;
 }