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