[ARM] 3859/1: Fix devicemaps_init() XIP_KERNEL odd 1MiB XIP_PHYS_ADDR translation...
authorGeorge G. Davis <davis_g@mvista.com>
Fri, 22 Sep 2006 17:36:38 +0000 (18:36 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 27 Sep 2006 08:35:05 +0000 (09:35 +0100)
The ARM XIP_KERNEL map created in devicemaps_init() is wrong.
The map.pfn is rounded down to an even 1MiB section boundary
which results in va/pa translations errors when XIP_PHYS_ADDR
starts on an odd 1MiB boundary and this causes the kernel to
hang.  This patch fixes ARM XIP_KERNEL translation errors for
the odd 1MiB XIP_PHYS_ADDR boundary case.

Signed-off-by: George G. Davis <gdavis@mvista.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/init.c
include/asm-arm/pgtable.h

index 1099af6d470ad619be8aa5eeecd64a11705c0282..64262bda8e54d97d4b3002b24b4024865fd12de6 100644 (file)
@@ -434,9 +434,9 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
         * It is always first in the modulearea.
         */
 #ifdef CONFIG_XIP_KERNEL
-       map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & PGDIR_MASK);
+       map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & SECTION_MASK);
        map.virtual = MODULE_START;
-       map.length = ((unsigned long)&_etext - map.virtual + ~PGDIR_MASK) & PGDIR_MASK;
+       map.length = ((unsigned long)&_etext - map.virtual + ~SECTION_MASK) & SECTION_MASK;
        map.type = MT_ROM;
        create_mapping(&map);
 #endif
index 8d3919c6458c6c9326ef35a35ee7c848d34ac467..38b2b55688e2b4542d7d9eefb9f3387435b8014e 100644 (file)
@@ -135,6 +135,13 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
 #define FIRST_USER_PGD_NR      1
 #define USER_PTRS_PER_PGD      ((TASK_SIZE/PGDIR_SIZE) - FIRST_USER_PGD_NR)
 
+/*
+ * section address mask and size definitions.
+ */
+#define SECTION_SHIFT          20
+#define SECTION_SIZE           (1UL << SECTION_SHIFT)
+#define SECTION_MASK           (~(SECTION_SIZE-1))
+
 /*
  * ARMv6 supersection address mask and size definitions.
  */