[ARM] Fix non-page aligned boot time mappings
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Wed, 4 Jul 2007 20:16:33 +0000 (21:16 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 4 Jul 2007 20:16:33 +0000 (21:16 +0100)
AT91SAM9260 stopped booting with the recent changes to MM
initialisation - it was asking for a non-aligned virtual address
which caused loops to be non-terminal.  Fix this by rounding
virtual addresses down, but remember to include the offset in
the length, and round the length up to the following page.

This means that asking for a mapping of 4K starting at 2K into
a page maps two pages as one would expect.

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

index 02e050ae59f6871e89d20481c66e251063486412..3b5e47dc0c9737fe7e996769a45c416bb5201c1d 100644 (file)
@@ -527,9 +527,9 @@ void __init create_mapping(struct map_desc *md)
                return;
        }
 
-       addr = md->virtual;
+       addr = md->virtual & PAGE_MASK;
        phys = (unsigned long)__pfn_to_phys(md->pfn);
-       length = PAGE_ALIGN(md->length);
+       length = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));
 
        if (type->prot_l1 == 0 && ((addr | phys | length) & ~SECTION_MASK)) {
                printk(KERN_WARNING "BUG: map for 0x%08lx at 0x%08lx can not "