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}