[U-Boot-Users] [PATCH] ARM720t -- Relocating Exception Vectors

Curt Brune curt at cucy.com
Wed Jul 7 19:33:37 CEST 2004

Attached is a new patch for relocating the exception vectors, which
addresses your concerns:

On Wed, Jul 07, 2004 at 09:21:08AM +0200, Friedrich, Lars wrote:
> No offense, but this is a bad hack. The copy code belongs from
> a 'structured' point of view to where the relocation is done and not
> just attached to the end of the source code.

Agreed -- moved the vector relocation code to where the main
relocation resides.

> And from an 'optimized code' point of view it belongs there, too, as
> _TEXT_BASE is already loaded there into an register for example,
> no need to do this multiple times. I don't quite see the necessarity
> for a loop, too. There are 7 exception vectors, never more, never less.
> The copy procedure can be handled by a single ldmia/stmia pair.

Almost -- I also need to copy the 7 words after the vectors that
contain the absolute addresses of the exception handlers.  In total
that takes two ldmia/stmia pairs.

Thanks for the criticism -- the code is a bit tighter now (down to 7
instructions from 14, no branches and no loops).



 Curt Brune           | Phone   1.650.380.2528 |     Managing Principal
 curt at cucy.com        | WWW       www.cucy.com |           Cucy Systems
             Cucy Systems -- Software. Integration. Training.
-------------- next part --------------
diff -purN new/u-boot/cpu/arm720t/start.S u-boot/cpu/arm720t/start.S
--- new/u-boot/cpu/arm720t/start.S	Thu Jul  1 09:30:47 2004
+++ u-boot/cpu/arm720t/start.S	Wed Jul  7 10:17:33 2004
@@ -129,6 +129,14 @@ relocate:				/* relocate U-Boot to RAM	 
 	cmp     r0, r1                  /* don't reloc during debug         */
 	beq     stack_setup
+	ldr     r2, =0x0		/* Relocate the exception vectors   */
+	cmp     r1, r2                  /* and associated data to address   */
+	ldmneia	r0!, {r3-r10}           /* 0x0. Do nothing if TEXT_BASE is  */
+	stmneia	r2!, {r3-r10}		/* 0x0. Copy the first 15 words.    */
+	ldmneia	r0, {r3-r9}             
+	stmneia	r2, {r3-r9}		
+	adrne	r0, _start		/* restore r0                       */
 	ldr	r2, _armboot_start
 	ldr	r3, _bss_start
 	sub	r2, r3, r2		/* r2 <- size of armboot            */

More information about the U-Boot mailing list