Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations

2010-10-13 Thread Albert ARIBAUD
Le 13/10/2010 07:27, Heiko Schocher a écrit :

 +#defineCONFIG_RELOC_FIXUP_WORKS

 I believe this is now common to all ARMs, hence unneeded in config files.

 Hmm.. instead we should remove in arch/arm/include/asm/config.h

24 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
25 /* Relocation to SDRAM works on all ARM boards */
26 #define CONFIG_RELOC_FIXUP_WORKS
27 #endif

 this #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) ... #endif

This is already done in my first patchset -- unless I did it wrong of 
course.

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


[U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations

2010-10-12 Thread Heiko Schocher
Signed-off-by: Wolfgang Denk w...@denx.de
Signed-off-by: Heiko Schocher h...@denx.de
---
 arch/arm/cpu/arm1136/start.S|  171 ++-
 arch/arm/cpu/arm1136/u-boot.lds |8 ++
 include/configs/qong.h  |2 +-
 3 files changed, 105 insertions(+), 76 deletions(-)

diff --git a/arch/arm/cpu/arm1136/start.S b/arch/arm/cpu/arm1136/start.S
index 494768e..a86114b 100644
--- a/arch/arm/cpu/arm1136/start.S
+++ b/arch/arm/cpu/arm1136/start.S
@@ -89,48 +89,35 @@ _end_vect:
 _TEXT_BASE:
.word   TEXT_BASE
 
-#if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-.globl _armboot_start
-_armboot_start:
-   .word _start
-#endif
-
 /*
  * 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_end
-_bss_end:
-   .word _end
-
-#if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
-.globl _datarel_start
-_datarel_start:
-   .word __datarel_start
+.globl _bss_start_ofs
+_bss_start_ofs:
+   .word __bss_start - _start
 
-.globl _datarelrolocal_start
-_datarelrolocal_start:
-   .word __datarelrolocal_start
+.globl _bss_end_ofs
+_bss_end_ofs:
+   .word _end - _start
 
-.globl _datarellocal_start
-_datarellocal_start:
-   .word __datarellocal_start
+.globl _datarel_start_ofs
+_datarel_start_ofs:
+   .word __datarel_start - _start
 
-.globl _datarelro_start
-_datarelro_start:
-   .word __datarelro_start
+.globl _datarelrolocal_start_ofs
+_datarelrolocal_start_ofs:
+   .word __datarelrolocal_start - _start
 
-.globl _got_start
-_got_start:
-   .word __got_start
+.globl _datarellocal_start_ofs
+_datarellocal_start_ofs:
+   .word __datarellocal_start - _start
 
-.globl _got_end
-_got_end:
-   .word __got_end
-#endif
+.globl _datarelro_start_ofs
+_datarelro_start_ofs:
+   .word __datarelro_start - _start
 
 #ifdef CONFIG_USE_IRQ
 /* IRQ stack memory (calculated at run-time) */
@@ -225,9 +212,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
 
@@ -239,36 +225,54 @@ copy_loop:
blo copy_loop
 
 #ifndef CONFIG_PRELOADER
-   /* fix got entries */
-   ldr r1, _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 ofs */
+   add r10, r10, r0/* r10 - sym table in FLASH */
+   ldr r2, _rel_dyn_start_ofs  /* r2 - rel dyn start ofs */
+   add r2, r2, r0  /* r2 - rel dyn start in FLASH */
+   ldr r3, _rel_dyn_end_ofs/* r3 - rel dyn end ofs */
+   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, 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 (offset) 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 addr */
+   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
-   bne fixloop
+   ble fixloop
 #endif
 #endif /* #ifndef CONFIG_SKIP_RELOCATE_UBOOT */
 
 clear_bss:
 #ifndef CONFIG_PRELOADER
-   ldr r0, _bss_start
-   ldr r1, _bss_end
+   ldr r0, _bss_start_ofs
+

Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations

2010-10-12 Thread Wolfgang Denk
Dear Albert ARIBAUD,

In message 4cb478d4.3030...@free.fr you wrote:
 Le 12/10/2010 13:31, Heiko Schocher a écrit :
  Signed-off-by: Wolfgang Denkw...@denx.de
  Signed-off-by: Heiko Schocherh...@denx.de
  ---

 I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because
 using the same tag for all elf_reloc branch related patches makes it
 easier to find them all back.

  diff --git a/arch/arm/cpu/arm1136/u-boot.lds 
  b/arch/arm/cpu/arm1136/u-boot.lds

  +   __dynsym_start = .;
  +   .dynsym : { *(.dynsym) }
  +
  __got_start = .;
  . = ALIGN(4);
  .got : { *(.got) }

 Do you need to keep .got in the linker file? I think it can be removed.

 You could also add

   /DISCARD/ : { *(.dynstr*) }
   /DISCARD/ : { *(.dynamic*) }
   /DISCARD/ : { *(.plt*) }
   /DISCARD/ : { *(.interp*) }
   /DISCARD/ : { *(.gnu*) }

 At the end of the sections statement.

Agreed.

Heiko, can you please retest / resubmit?  Thanks.

  diff --git a/include/configs/qong.h b/include/configs/qong.h

  +#defineCONFIG_RELOC_FIXUP_WORKS

 I believe this is now common to all ARMs, hence unneeded in config files.

This should then be done for all board, i. e. in a separate commit.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
The day-to-day travails of the IBM programmer are so amusing to  most
of us who are fortunate enough never to have been one - like watching
Charlie Chaplin trying to cook a shoe.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations

2010-10-12 Thread Heiko Schocher
Hello Albert,

Albert ARIBAUD wrote:
 Le 12/10/2010 13:31, Heiko Schocher a écrit :
 Signed-off-by: Wolfgang Denkw...@denx.de
 Signed-off-by: Heiko Schocherh...@denx.de
 ---
 
 I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because 
 using the same tag for all elf_reloc branch related patches makes it 
 easier to find them all back.

Ups, you are right, fix this.

 diff --git a/arch/arm/cpu/arm1136/u-boot.lds 
 b/arch/arm/cpu/arm1136/u-boot.lds
 
 +__dynsym_start = .;
 +.dynsym : { *(.dynsym) }
 +
  __got_start = .;
  . = ALIGN(4);
  .got : { *(.got) }
 
 Do you need to keep .got in the linker file? I think it can be removed.

Hmm.. think you are right, I try this, thanks.

 You could also add
 
   /DISCARD/ : { *(.dynstr*) }
   /DISCARD/ : { *(.dynamic*) }
   /DISCARD/ : { *(.plt*) }
   /DISCARD/ : { *(.interp*) }
   /DISCARD/ : { *(.gnu*) }
 
 At the end of the sections statement.

Ok.

 diff --git a/include/configs/qong.h b/include/configs/qong.h
 
 +#define CONFIG_RELOC_FIXUP_WORKS
 
 I believe this is now common to all ARMs, hence unneeded in config files.

Hmm.. instead we should remove in arch/arm/include/asm/config.h

  24 #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
  25 /* Relocation to SDRAM works on all ARM boards */
  26 #define CONFIG_RELOC_FIXUP_WORKS
  27 #endif

this #if defined(CONFIG_SYS_ARM_WITHOUT_RELOC) ... #endif

And remove for all arm board, which now define CONFIG_RELOC_FIXUP_WORKS
this in the config file. If you are OK with that, I can make such a
patch.

bye,
Heiko
-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH] [NEW_RELOC] arm1136, qong: add support for ELF relocations

2010-10-12 Thread Heiko Schocher
Hello Wolfgang,

Wolfgang Denk wrote:
 Dear Albert ARIBAUD,
 
 In message 4cb478d4.3030...@free.fr you wrote:
 Le 12/10/2010 13:31, Heiko Schocher a écrit :
 Signed-off-by: Wolfgang Denkw...@denx.de
 Signed-off-by: Heiko Schocherh...@denx.de
 ---
 I assume this is [ELF_RELOC], not [NEW_RELOC], right? I'm asking because
 using the same tag for all elf_reloc branch related patches makes it
 easier to find them all back.

 diff --git a/arch/arm/cpu/arm1136/u-boot.lds 
 b/arch/arm/cpu/arm1136/u-boot.lds
 +   __dynsym_start = .;
 +   .dynsym : { *(.dynsym) }
 +
 __got_start = .;
 . = ALIGN(4);
 .got : { *(.got) }
 Do you need to keep .got in the linker file? I think it can be removed.

 You could also add

  /DISCARD/ : { *(.dynstr*) }
  /DISCARD/ : { *(.dynamic*) }
  /DISCARD/ : { *(.plt*) }
  /DISCARD/ : { *(.interp*) }
  /DISCARD/ : { *(.gnu*) }

 At the end of the sections statement.
 
 Agreed.
 
 Heiko, can you please retest / resubmit?  Thanks.
 
 diff --git a/include/configs/qong.h b/include/configs/qong.h
 +#defineCONFIG_RELOC_FIXUP_WORKS
 I believe this is now common to all ARMs, hence unneeded in config files.
 
 This should then be done for all board, i. e. in a separate commit.

This should be done in arch/arm/include/asm/config.h

Hmm.. as I have to fix this patch for qong board, should I do a
patchseries which removes first CONFIG_RELOC_FIXUP_WORKS in config
files and then a second, which converts the qong board for elf
relocation?

bye,
Heiko
-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot