diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2007-07-04 16:16:33 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-07-04 16:16:33 -0400 |
commit | 7b9c7b4d07fd8981193a2c4ecb650566f42d1219 (patch) | |
tree | bd80d48a0d024588571b9c9d30d3f8ee8cbe1418 /arch/arm/mm/mmu.c | |
parent | 1f750a782c0e9593a8d0981ea972f22334980955 (diff) |
[ARM] Fix non-page aligned boot time mappings
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>
Diffstat (limited to 'arch/arm/mm/mmu.c')
-rw-r--r-- | arch/arm/mm/mmu.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 02e050ae59f6..3b5e47dc0c97 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -527,9 +527,9 @@ void __init create_mapping(struct map_desc *md) | |||
527 | return; | 527 | return; |
528 | } | 528 | } |
529 | 529 | ||
530 | addr = md->virtual; | 530 | addr = md->virtual & PAGE_MASK; |
531 | phys = (unsigned long)__pfn_to_phys(md->pfn); | 531 | phys = (unsigned long)__pfn_to_phys(md->pfn); |
532 | length = PAGE_ALIGN(md->length); | 532 | length = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK)); |
533 | 533 | ||
534 | if (type->prot_l1 == 0 && ((addr | phys | length) & ~SECTION_MASK)) { | 534 | if (type->prot_l1 == 0 && ((addr | phys | length) & ~SECTION_MASK)) { |
535 | printk(KERN_WARNING "BUG: map for 0x%08lx at 0x%08lx can not " | 535 | printk(KERN_WARNING "BUG: map for 0x%08lx at 0x%08lx can not " |