[PATCH 05/15] ARM: head: use PC-relative insn sequence for __smp_alt

Nicolas Pitre nicolas.pitre at linaro.org
Fri Aug 11 12:58:31 PDT 2017


On Fri, 11 Aug 2017, Ard Biesheuvel wrote:

> On 11 August 2017 at 16:13, Tony Lindgren <tony at atomide.com> wrote:
> > * Ard Biesheuvel <ard.biesheuvel at linaro.org> [170805 13:54]:
> >> Replace the open coded PC relative offset calculations with a pair
> >> of adr_l invocations.
> >>
> >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
> >> ---
> >>  arch/arm/kernel/head.S | 12 ++----------
> >>  1 file changed, 2 insertions(+), 10 deletions(-)
> >>
> >> diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
> >> index 6e9df3663a57..aed341e0f530 100644
> >> --- a/arch/arm/kernel/head.S
> >> +++ b/arch/arm/kernel/head.S
> >> @@ -523,19 +523,11 @@ ARM_BE8(rev     r0, r0)                 @ byteswap if big endian
> >>       retne   lr
> >>
> >>  __fixup_smp_on_up:
> >> -     adr     r0, 1f
> >> -     ldmia   r0, {r3 - r5}
> >> -     sub     r3, r0, r3
> >> -     add     r4, r4, r3
> >> -     add     r5, r5, r3
> >> +     adr_l   r4, __smpalt_begin
> >> +     adr_l   r5, __smpalt_end
> >>       b       __do_fixup_smp_on_up
> >>  ENDPROC(__fixup_smp)
> >>
> >> -     .align
> >> -1:   .word   .
> >> -     .word   __smpalt_begin
> >> -     .word   __smpalt_end
> >> -
> >>       .pushsection .data
> >>       .globl  smp_on_up
> >>  smp_on_up:
> >
> > Ard, it's this one that cause boot to fail on omap3.
> > The rest of your set works for me with just this one
> > left out.
> >
> 
> I'm completely puzzled.

Found it.

You replaced:

-       adr     r0, 1f
-       ldmia   r0, {r3 - r5}
-       sub     r3, r0, r3
-       add     r4, r4, r3
-       add     r5, r5, r3
+       adr_l   r4, __smpalt_begin
+       adr_l   r5, __smpalt_end
        b       __do_fixup_smp_on_up

Notice that r3 is now uninitialized.

Now have a look at the code for __do_fixup_smp_on_up.


Nicolas



More information about the linux-arm-kernel mailing list