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 16:35:58 UTC 2017


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.

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




More information about the freebsd-arm mailing list