Merge first four commits of 'zImage_fixes' of git://git.linaro.org/people/nico/linux...
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 7 May 2011 07:34:36 +0000 (08:34 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 7 May 2011 07:34:40 +0000 (08:34 +0100)
1  2 
arch/arm/boot/compressed/head.S

  
  #if defined(CONFIG_DEBUG_ICEDCC)
  
 -#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K)
 +#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
                .macro  loadsp, rb, tmp
                .endm
                .macro  writeb, ch, rb
                mcr     p14, 0, \ch, c0, c5, 0
                .endm
 -#elif defined(CONFIG_CPU_V7)
 -              .macro  loadsp, rb, tmp
 -              .endm
 -              .macro  writeb, ch, rb
 -wait:         mrc     p14, 0, pc, c0, c1, 0
 -              bcs     wait
 -              mcr     p14, 0, \ch, c0, c5, 0
 -              .endm
  #elif defined(CONFIG_CPU_XSCALE)
                .macro  loadsp, rb, tmp
                .endm
@@@ -179,15 -187,14 +179,14 @@@ not_angel
                bl      cache_on
  
  restart:      adr     r0, LC0
-               ldmia   r0, {r1, r2, r3, r5, r6, r9, r11, r12}
-               ldr     sp, [r0, #32]
+               ldmia   r0, {r1, r2, r3, r6, r9, r11, r12}
+               ldr     sp, [r0, #28]
  
                /*
                 * We might be running at a different address.  We need
                 * to fix up various pointers.
                 */
                sub     r0, r0, r1              @ calculate the delta offset
-               add     r5, r5, r0              @ _start
                add     r6, r6, r0              @ _edata
  
  #ifndef CONFIG_ZBOOT_ROM
  /*
   * Check to see if we will overwrite ourselves.
   *   r4  = final kernel address
-  *   r5  = start of this image
   *   r9  = size of decompressed image
   *   r10 = end of this image, including  bss/stack/malloc space if non XIP
   * We basically want:
-  *   r4 >= r10 -> OK
-  *   r4 + image length <= r5 -> OK
+  *   r4 - 16k page directory >= r10 -> OK
+  *   r4 + image length <= current position (pc) -> OK
   */
+               add     r10, r10, #16384
                cmp     r4, r10
                bhs     wont_overwrite
                add     r10, r4, r9
-               cmp     r10, r5
+    ARM(               cmp     r10, pc         )
+  THUMB(               mov     lr, pc          )
+  THUMB(               cmp     r10, lr         )
                bls     wont_overwrite
  
  /*
   * Relocate ourselves past the end of the decompressed kernel.
-  *   r5  = start of this image
   *   r6  = _edata
   *   r10 = end of the decompressed kernel
   * Because we always copy ahead, we need to do it from the end and go
   * backward in case the source and destination overlap.
   */
-               /* Round up to next 256-byte boundary. */
-               add     r10, r10, #256
+               /*
+                * Bump to the next 256-byte boundary with the size of
+                * the relocation code added. This avoids overwriting
+                * ourself when the offset is small.
+                */
+               add     r10, r10, #((reloc_code_end - restart + 256) & ~255)
                bic     r10, r10, #255
  
+               /* Get start of code we want to copy and align it down. */
+               adr     r5, restart
+               bic     r5, r5, #31
                sub     r9, r6, r5              @ size to copy
                add     r9, r9, #31             @ rounded up to a multiple
                bic     r9, r9, #31             @ ... of 32 bytes
                /* Preserve offset to relocated code. */
                sub     r6, r9, r6
  
+ #ifndef CONFIG_ZBOOT_ROM
+               /* cache_clean_flush may use the stack, so relocate it */
+               add     sp, sp, r6
+ #endif
                bl      cache_clean_flush
  
                adr     r0, BSYM(restart)
@@@ -333,7 -354,6 +346,6 @@@ not_relocated:     mov     r0, #
  LC0:          .word   LC0                     @ r1
                .word   __bss_start             @ r2
                .word   _end                    @ r3
-               .word   _start                  @ r5
                .word   _edata                  @ r6
                .word   _image_size             @ r9
                .word   _got_start              @ r11
@@@ -1062,6 -1082,7 +1074,7 @@@ memdump:        mov     r12, r
  #endif
  
                .ltorg
+ reloc_code_end:
  
                .align
                .section ".stack", "aw", %nobits