[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).
Cheers,
Curt
--
========================================================================
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