linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / arm / boot / compressed / head.S
index f560cbf..db3389d 100644 (file)
  * Please select one of the following when turning on debugging.
  */
 #ifdef DEBUG
-#if defined(CONFIG_DEBUG_DC21285_PORT)
-               .macro  loadsp, rb
-               mov     \rb, #0x42000000
-               .endm
-               .macro  writeb, rb
-               str     \rb, [r3, #0x160]
-               .endm
-#elif defined(CONFIG_DEBUG_ICEDCC)
-               .macro  loadsp, rb
-               .endm
-               .macro writeb, rb
-               mcr     p14, 0, \rb, c0, c1, 0
-               .endm
-#elif defined(CONFIG_FOOTBRIDGE)
-               .macro  loadsp, rb
-               mov     \rb, #0x7c000000
-               .endm
-               .macro  writeb, rb
-               strb    \rb, [r3, #0x3f8]
-               .endm
-#elif defined(CONFIG_ARCH_RPC)
-               .macro  loadsp, rb
-               mov     \rb, #0x03000000
-               orr     \rb, \rb, #0x00010000
-               .endm
-               .macro  writeb, rb
-               strb    \rb, [r3, #0x3f8 << 2]
-               .endm
-#elif defined(CONFIG_ARCH_INTEGRATOR)
+
+#if defined(CONFIG_DEBUG_ICEDCC)
                .macro  loadsp, rb
-               mov     \rb, #0x16000000
-               .endm
-               .macro  writeb, rb
-               strb    \rb, [r3, #0]
                .endm
-#elif defined(CONFIG_ARCH_PXA) /* Xscale-type */
-               .macro  loadsp, rb
-               mov     \rb, #0x40000000
-               orr     \rb, \rb, #0x00100000
+               .macro  writeb, ch, rb
+               mcr     p14, 0, \ch, c0, c1, 0
                .endm
-               .macro  writeb, rb
-               strb    \rb, [r3, #0]
+#else
+
+#include <asm/arch/debug-macro.S>
+
+               .macro  writeb, ch, rb
+               senduart \ch, \rb
                .endm
-#elif defined(CONFIG_ARCH_SA1100)
+
+#if defined(CONFIG_ARCH_SA1100)
                .macro  loadsp, rb
                mov     \rb, #0x80000000        @ physical base address
-#  if defined(CONFIG_DEBUG_LL_SER3)
+#ifdef CONFIG_DEBUG_LL_SER3
                add     \rb, \rb, #0x00050000   @ Ser3
-#  else
+#else
                add     \rb, \rb, #0x00010000   @ Ser1
-#  endif
-               .endm
-               .macro  writeb, rb
-               str     \rb, [r3, #0x14]        @ UTDR
-               .endm
-#elif defined(CONFIG_ARCH_IXP4XX)
-               .macro  loadsp, rb
-               mov     \rb, #0xc8000000
-               .endm
-               .macro  writeb, rb
-               str     \rb, [r3, #0]
-#elif defined(CONFIG_ARCH_IXP2000)
-               .macro  loadsp, rb
-               mov     \rb, #0xc0000000
-               orr     \rb, \rb, #0x00030000
-               .endm
-               .macro  writeb, rb
-               str     \rb, [r3, #0]
-               .endm
-#elif defined(CONFIG_ARCH_LH7A40X)
-               .macro  loadsp, rb
-               ldr     \rb, =0x80000700        @ UART2 UARTBASE
-               .endm
-               .macro  writeb, rb
-               strb    \rb, [r3, #0]
-               .endm
-#elif defined(CONFIG_ARCH_OMAP)
-               .macro  loadsp, rb
-               mov     \rb, #0xff000000        @ physical base address
-               add     \rb, \rb, #0x00fb0000
-#if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
-               add     \rb, \rb, #0x00000800
-#endif
-#ifdef CONFIG_OMAP_LL_DEBUG_UART3
-               add     \rb, \rb, #0x00009000
 #endif
                .endm
-               .macro  writeb, rb
-               strb    \rb, [r3]
-               .endm
 #elif defined(CONFIG_ARCH_IOP331)
                .macro loadsp, rb
                 mov    \rb, #0xff000000
                 orr     \rb, \rb, #0x00ff0000
                 orr     \rb, \rb, #0x0000f700   @ location of the UART
                .endm
-               .macro  writeb, rb
-               str     \rb, [r3, #0]
+#elif defined(CONFIG_ARCH_S3C2410)
+               .macro loadsp, rb
+               mov     \rb, #0x50000000
+               add     \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
                .endm
 #else
-#error no serial architecture defined
+               .macro  loadsp, rb
+               addruart \rb
+               .endm
+#endif
 #endif
 #endif
 
                kputc   #'\n'
                kphex   r5, 8           /* decompressed kernel start */
                kputc   #'-'
-               kphex   r8, 8           /* decompressed kernel end  */
+               kphex   r9, 8           /* decompressed kernel end  */
                kputc   #'>'
                kphex   r4, 8           /* kernel execution address */
                kputc   #'\n'
@@ -177,7 +116,7 @@ start:
                .word   start                   @ absolute load/run zImage address
                .word   _edata                  @ zImage end address
 1:             mov     r7, r1                  @ save architecture ID
-               mov     r8, #0                  @ save r0
+               mov     r8, r2                  @ save atags pointer
 
 #ifndef __ARM_ARCH_2__
                /*
@@ -205,7 +144,7 @@ not_angel:
 
                /*
                 * some architecture specific code can be inserted
-                * by the linker here, but it should preserve r7 and r8.
+                * by the linker here, but it should preserve r7, r8, and r9.
                 */
 
                .text
@@ -310,16 +249,17 @@ not_relocated:    mov     r0, #0
  * r5     = decompressed kernel start
  * r6     = processor ID
  * r7     = architecture ID
- * r8-r14 = unused
+ * r8     = atags pointer
+ * r9-r14 = corrupted
  */
                add     r1, r5, r0              @ end of decompressed kernel
                adr     r2, reloc_start
                ldr     r3, LC1
                add     r3, r2, r3
-1:             ldmia   r2!, {r8 - r13}         @ copy relocation code
-               stmia   r1!, {r8 - r13}
-               ldmia   r2!, {r8 - r13}
-               stmia   r1!, {r8 - r13}
+1:             ldmia   r2!, {r9 - r14}         @ copy relocation code
+               stmia   r1!, {r9 - r14}
+               ldmia   r2!, {r9 - r14}
+               stmia   r1!, {r9 - r14}
                cmp     r2, r3
                blo     1b
 
@@ -369,11 +309,12 @@ params:           ldr     r0, =params_phys
  *  r4 = kernel execution address
  *  r6 = processor ID
  *  r7 = architecture number
- *  r8 = run-time address of "start"
+ *  r8 = atags pointer
+ *  r9 = run-time address of "start"  (???)
  * On exit,
- *  r1, r2, r3, r8, r9, r12 corrupted
+ *  r1, r2, r3, r9, r10, r12 corrupted
  * This routine must preserve:
- *  r4, r5, r6, r7
+ *  r4, r5, r6, r7, r8
  */
                .align  5
 cache_on:      mov     r3, #8                  @ cache_on function
@@ -387,15 +328,15 @@ __setup_mmu:      sub     r3, r4, #16384          @ Page directory size
  * bits for the RAM area only.
  */
                mov     r0, r3
-               mov     r8, r0, lsr #18
-               mov     r8, r8, lsl #18         @ start of RAM
-               add     r9, r8, #0x10000000     @ a reasonable RAM size
+               mov     r9, r0, lsr #18
+               mov     r9, r9, lsl #18         @ start of RAM
+               add     r10, r9, #0x10000000    @ a reasonable RAM size
                mov     r1, #0x12
                orr     r1, r1, #3 << 10
                add     r2, r3, #16384
-1:             cmp     r1, r8                  @ if virt > start of RAM
+1:             cmp     r1, r9                  @ if virt > start of RAM
                orrhs   r1, r1, #0x0c           @ set cacheable, bufferable
-               cmp     r1, r                 @ if virt > end of RAM
+               cmp     r1, r10                 @ if virt > end of RAM
                bichs   r1, r1, #0x0c           @ clear cacheable, bufferable
                str     r1, [r0], #4            @ 1:1 mapping
                add     r1, r1, #1048576
@@ -464,26 +405,28 @@ __common_cache_on:
  * r5     = decompressed kernel start
  * r6     = processor ID
  * r7     = architecture ID
- * r8-r14 = unused
+ * r8     = atags pointer
+ * r9-r14 = corrupted
  */
                .align  5
-reloc_start:   add     r8, r5, r0
+reloc_start:   add     r9, r5, r0
                debug_reloc_start
                mov     r1, r4
 1:
                .rept   4
-               ldmia   r5!, {r0, r2, r3, r9 - r13}     @ relocate kernel
-               stmia   r1!, {r0, r2, r3, r9 - r13}
+               ldmia   r5!, {r0, r2, r3, r10 - r14}    @ relocate kernel
+               stmia   r1!, {r0, r2, r3, r10 - r14}
                .endr
 
-               cmp     r5, r8
+               cmp     r5, r9
                blo     1b
                debug_reloc_end
 
 call_kernel:   bl      cache_clean_flush
                bl      cache_off
-               mov     r0, #0
+               mov     r0, #0                  @ must be zero
                mov     r1, r7                  @ restore architecture number
+               mov     r2, r8                  @ restore atags pointer
                mov     pc, r4                  @ call kernel
 
 /*
@@ -726,7 +669,7 @@ puts:               loadsp  r3
 1:             ldrb    r2, [r0], #1
                teq     r2, #0
                moveq   pc, lr
-2:             writeb  r2
+2:             writeb  r2, r3
                mov     r1, #0x00020000
 3:             subs    r1, r1, #1
                bne     3b