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

Ard Biesheuvel ard.biesheuvel at linaro.org
Fri Aug 11 13:07:37 PDT 2017


On 11 August 2017 at 21:06, Nicolas Pitre <nicolas.pitre at linaro.org> wrote:
> On Fri, 11 Aug 2017, Ard Biesheuvel wrote:
>
>> On 11 August 2017 at 20:58, Nicolas Pitre <nicolas.pitre at linaro.org> wrote:
>> > 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.
>> >
>>
>> I still don't see it :-)
>>
>> __do_fixup_smp_on_up() mentions r3 in the comment block, but it does
>> not actually refer to it in the code, does it?
>
> __do_fixup_smp_on_up:
>         cmp     r4, r5
>         reths   lr
>         ldmia   r4!, {r0, r6}
>  ARM(   str     r6, [r0, r3]    )       <<============
>  THUMB( add     r0, r0, r3      )       <<============
> [...]
>

Aahhh

Looking at the wrong version of the file.

Thanks for spotting that.



More information about the linux-arm-kernel mailing list