[U-Boot] [PATCH RFC] arm920t: implement elf relocation

2010-10-31 Thread Andreas Bießmann
Signed-off-by: Andreas Bießmann andreas.de...@googlemail.com
---
This changes give segfault in at least codesourcery 2010q1-202 arm lite 
toolchain. To test this segfault use:
 # make at91rm9200ek_config
 # make

 arch/arm/cpu/arm920t/start.S|  122 ---
 arch/arm/cpu/arm920t/u-boot.lds |   26 +
 2 files changed, 78 insertions(+), 70 deletions(-)

diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S
index d4edde7..adaf193 100644
--- a/arch/arm/cpu/arm920t/start.S
+++ b/arch/arm/cpu/arm920t/start.S
@@ -77,14 +77,17 @@ _TEXT_BASE:
 
 /*
  * These are defined in the board-specific linker script.
+ * Subtracting _start from them lets the linker put their
+ * relative position in the executable instead of leaving
+ * them null.
  */
-.globl _bss_start
-_bss_start:
-   .word __bss_start
+.globl _bss_start_ofs
+_bss_start_ofs:
+   .word __bss_start - _start
 
-.globl _bss_end
-_bss_end:
-   .word _end
+.globl _bss_end_ofs
+_bss_end_ofs:
+   .word _end - _start
 
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
@@ -103,30 +106,6 @@ FIQ_STACK_START:
 IRQ_STACK_START_IN:
.word   0x0badc0de
 
-.globl _datarel_start
-_datarel_start:
-   .word __datarel_start
-
-.globl _datarelrolocal_start
-_datarelrolocal_start:
-   .word __datarelrolocal_start
-
-.globl _datarellocal_start
-_datarellocal_start:
-   .word __datarellocal_start
-
-.globl _datarelro_start
-_datarelro_start:
-   .word __datarelro_start
-
-.globl _got_start
-_got_start:
-   .word __got_start
-
-.globl _got_end
-_got_end:
-   .word __got_end
-
 /*
  * the actual start code
  */
@@ -230,9 +209,8 @@ stack_setup:
 
adr r0, _start
ldr r2, _TEXT_BASE
-   ldr r3, _bss_start
-   sub r2, r3, r2  /* r2 - size of armboot*/
-   add r2, r0, r2  /* r2 - source end address */
+   ldr r3, _bss_start_ofs
+   add r2, r0, r3  /* r2 - source end address */
cmp r0, r6
beq clear_bss
 
@@ -243,35 +221,53 @@ copy_loop:
blo copy_loop
 
 #ifndef CONFIG_PRELOADER
-   /* fix got entries */
-   ldr r1, _TEXT_BASE  /* Text base */
-   mov r0, r7  /* reloc addr */
-   ldr r2, _got_start  /* addr in Flash */
-   ldr r3, _got_end/* addr in Flash */
-   sub r3, r3, r1
-   add r3, r3, r0
-   sub r2, r2, r1
-   add r2, r2, r0
-
+   /*
+* fix .rel.dyn relocations
+*/
+   ldr r0, _TEXT_BASE  /*  r0 - Text base */
+   sub r9, r7, r0  /*  r9 - relocation offset */
+   ldr r10, _dynsym_start_ofs  /* r10 - sym table offset */
+   add r10, r10, r0/* r10 - sym table in FLASH */
+   ldr r2, _rel_dyn_start_ofs  /*  r2 - rel dyn start offset */
+   add r2, r2, r0  /*  r2 - rel dyn start in FLASH */
+   ldr r3, _rel_dyn_end_ofs/*  r3 - rel dyn end offset */
+   add r3, r3, r0  /*  r3 - rel dyn end in FLASH */
 fixloop:
