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

Ard Biesheuvel ard.biesheuvel at linaro.org
Mon Aug 14 09:20:55 PDT 2017


On 14 August 2017 at 17:19, Tony Lindgren <tony at atomide.com> wrote:
> * Ard Biesheuvel <ard.biesheuvel at linaro.org> [170811 12:37]:
>> 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. The change is so simple that it is difficult
>> to reduce it in parts, but if you still have the time to spare, mind
>> trying the diff below?
>>
>>
>> diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
>> index 6e9df3663a57..c0361e608210 100644
>> --- a/arch/arm/kernel/head.S
>> +++ b/arch/arm/kernel/head.S
>> @@ -524,17 +524,15 @@ ARM_BE8(rev       r0, r0)                 @
>> byteswap if big endian
>>
>>  __fixup_smp_on_up:
>>         adr     r0, 1f
>> -       ldmia   r0, {r3 - r5}
>> -       sub     r3, r0, r3
>> -       add     r4, r4, r3
>> -       add     r5, r5, r3
>> +       ldmia   r0, {r4 - r5}
>> +       add     r4, r4, r0
>> +       add     r5, r5, r0
>>         b       __do_fixup_smp_on_up
>>  ENDPROC(__fixup_smp)
>>
>>         .align
>> -1:     .word   .
>> -       .word   __smpalt_begin
>> -       .word   __smpalt_end
>> +1:     .word   __smpalt_begin - 1b
>> +       .word   __smpalt_end - 1b
>>
>>         .pushsection .data
>>         .globl  smp_on_up
>>
>> The main point of these changes is to eliminate absolute references,
>> not to use the new macros, so if this does work, I will go with this
>> instead.
>
> For reference, I manually did this changes as it did not apply
> after reverting your earlier version of this patch. No luck with
> this change, so I'll test again when you you have updated patches
> available.
>

Thanks Tony,

But Nico already found the issue: I was looking at the code with
another patch on top, which removed the reference to r3 in the
followup code.

In the KASLR series I just posted, I reordered that patch with this
one, so everything should be good.



More information about the linux-arm-kernel mailing list