[U-Boot] [Patch 1/2] MIPS: fix a latent bug on initialize $gp

Zhi-zhou Zhang zhizhou.zh at gmail.com
Mon Nov 26 11:58:56 CET 2012


On Sun, Nov 25, 2012 at 09:30:54PM +0100, Daniel Schwierzeck wrote:
> 2012/11/24 Zhi-zhou Zhang <zhizhou.zh at gmail.com>:
> > If bal is 8 bytes aligned, the _gp will not be 8 bytes aligned.
> > then the following ld insntrustion generates a Adel exception.
> > So here make _gp be always aligned in 8 bytes.
> 
> which toolchain do you use? Actually _gp is aligned to 16 bytes in the
> linker script.
> Thus the instruction "ld gp, 0(ra)" and the address loaded into gp is
> always aligned to 8 bytes.
> This works at least with ELDK-5.2.1 and a self-built gcc-4.7.2.
Thanks for review.
I have do a simple test by modify this snip as following:
.align 3
  //nop
  nop
  bal     1f
  nop
.dword  _gp
1:
  ld      gp, 0(ra)
Qemu give me a Adel exception:
(qemu) info registers 
pc=0xffffffffbfc00688 HI=0x0000000000000000 LO=0x0000000000000000 ds
0098 0000000000000000 0
GPR00: r0 0000000000000000 at 000000001000009f v0 0000000000000000 v1
0000000000000000
GPR04: a0 0000000000000000 a1 0000000000000000 a2 0000000000000000 a3
0000000000000000
GPR08: t0 0000000000000000 t1 0000000000000000 t2 0000000000000000 t3
0000000000000000
GPR12: t4 0000000000000002 t5 0000000000000000 t6 0000000000000000 t7
0000000000000000
GPR16: s0 0000000000000000 s1 0000000000000000 s2 0000000000000000 s3
0000000000000000
GPR20: s4 0000000000000000 s5 0000000000000000 s6 0000000000000000 s7
0000000000000000
GPR24: t8 0000000000000000 t9 0000000000000000 k0 0000000000000000 k1
0000000000000000
GPR28: gp 0000000000000000 sp 0000000000000000 s8 0000000000000000 ra
ffffffffbfc00544
CP0 Status  0x10400082 Cause   0x00000410 EPC    0xffffffffbfc00550
    Config0 0x80004482 Config1 0xfea3519b LLAddr 0x0000000000000000

We can also see the arrange with objdump:
ffffffffbfc00538:       00000000        nop                                         
ffffffffbfc0053c:       04110004        bal     ffffffffbfc00550
ffffffffbfc00540:       00000000        nop                                         
ffffffffbfc00544:       00000000        nop                                         
ffffffffbfc00548:       bfc36ed0        cache   0x3,28368(s8)                       
ffffffffbfc0054c:       ffffffff        sd      ra,-1(ra)                           
ffffffffbfc00550:       dffc0000        ld      gp,0(ra)

It shows that although _gp is aligned to 8 bytes. but it's not in the
address of 0(ra).
> 
> >
> > Signed-off-by: Zhi-zhou Zhang <zhizhou.zh at gmail.com>
> > ---
> >  arch/mips/cpu/mips64/start.S |    5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/mips/cpu/mips64/start.S b/arch/mips/cpu/mips64/start.S
> > index 4112de7..8e8cc33 100644
> > --- a/arch/mips/cpu/mips64/start.S
> > +++ b/arch/mips/cpu/mips64/start.S
> > @@ -108,7 +108,10 @@ reset:
> >         mtc0    t0, CP0_CONFIG
> >  #endif
> >
> > -       /* Initialize $gp */
> > +       /* Initialize $gp, _gp must be 8 bytes algined. */
> > +       .align 3
> > +       nop
> > +       nop
> >         bal     1f
> >          nop
> >         .dword  _gp
> > --
> > 1.7.9.5
> >
> 
> -- 
> Best regards,
> Daniel


More information about the U-Boot mailing list