-   ldr r4, [r2]
-   sub r4, r4, r1
-   add r4, r4, r0
-   str r4, [r2]
-   add r2, r2, #4
+   ldr r0, [r2]/*  r0 - location to fix up in FLASH */
+   add r0, r0, r9  /*  r0 - location to fix up in RAM */
+   ldr r1, [r2, #4]
+   and r8, r1, #0xff
+   cmp r8, #23 /* relative fixup? */
+   beq fixrel
+   cmp r8, #2  /* absolute fixup? */
+   beq fixabs
+   /* ignore unknown type of fixup */
+   b   fixnext
+fixabs:
+   /* absolute fix: set location to (offste) symbol value */
+   mov r1, r1, LSR #4  /*  r1 - symbol index in .dynsym */
+   add r1, r10, r1 /*  r1 - address of symbol in table */
+   ldr r1, [r1, #4]/*  r1 - symbol value */
+   add r1, r9  /*  r1 - relocated sym address */
+   b   fixnext
+fixrel:
+   /* relative fix: increase location by offset */
+   ldr r1, [r0]
+   add r1, r1, r9
+fixnext:
+   str r1, [r0]
+   add r2, r2, #8  /* each rel.dyn entry is 8 bytes */
cmp r2, r3
blo fixloop
 #endif
 
 clear_bss:
 #ifndef CONFIG_PRELOADER
-   ldr r0, _bss_start
-   ldr r1, _bss_end
+   ldr r0, _bss_start_ofs
+   ldr r1, _bss_end_ofs
ldr r3, _TEXT_BASE  /* Text base */
mov r4, r7  /* reloc addr */
-   sub r0, r0, r3
add r0, r0, r4
-   sub r1, r1, r3
add r1, r1, r4
mov r2, #0x /* clear*/
 
@@ -289,12 +285,14 @@ clbss_l:str   

Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation

2010-10-31 Thread Albert ARIBAUD
Thanks Andreas for this helpful contribution; I'll look up the .plt 
section and see if it may lead to the root cause of the issue. However:

Le 31/10/2010 08:25, Andreas Bießmann a écrit :
 Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com
 ---
 This changes give segfault in at least codesourcery 2010q1-202 arm lite 
 toolchain. To test this segfault use:
   # make at91rm9200ek_config
   # make

   arch/arm/cpu/arm920t/start.S|  122 
 ---
   arch/arm/cpu/arm920t/u-boot.lds |   26 +
   2 files changed, 78 insertions(+), 70 deletions(-)

 diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S
 index d4edde7..adaf193 100644
 --- a/arch/arm/cpu/arm920t/start.S
 +++ b/arch/arm/cpu/arm920t/start.S
 @@ -77,14 +77,17 @@ _TEXT_BASE:

   /*
* These are defined in the board-specific linker script.
 + * Subtracting _start from them lets the linker put their
 + * relative position in the executable instead of leaving
 + * them null.
*/
 -.globl _bss_start
 -_bss_start:
 - .word __bss_start
 +.globl _bss_start_ofs
 +_bss_start_ofs:
 + .word __bss_start - _start

This patch seems to apply to u-boot before ELF relocation was 
introduced. Can you make it against the latest master?

Amicalement,
-- 
Albert.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation

2010-10-31 Thread Andreas Bießmann
Dear Albert Aribaud,

Am 31.10.2010 um 08:28 schrieb Albert ARIBAUD:

 Thanks Andreas for this helpful contribution; I'll look up the .plt section 
 and see if it may lead to the root cause of the issue. However:
 
 Le 31/10/2010 08:25, Andreas Bießmann a écrit :
 Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com
 ---
 
 
 This patch seems to apply to u-boot before ELF relocation was introduced. Can 
 you make it against the latest master?

It should be against the latest master:

---8---
843e147 arm920t: implement elf relocation
0c0892b Merge branch 'master' of git://git.denx.de/u-boot-marvell
d75c2a3 Merge branch 'master' of git://git.denx.de/u-boot-imx
17dd883 Merge branch 'master' of git://git.denx.de/u-boot-samsung
3388db2 Merge branch 'master' of git://git.denx.de/u-boot-blackfin
1ecb758 Merge branch 'for-wd-master' of git://git.denx.de/u-boot-pxa
e03f316 Drop support for CONFIG_SKIP_RELOCATE_UBOOT
a9aa392 Drop support for CONFIG_SYS_ARM_WITHOUT_RELOC
...
---8---
The latest merges where within 35 hours, maybe you have missed them?

regards

Andreas Bießmann

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH RFC] arm920t: implement elf relocation

2010-10-31 Thread Albert ARIBAUD
Le 31/10/2010 08:39, Andreas Bießmann a écrit :
 Dear Albert Aribaud,

 Am 31.10.2010 um 08:28 schrieb Albert ARIBAUD:

 Thanks Andreas for this helpful contribution; I'll look up the .plt section 
 and see if it may lead to the root cause of the issue. However:

 Le 31/10/2010 08:25, Andreas Bießmann a écrit :
 Signed-off-by: Andreas Bießmannandreas.de...@googlemail.com
 ---


 This patch seems to apply to u-boot before ELF relocation was introduced. 
 Can you make it against the latest master?

 It should be against the latest master:

 ---8---
 843e147 arm920t: implement elf relocation
 0c0892b Merge branch 'master' of git://git.denx.de/u-boot-marvell
 d75c2a3 Merge branch 'master' of git://git.denx.de/u-boot-imx
 17dd883 Merge branch 'master' of git://git.denx.de/u-boot-samsung
 3388db2 Merge branch 'master' of git://git.denx.de/u-boot-blackfin
 1ecb758 Merge branch 'for-wd-master' of git://git.denx.de/u-boot-pxa
 e03f316 Drop support for CONFIG_SKIP_RELOCATE_UBOOT
 a9aa392 Drop support for CONFIG_SYS_ARM_WITHOUT_RELOC
 ...
 ---8---
 The latest merges where within 35 hours, maybe you have missed them?

No but I'd missed the mergeback of elf_reloc to master and thought all 
ARMs were converted to ELF relocation then. Obviously arm920t was not, 
(neither were sa1100, lh7a40x, s3c44b0, arm720t, ixp, arm_intcm, arm925t 
and arm946es).

 regards

 Andreas Bießmann

Amicalement,
-- 
Albert.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot