Peter Tyser <pty...@xes-inc.com> wrote on 23/09/2009 14:17:51:
>
> On Wed, 2009-09-23 at 13:51 +0200, Joakim Tjernlund wrote:
> > NULL is an absolute value and should not be relocated.
> > After this correction code like:
> >  void weak_fun(void) __attribute__((weak));
> >  printf("weak_fun:%p\n", weak_fun);
> > will still print null after relocation.
> >
> > Signed-off-by: Joakim Tjernlund <joakim.tjernl...@transmode.se>
> > ---
> >
> > I have only tested this on 83xx and on a somewhat older u-boot.
> > The change is exactly the same on all PowerPC platforms though.
>
> Hi Jocke,
> I made the same changes recently, but ran into an "issue" that prevented
> me from sending the change upstream.  Some boards/arches have the bss at
> address 0 and later relocate it, unlike every other NULL pointer.  If
> you don't fix up the bss address, the board will not function.   If you
> run readelf on an 83xx u-boot image vs a 85xx u-boot image it should be
> more clear what's going on.  I was doing my testing on the XPedite5370
> fwiw.

Ouch, the horror continues :(

>
> In any case, the change as is would break some other arches.  Seems like
> the proper workaround would be to "fix" the 85xx (and other arches) link
> script to locate the bss similar to the 83xx boards.

Yes, something should be done. Does it work for you with a "fixed" linker 
script?

>
> It might be nice to consolidate all the ppc relocate code into 1
> function while we were at it.

Played around a little and this is what I got sofar, possibly
WS damged and fixups untested:

>From 5099be8f64a72080e89c325943b771932389c665 Mon Sep 17 00:00:00 2001
From: Joakim Tjernlund <joakim.tjernl...@transmode.se>
Date: Tue, 22 Sep 2009 23:24:46 +0200
Subject: [PATCH] relocation: Use C-functions to do relocate the GOT & fixups.

---
 cpu/mpc83xx/start.S |   29 ++++++++---------------------
 lib_ppc/board.c     |   31 +++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/cpu/mpc83xx/start.S b/cpu/mpc83xx/start.S
index 26e3106..868b070 100644
--- a/cpu/mpc83xx/start.S
+++ b/cpu/mpc83xx/start.S
@@ -950,35 +950,22 @@ in_ram:
         * Adjust got2 pointers, no need to check for 0, this code
         * already puts a few entries in the table.
         */
-       li      r0,__got2_entr...@sectoff@l
        la      r3,GOT(_GOT2_TABLE_)
-       lwz     r11,GOT(_GOT2_TABLE_)
-       mtctr   r0
-       sub     r11,r3,r11
-       addi    r3,r3,-4
-1:     lwzu    r0,4(r3)
-       add     r0,r0,r11
-       stw     r0,0(r3)
-       bdnz    1b
+       li      r4,__got2_entr...@sectoff@l
+       lwz     r5,GOT(_GOT2_TABLE_)
+       sub     r5,r3,r5
+       mr      r30,r5
+       bl      __eabi_convert

 #ifndef CONFIG_NAND_SPL
        /*
         * Now adjust the fixups and the pointers to the fixups
         * in case we need to move ourselves again.
         */
-2:     li      r0,__fixup_entr...@sectoff@l
        lwz     r3,GOT(_FIXUP_TABLE_)
-       cmpwi   r0,0
-       mtctr   r0
-       addi    r3,r3,-4
-       beq     4f
-3:     lwzu    r4,4(r3)
-       lwzux   r0,r4,r11
-       add     r0,r0,r11
-       stw     r10,0(r3)
-       stw     r0,0(r4)
-       bdnz    3b
-4:
+       li      r4,__fixup_entr...@sectoff@l
+       mr      r5,r30
+       bl      __eabi_uconvert
 #endif

 clear_bss:
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index 9e944fa..0afc7c3 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -148,6 +148,37 @@ static     ulong   mem_malloc_brk   = 0;
  ************************************************************************
  */

+/* Relocate the .got2 pointers.  */
+void __eabi_convert(unsigned long *low, unsigned long len,
+                   unsigned long addend)
+{
+       unsigned long val;
+
+       for(--low; len; --len) {
+               val = *++low;
+               if (!val)
+                       continue;
+               *low = val + addend;
+       }
+}
+/* Fixup any user initialized pointers (the compiler drops pointers to */
+/* each of the relocs that it does in the .fixup section).  */
+void __eabi_uconvert(unsigned long *low, unsigned long len,
+                    unsigned long addend)
+{
+       unsigned long val, *v2p, val2;
+
+       for(--low; len; --len) {
+               val = *++low;
+               val += addend;
+               *low = val;
+               v2p = (unsigned long *)val;
+               val2 = *v2p;
+               val2 += addend;
+               *v2p = val2;
+       }
+}
+
 /*
  * The Malloc area is immediately below the monitor copy in DRAM
  */
--
1.6.4.4


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

Reply via email to