A potential fix for arm64's: sh`forkshell child-process path after fork sometimes has a bad stack pointer value

Mark Millard markmi at dsl-only.net
Tue Feb 14 17:18:01 UTC 2017


On 2017-Feb-14, at 8:56 AM, Andrew Turner <andrew at fubar.geek.nz> wrote:

On Tue, 14 Feb 2017 08:35:54 -0800
> Mark Millard <markmi at dsl-only.net> wrote:
> 
>> The following change has let my test run for 8.5 hours so far without
>> a fork-failure in sh`forkshell :
>> 
>> # svnlite diff /usr/src/sys/arm64/arm64/swtch.S
>> Index: /usr/src/sys/arm64/arm64/swtch.S
>> ===================================================================
>> --- /usr/src/sys/arm64/arm64/swtch.S    (revision 312982)
>> +++ /usr/src/sys/arm64/arm64/swtch.S    (working copy)
>> @@ -241,6 +241,12 @@
>>        mov     fp, #0  /* Stack traceback stops here. */
>>        bl      _C_LABEL(fork_exit)
>> 
>> +       /*
>> +        * Disable interrupts to avoid
>> +        * overwriting sp_el0 and spsr_el1 by an IRQ exception.
>> +        */
>> +       msr     daifset, #2
>> +
>>        /* Restore sp and lr */
>>        ldp     x0, x1, [sp]
>>        msr     sp_el0, x0
>> @@ -263,12 +269,6 @@
>>        ldp     x28, x29, [sp, #TF_X + 28 * 8]
>>        /* Skip x30 as it was restored above as lr */
>> 
>> -       /*
>> -        * Disable interrupts to avoid
>> -        * overwriting spsr_el1 by an IRQ exception.
>> -        */
>> -       msr     daifset, #2
>> -
>>        /* Restore elr and spsr */
>>        ldp     x0, x1, [sp, #16]
>>        msr     elr_el1, x0
>> 
>> I'm going to switch to attempting a self-hosted buildworld
>> buildkernel again.
> 
> Can you try the patch in https://reviews.freebsd.org/D9593. It moves
> loading of sp_el0 until after interrupts have been disabled.
> 
> Andrew

Sure. I'll stop the self-hosted buildworld buildkernel and
switch over to your source.

One minor point:

/* Skip x30 as it was restored above as lr */

now should say something like:

/* Skip x30 as it is restored below as lr */

===
Mark Millard
markmi at dsl-only.net



More information about the freebsd-arm mailing list