Skip to contentSkip to conversation

ARM720t -- Relocating Exception Vectors

PATCH New Friedrich 2 participants 3 messages Jul 7, 2004

lore
Share & tools
lore

Friedrich

#0 lore raw

PATCH 1/1 ARM720t -- Relocating Exception Vectors

Quoted 5 lines

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

This patch is for cpu/arm720t/start.S -- The patch relocates the exception vectors to RAM address 0x0.

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.
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.

Best regards,
Lars Friedrich

#1 lore raw

PATCH 1/1 ARM720t -- Relocating Exception Vectors

Quoted 5 lines · Lars
Quoted 3 lines

This patch is for cpu/arm720t/start.S -- The patch relocates the exception vectors to RAM address 0x0.

No offense, but this is a bad hack. The copy code belongs from

I see your point -- thanks for the advice. I will submit a new patch incorporating your advice.

Everyone, please ignore this patch.

Cheers,
Curt

Signature · 6 lines
========================================================================
 Curt Brune           | Phone   1.650.380.2528 |     Managing Principal
 curt at cucy.com        | WWW       www.cucy.com |           Cucy Systems
========================================================================
             Cucy Systems -- Software. Integration. Training.
========================================================================
#2 lore raw

PATCH 1/1 ARM720t -- Relocating Exception Vectors

In reply to Friedrich

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

Quoted 3 lines · Lars

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.

Quoted 5 lines

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

Signature · 25 lines
========================================================================
 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            */