Merge branch 'upstream'
[pandora-kernel.git] / arch / arm / kernel / head.S
index 1155cf0..1aca177 100644 (file)
 
 #include <asm/assembler.h>
 #include <asm/domain.h>
-#include <asm/mach-types.h>
 #include <asm/procinfo.h>
 #include <asm/ptrace.h>
-#include <asm/constants.h>
+#include <asm/asm-offsets.h>
+#include <asm/memory.h>
 #include <asm/thread_info.h>
 #include <asm/system.h>
 
 #define MACHINFO_PGOFFIO       12
 #define MACHINFO_NAME          16
 
-#ifndef CONFIG_XIP_KERNEL
-/*
- * We place the page tables 16K below TEXTADDR.  Therefore, we must make sure
- * that TEXTADDR is correctly set.  Currently, we expect the least significant
- * 16 bits to be 0x8000, but we could probably relax this restriction to
- * TEXTADDR >= PAGE_OFFSET + 0x4000
- *
- * Note that swapper_pg_dir is the virtual address of the page tables, and
- * pgtbl gives us a position-independent reference to these tables.  We can
- * do this because stext == TEXTADDR
- */
-#if (TEXTADDR & 0xffff) != 0x8000
-#error TEXTADDR must start at 0xXXXX8000
-#endif
+#define KERNEL_RAM_ADDR        (PAGE_OFFSET + TEXT_OFFSET)
 
-       .globl  swapper_pg_dir
-       .equ    swapper_pg_dir, TEXTADDR - 0x4000
-
-       .macro  pgtbl, rd, phys
-       adr     \rd, stext
-       sub     \rd, \rd, #0x4000
-       .endm
-#else
 /*
- * XIP Kernel:
- *
- * We place the page tables 16K below DATAADDR.  Therefore, we must make sure
- * that DATAADDR is correctly set.  Currently, we expect the least significant
- * 16 bits to be 0x8000, but we could probably relax this restriction to
- * DATAADDR >= PAGE_OFFSET + 0x4000
- *
- * Note that pgtbl is meant to return the physical address of swapper_pg_dir.
- * We can't make it relative to the kernel position in this case since
- * the kernel can physically be anywhere.
+ * swapper_pg_dir is the virtual address of the initial page table.
+ * We place the page tables 16K below KERNEL_RAM_ADDR.  Therefore, we must
+ * make sure that KERNEL_RAM_ADDR is correctly set.  Currently, we expect
+ * the least significant 16 bits to be 0x8000, but we could probably
+ * relax this restriction to KERNEL_RAM_ADDR >= PAGE_OFFSET + 0x4000.
  */
-#if (DATAADDR & 0xffff) != 0x8000
-#error DATAADDR must start at 0xXXXX8000
+#if (KERNEL_RAM_ADDR & 0xffff) != 0x8000
+#error KERNEL_RAM_ADDR must start at 0xXXXX8000
 #endif
 
        .globl  swapper_pg_dir
-       .equ    swapper_pg_dir, DATAADDR - 0x4000
+       .equ    swapper_pg_dir, KERNEL_RAM_ADDR - 0x4000
 
-       .macro  pgtbl, rd, phys
-       ldr     \rd, =((DATAADDR - 0x4000) - VIRT_OFFSET)
-       add     \rd, \rd, \phys
+       .macro  pgtbl, rd
+       ldr     \rd, =(__virt_to_phys(KERNEL_RAM_ADDR - 0x4000))
        .endm
+
+#ifdef CONFIG_XIP_KERNEL
+#define TEXTADDR  XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+#else
+#define TEXTADDR  KERNEL_RAM_ADDR
 #endif
 
 /*
@@ -106,7 +84,7 @@ ENTRY(stext)
                                                @ and irqs disabled
        bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
        movs    r10, r5                         @ invalid processor (r5=0)?
-       beq     __error_p                               @ yes, error 'p'
+       beq     __error_p                       @ yes, error 'p'
        bl      __lookup_machine_type           @ r5=machinfo
        movs    r8, r5                          @ invalid machine (r5=0)?
        beq     __error_a                       @ yes, error 'a'
@@ -273,13 +251,12 @@ __turn_mmu_on:
  * r10 = procinfo
  *
  * Returns:
- *  r0, r3, r5, r6, r7 corrupted
+ *  r0, r3, r6, r7 corrupted
  *  r4 = physical page table address
  */
        .type   __create_page_tables, %function
 __create_page_tables:
-       ldr     r5, [r8, #MACHINFO_PHYSRAM]     @ physram
-       pgtbl   r4, r5                          @ page table address
+       pgtbl   r4                              @ page table address
 
        /*
         * Clear the 16K level 1 swapper page table
@@ -324,8 +301,8 @@ __create_page_tables:
        /*
         * Then map first 1MB of ram in case it contains our boot params.
         */
-       add     r0, r4, #VIRT_OFFSET >> 18
-       orr     r6, r5, r7
+       add     r0, r4, #PAGE_OFFSET >> 18
+       orr     r6, r7, #PHYS_OFFSET
        str     r6, [r0]
 
 #ifdef CONFIG_XIP_KERNEL
@@ -333,7 +310,7 @@ __create_page_tables:
         * Map some ram to cover our .data and .bss areas.
         * Mapping 3MB should be plenty.
         */
-       sub     r3, r4, r5
+       sub     r3, r4, #PHYS_OFFSET
        mov     r3, r3, lsr #20
        add     r0, r0, r3, lsl #2
        add     r6, r6, r3, lsl #20
@@ -366,16 +343,12 @@ __create_page_tables:
        bne     1b
 #if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
        /*
-        * If we're using the NetWinder, we need to map in
-        * the 16550-type serial port for the debug messages
+        * If we're using the NetWinder or CATS, we also need to map
+        * in the 16550-type serial port for the debug messages
         */
-       teq     r1, #MACH_TYPE_NETWINDER
-       teqne   r1, #MACH_TYPE_CATS
-       bne     1f
        add     r0, r4, #0xff000000 >> 18
        orr     r3, r7, #0x7c000000
        str     r3, [r0]
-1:
 #endif
 #ifdef CONFIG_ARCH_RPC
        /*