The diff below fixes the setjmp implementation on armv7 to save and
restore the required floating-point registers.  The existing (but
disabled) code was written for the old FPA FPU.  The new VFP FPU
requires us to save a bit more stuff.  Fortunately the setjmp buffer
was already big enough so we just have to change te layout a bit and
don't have to have a full flag day.  Code that does peek or poke at
the contents of a setjmp buffer will have to be recompiled.  But such
code deserves to break.

Unfortunately this doesn't fix the /bin/sh crashes that now occur
regularly on armv7 :(.

ok?


Index: sys/arch/arm/include/setjmp.h
===================================================================
RCS file: /cvs/src/sys/arch/arm/include/setjmp.h,v
retrieving revision 1.4
diff -u -p -r1.4 setjmp.h
--- sys/arch/arm/include/setjmp.h       7 Aug 2016 02:02:57 -0000       1.4
+++ sys/arch/arm/include/setjmp.h       20 Jun 2018 16:00:13 -0000
@@ -11,26 +11,23 @@
  * Description of the setjmp buffer
  *
  * word  0     magic number    (dependant on creator)
- *       1 -  3        f4              fp register 4
- *      4 -  6 f5              fp register 5
- *      7 -  9 f6              fp register 6
- *     10 - 12 f7              fp register 7
- *     13      fpsr            fp status register
- *     14      r13             register 13 (sp) XOR cookie0
- *     15      r14             register 14 (lr) XOR cookie1
- *     16      r4              register 4
- *     17      r5              register 5
- *     18      r6              register 6
- *     19      r7              register 7
- *     20      r8              register 8
- *     21      r9              register 9
- *     22      r10             register 10 (sl)
- *     23      r11             register 11 (fp)
- *     24      unused          unused
- *     25      signal mask     (dependant on magic)
- *     26      (con't)
- *     27      (con't)
- *     28      (con't)
+ *       1     fpscr           fpscr
+ *       2 - 17        d8 - d15        vfp registers
+ *     18      r13             register 13 (sp) XOR cookie0
+ *     19      r14             register 14 (lr) XOR cookie1
+ *     20      r4              register 4
+ *     21      r5              register 5
+ *     22      r6              register 6
+ *     23      r7              register 7
+ *     24      r8              register 8
+ *     25      r9              register 9
+ *     26      r10             register 10 (sl)
+ *     27      r11             register 11 (fp)
+ *     28      unused          unused
+ *     29      signal mask     (dependant on magic)
+ *     30      (con't)
+ *     31      (con't)
+ *     32      (con't)
  *
  * The magic number number identifies the jmp_buf and
  * how the buffer was created as well as providing
@@ -56,20 +53,15 @@
 /* Valid for all jmp_buf's */
 
 #define _JB_MAGIC               0
-#define _JB_REG_F4              1
-#define _JB_REG_F5              4
-#define _JB_REG_F6              7
-#define _JB_REG_F7             10
-#define _JB_REG_FPSR           13
-#define _JB_REG_R4             16
-#define _JB_REG_R5             17
-#define _JB_REG_R6             18
-#define _JB_REG_R7             19
-#define _JB_REG_R8             20
-#define _JB_REG_R9             21
-#define _JB_REG_R10            22
-#define _JB_REG_R11            23
+#define _JB_REG_R4             20
+#define _JB_REG_R5             21
+#define _JB_REG_R6             22
+#define _JB_REG_R7             23
+#define _JB_REG_R8             24
+#define _JB_REG_R9             25
+#define _JB_REG_R10            26
+#define _JB_REG_R11            27
 
 /* Only valid with the _JB_MAGIC_SETJMP magic */
 
-#define _JB_SIGMASK            25
+#define _JB_SIGMASK            29
Index: lib/libc/arch/arm/Makefile.inc
===================================================================
RCS file: /cvs/src/lib/libc/arch/arm/Makefile.inc,v
retrieving revision 1.8
diff -u -p -r1.8 Makefile.inc
--- lib/libc/arch/arm/Makefile.inc      28 Feb 2018 11:16:54 -0000      1.8
+++ lib/libc/arch/arm/Makefile.inc      20 Jun 2018 16:00:13 -0000
@@ -5,8 +5,6 @@
 
 CERROR=        cerror.S
 
-CPPFLAGS += -DSOFTFLOAT
-
 # Override softfloat implementations of FP mode control functions
 .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/gen
 
Index: lib/libc/arch/arm/gen/_setjmp.S
===================================================================
RCS file: /cvs/src/lib/libc/arch/arm/gen/_setjmp.S,v
retrieving revision 1.5
diff -u -p -r1.5 _setjmp.S
--- lib/libc/arch/arm/gen/_setjmp.S     7 Aug 2016 02:02:57 -0000       1.5
+++ lib/libc/arch/arm/gen/_setjmp.S     20 Jun 2018 16:00:13 -0000
@@ -69,13 +69,13 @@ ENTRY(_setjmp)
        eor     r3, lr, r3                      /* r3 = lr ^ __jmpxor[1] */
 
 #ifdef SOFTFLOAT
-       add     r0, r0, #52
+       add     r0, r0, #68
 #else
+       /* Store fpcsr */
+       vmrs    r1, fpscr
+       str     r1, [r0], #4
        /* Store fp registers */
-       sfm     f4, 4, [r0], #48
-       /* Store fpsr */
-       rfs     r1
-       str     r1, [r0], #0x0004
+       vstmia  r0!, {d8-d15}
 #endif /* SOFTFLOAT */
        /* Store integer registers */
        stmia   r0, {r2-r11}
@@ -98,13 +98,13 @@ ENTRY(_longjmp)
        bne     botch
 
 #ifdef SOFTFLOAT
-       add     r0, r0, #52
+       add     r0, r0, #68
 #else
+       /* Restore fpcsr */
+       ldr     r4, [r0], #4
+       vmsr    fpscr, r4
        /* Restore fp registers */
-       lfm     f4, 4, [r0], #48
-       /* Restore fpsr */
-       ldr     r4, [r0], #0x0004
-       wfs     r4
+       vldmia  r0!, {d8-d15}
 #endif /* SOFTFLOAT */
        /* Restore integer registers */
        ldmia   r0, {r2-r11}
Index: lib/libc/arch/arm/gen/setjmp.S
===================================================================
RCS file: /cvs/src/lib/libc/arch/arm/gen/setjmp.S,v
retrieving revision 1.6
diff -u -p -r1.6 setjmp.S
--- lib/libc/arch/arm/gen/setjmp.S      7 Aug 2016 02:02:57 -0000       1.6
+++ lib/libc/arch/arm/gen/setjmp.S      20 Jun 2018 16:00:13 -0000
@@ -56,7 +56,7 @@ ENTRY(setjmp)
        SYSTRAP(sigprocmask)
 
        /* Store signal mask */
-       str     r0, [r2, #(25 * 4)]
+       str     r0, [r2, #(29 * 4)]
 
        ldr     r1, .Lsetjmp_magic
        str     r1, [r2], #4
@@ -69,14 +69,14 @@ ENTRY(setjmp)
        eor     r3, lr, r3                      /* r3 = lr ^ __jmpxor[1] */
 
 #ifdef SOFTFLOAT
-       add     r2, r2, #52
+       add     r2, r2, #68
 #else
+       /* Store fpcsr */
+       vmrs    r1, fpscr
+       str     r1, [r2], #4
        /* Store fp registers */
-       sfm     f4, 4, [r2], #48
-       /* Store fpsr */
-       rfs     r1
-       str     r1, [r2], #0x0004
-#endif /*SOFTFLOAT*/
+       vstmia  r2!, {d8-d15}
+#endif /* SOFTFLOAT */
        /* Store integer registers */
        stmia   r2, {r3-r12}
 
@@ -101,19 +101,19 @@ ENTRY(longjmp)
        /* Fetch signal mask and call sigprocmask */
        mov     r3, r0                          /* r3 = jmpbuf */
        mov     r2, r1                          /* r2 = retvalue */
-       ldr     r1, [r0, #(25 * 4)]
+       ldr     r1, [r0, #(29 * 4)]
        mov     r0, #0x00000003                 /* SIG_SETMASK */
        SYSTRAP(sigprocmask)
 
        add     r3, r3, #4
 #ifdef SOFTFLOAT
-       add     r3, r3, #52
+       add     r3, r3, #68
 #else
+       /* Restore fpcsr */
+       ldr     r4, [r3], #4
+       vmsr    fpscr, r4
        /* Restore fp registers */
-       lfm     f4, 4, [r3], #48
-       /* Restore FPSR */
-       ldr     r4, [r3], #0x0004
-       wfs     r4
+       vldmia  r3!, {d8-d15}
 #endif /* SOFTFLOAT */
        /* Restore integer registers */
        ldmia   r3, {r3-r12}

Reply via email to