Merge master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-drm-fsl-dcu.git] / arch / arm / kernel / head.S
index d994561816a1a15cdef675914fb1d675d23c2a5b..1d35edacc01113af898946e8d5b33f4b7a0dc17d 100644 (file)
 #include <asm/thread_info.h>
 #include <asm/system.h>
 
+#if (PHYS_OFFSET & 0x001fffff)
+#error "PHYS_OFFSET must be at an even 2MiB boundary!"
+#endif
+
 #define KERNEL_RAM_VADDR       (PAGE_OFFSET + TEXT_OFFSET)
 #define KERNEL_RAM_PADDR       (PHYS_OFFSET + TEXT_OFFSET)
 
        .endm
 
 #ifdef CONFIG_XIP_KERNEL
-#define TEXTADDR  XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+#define KERNEL_START   XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+#define KERNEL_END     _edata_loc
 #else
-#define TEXTADDR  KERNEL_RAM_VADDR
+#define KERNEL_START   KERNEL_RAM_VADDR
+#define KERNEL_END     _end
 #endif
 
 /*
@@ -236,39 +242,44 @@ __create_page_tables:
         * Now setup the pagetables for our kernel direct
         * mapped region.
         */
-       add     r0, r4,  #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
-       str     r3, [r0, #(TEXTADDR & 0x00f00000) >> 18]!
-
-       ldr     r6, =(_end - PAGE_OFFSET - 1)   @ r6 = number of sections
-       mov     r6, r6, lsr #20                 @ needed for kernel minus 1
-
-1:     add     r3, r3, #1 << 20
-       str     r3, [r0, #4]!
-       subs    r6, r6, #1
-       bgt     1b
+       add     r0, r4,  #(KERNEL_START & 0xff000000) >> 18
+       str     r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!
+       ldr     r6, =(KERNEL_END - 1)
+       add     r0, r0, #4
+       add     r6, r4, r6, lsr #18
+1:     cmp     r0, r6
+       add     r3, r3, #1 << 20
+       strls   r3, [r0], #4
+       bls     1b
 
+#ifdef CONFIG_XIP_KERNEL
        /*
-        * Then map first 1MB of ram in case it contains our boot params.
+        * Map some ram to cover our .data and .bss areas.
         */
-       add     r0, r4, #PAGE_OFFSET >> 18
-       orr     r6, r7, #PHYS_OFFSET
-       str     r6, [r0]
+       orr     r3, r7, #(KERNEL_RAM_PADDR & 0xff000000)
+       .if     (KERNEL_RAM_PADDR & 0x00f00000)
+       orr     r3, r3, #(KERNEL_RAM_PADDR & 0x00f00000)
+       .endif
+       add     r0, r4,  #(KERNEL_RAM_VADDR & 0xff000000) >> 18
+       str     r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> 18]!
+       ldr     r6, =(_end - 1)
+       add     r0, r0, #4
+       add     r6, r4, r6, lsr #18
+1:     cmp     r0, r6
+       add     r3, r3, #1 << 20
+       strls   r3, [r0], #4
+       bls     1b
+#endif
 
-#ifdef CONFIG_XIP_KERNEL
        /*
-        * Map some ram to cover our .data and .bss areas.
-        * Mapping 3MB should be plenty.
+        * Then map first 1MB of ram in case it contains our boot params.
         */
-       sub     r3, r4, #PHYS_OFFSET
-       mov     r3, r3, lsr #20
-       add     r0, r0, r3, lsl #2
-       add     r6, r6, r3, lsl #20
-       str     r6, [r0], #4
-       add     r6, r6, #(1 << 20)
-       str     r6, [r0], #4
-       add     r6, r6, #(1 << 20)
+       add     r0, r4, #PAGE_OFFSET >> 18
+       orr     r6, r7, #(PHYS_OFFSET & 0xff000000)
+       .if     (PHYS_OFFSET & 0x00f00000)
+       orr     r6, r6, #(PHYS_OFFSET & 0x00f00000)
+       .endif
        str     r6, [r0]
-#endif
 
 #ifdef CONFIG_DEBUG_LL
        ldr     r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags