Hi Benoît,

(I had indeed missed remarks in your reply; apologies for this)

On Tue, 14 May 2013 18:01:50 +0200 (CEST), Benoît Thébaudeau
<benoit.thebaud...@advansee.com> wrote:

> Hi Albert,

> > +/*
> > + * 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.
> > + */  
> 
> This comment is obsolete. It should either be removed or updated.

Correct.

> > +
> > +/*
> > + * void relocate_code(addr_moni)
> > + *
> > + * This function relocates the monitor code.
> > + */
> > +ENTRY(relocate_code)
> > +   mov     r6, r0  /* save addr of destination */
> > +
> > +   ldr     r0, =_start  
> 
> If you are avoiding the "ldr =" construct below, why do you use it
> here? You could "ldr r0, _TEXT_BASE".

_start is defined in a compilation unit, not in the linker file.
References to _start such as the one above are therefore correct before
as well as after relocation.

> > +   subs    r9, r6, r0              /* r9 <- relocation offset */
> > +   beq     relocate_done           /* skip relocation */
> > +   mov     r1, r6                  /* r1 <- scratch for copy loop */
> > +   ldr     r3, _image_copy_end_ofs
> > +   add     r2, r0, r3              /* r2 <- source end address         */
> 
> Adding _start to a relocate_code-relative _image_copy_end_ofs?!

You're correct. For some reason I did not complete the rewrite here. :(

I'd made the offsets relative to relocate_code in order to avoid
the linker issues with subtracting symbols not defined in the current
compilation unit.

Then I should add =relocate_code to r3, not =_start, and also -- as r9
is not the right offset here -- compute r7 as the delta between the
link-time =_start and the run-time relocate_code (r7 becomes useless
once R10, r2 and r3 are fixed).

I'd run-tested tested each commit but apparently this bug did not
cause any immediately visible issue. This time I'll step-test it.

> > +   /*
> > +    * fix .rel.dyn relocations
> > +    */
> > +   ldr     r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
> > +   add     r10, r10, r9            /* r10 <- sym table in FLASH */
> > +   ldr     r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
> > +   add     r2, r2, r9              /* r2 <- rel dyn start in FLASH */
> > +   ldr     r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
> > +   add     r3, r3, r9              /* r3 <- rel dyn end in FLASH */
> 
> This is mixing relocate_code-relative offsets with the relocation offset!

Correct, that's where r7 kicks in to replace r9.

Again, apologies for missing this.

> Best regards,
> Benoît

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

Reply via email to