[U-Boot] relocation problem on powerpc

Joakim Tjernlund joakim.tjernlund at transmode.se
Mon Sep 8 11:04:37 CEST 2014


> 
> There are some disadvantages to living in a weird timezone, mostly
> that you end up having conversations with yourself.
> 
> On Mon, Sep 8, 2014 at 4:32 PM, Chris Packham <judge.packham at gmail.com> 
wrote:
> > Hi All,
> >
> > I have come across what I think is a relocation problem for powerpc.
> >
> > I've added the following to ArpTimeoutCheck
> >
> > +       printf("NetArpWaitTimerStart = %ld\n", NetArpWaitTimerStart);
> > +       printf("&NetArpWaitTimerStart = %p\n", &NetArpWaitTimerStart);
> > +       printf("NetArpWaitTry = %d\n", NetArpWaitTry);
> > +       printf("&NetArpWaitTry = %p\n", &NetArpWaitTry);
> > +       printf("NetArpWaitTxPacketSize = %d\n", 
NetArpWaitTxPacketSize);
> > +       printf("&NetArpWaitTxPacketSize = %p\n", 
&NetArpWaitTxPacketSize);
> >
> > Which yields the following output
> >
> >   NetArpWaitTimerStart = 0
> >   &NetArpWaitTimerStart = f00000d0
> >   NetArpWaitTry = 1
> >   &NetArpWaitTry = 7ffb0058
> >   NetArpWaitTxPacketSize = 42
> >   &NetArpWaitTxPacketSize = 7ffb0078
> >
> > That looks to me like NetArpWaitTimerStart hasn't been relocated for
> > some reason. Looking at my u-boot.map NetArpWaitTimerStart is the last
> > item in the .sbss section
> >
> > Here's the relevant snippets for the variables I'm displaying
> >
> >  0x00000000f0000058                NetArpWaitTry
> >  0x00000000f0000078                NetArpWaitTxPacketSize
> >  0x00000000f00000d0                NetArpWaitTimerStart
> >
> > The actual problem for me is that ARPs timeout and various network
> > things fail. Has anyone got any clues as to why this one particular
> > variable isn't getting relocated.
> >
> > Thanks,
> > Chris
> >
> > More info:
> >   I'm building P2041RDB_config
> >
> >   $ git describe
> >   v2014.10-rc2-15-g2ec8915
> >
> >   => version
> >   U-Boot 2014.10-rc2-00015-g2ec8915-dirty (Sep 08 2014 - 16:18:42)
> >   powerpc-e500-linux-gnu-gcc (Gentoo 4.6.3-r1 p1.9, pie-0.5.2) 4.6.3
> >   GNU ld (GNU Binutils) 2.21
> 
> I'm not confident enough to say it's a fix but the following seems to
> solve the relocation problem for NetArpWaitTimerStart.
> 
> diff --git a/arch/powerpc/cpu/mpc85xx/u-boot.lds
> b/arch/powerpc/cpu/mpc85xx/u-boot.lds
> index 2cf0b25..36711b0 100644
> --- a/arch/powerpc/cpu/mpc85xx/u-boot.lds
> +++ b/arch/powerpc/cpu/mpc85xx/u-boot.lds
> @@ -54,7 +54,7 @@ SECTIONS
>      _FIXUP_TABLE_ = .;
>      KEEP(*(.fixup))
>    }
> -  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;
> +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2);
>    __fixup_entries = (. - _FIXUP_TABLE_) >> 2;

This looks like the correct fix, The relevant code that uses 
__got2_entries is in start.S:

in_ram:

        /*
         * Relocation Function, r12 point to got2+0x8000
         *
         * Adjust got2 pointers, no need to check for 0, this code
         * already puts a few entries in the table.
         */
        li      r0,__got2_entries at 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)
        cmpwi   r0,0
        beq-    2f
        add     r0,r0,r11
        stw     r0,0(r3)
2:      bdnz    1b

bdnz does decrement then test for zero so __got2_entries should hold the 
number of entries to relocate.

Seems like most(all?) ppc cpu has this error.

 Jocke


More information about the U-Boot mailing list