[ARM] Allow r2 to be passed through the decompressor to the kernel
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Thu, 12 Jan 2006 17:17:57 +0000 (17:17 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 12 Jan 2006 17:17:57 +0000 (17:17 +0000)
This is part of a patch from Marc Singer to allow r2 to be
passed to the kernel.  Marc's original comments follow:

This revised R2 (atags pointer) patch incorporates comments from Nico
Pitre and Ben Dooks. It modifies the head.S files such that the R2
value set by the bootloader is conveyed to the kernel startup code.
The kernel head.S heuristically validates the pointer. It will set R2
to zero if it believes the pointer is invalid. Presently, it requires
that the ATAGS list reside in the first 16KiB of physical RAM.
Relaxing this contraint may be both desirable as well as tricky.

Signed-off-by: Marc Singer <elf@buici.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/boot/compressed/head.S

index 6abafb6f1844d9b82a3f74cbfcb3b77486f2e5b8..aaa47400eb9c19ce57a60731f81ca0b14addb1b3 100644 (file)
@@ -84,7 +84,7 @@
                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'
@@ -116,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__
                /*
@@ -144,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
@@ -249,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
 
@@ -308,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
@@ -326,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
                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
@@ -403,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
 
 /*