There are some free slots, so we can just save it directly after the
FPU registers.

This is needed to fix the lib/libc/setjmp-fpu regress on arm64.  But
it isn't enough.  Because the hardware doesn't implement the
floating-point exception trap control bits, checking those bits can't
work on arm64 (and armv7).  So the 2nd part of this diff sprinkles
some #if/#endif to skip the parts that check those bits.

ok?


Index: lib/libc/arch/aarch64/gen/_setjmp.S
===================================================================
RCS file: /cvs/src/lib/libc/arch/aarch64/gen/_setjmp.S,v
retrieving revision 1.3
diff -u -p -r1.3 _setjmp.S
--- lib/libc/arch/aarch64/gen/_setjmp.S 1 Oct 2018 22:49:50 -0000       1.3
+++ lib/libc/arch/aarch64/gen/_setjmp.S 18 Oct 2020 19:22:40 -0000
@@ -53,7 +53,9 @@ ENTRY(_setjmp)
        stp     d8, d9, [x0], #16
        stp     d10, d11, [x0], #16
        stp     d12, d13, [x0], #16
-       stp     d14, d15, [x0]
+       stp     d14, d15, [x0], #16
+       mrs     x1, fpcr
+       str     x1, [x0]
 #endif
 
        /* Return value */
@@ -92,7 +94,9 @@ ENTRY(_longjmp)
        ldp     d8, d9, [x0], #16
        ldp     d10, d11, [x0], #16
        ldp     d12, d13, [x0], #16
-       ldp     d14, d15, [x0]
+       ldp     d14, d15, [x0], #16
+       ldr     x2, [x0]
+       msr     fpcr, x2
 #endif
 
        /* Load the return value */
Index: lib/libc/arch/aarch64/gen/setjmp.S
===================================================================
RCS file: /cvs/src/lib/libc/arch/aarch64/gen/setjmp.S,v
retrieving revision 1.3
diff -u -p -r1.3 setjmp.S
--- lib/libc/arch/aarch64/gen/setjmp.S  1 Oct 2018 22:49:50 -0000       1.3
+++ lib/libc/arch/aarch64/gen/setjmp.S  18 Oct 2020 19:22:40 -0000
@@ -61,7 +61,9 @@ ENTRY(setjmp)
        stp     d8, d9, [x0], #16
        stp     d10, d11, [x0], #16
        stp     d12, d13, [x0], #16
-       stp     d14, d15, [x0]
+       stp     d14, d15, [x0], #16
+       mrs     x1, fpcr
+       str     x1, [x0]
 
        /* Return value */
        mov     x0, #0
@@ -108,7 +110,9 @@ ENTRY(longjmp)
        ldp     d8, d9, [x0], #16
        ldp     d10, d11, [x0], #16
        ldp     d12, d13, [x0], #16
-       ldp     d14, d15, [x0]
+       ldp     d14, d15, [x0], #16
+       ldr     x1, [x0]
+       msr     fpcr, x1
 
        /* Load the return value */
        cmp     w3, #0





Index: regress/lib/libc/setjmp-fpu/fpu.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/setjmp-fpu/fpu.c,v
retrieving revision 1.1
diff -u -p -r1.1 fpu.c
--- regress/lib/libc/setjmp-fpu/fpu.c   16 Jan 2020 13:04:02 -0000      1.1
+++ regress/lib/libc/setjmp-fpu/fpu.c   18 Oct 2020 19:34:28 -0000
@@ -34,10 +34,12 @@ main(int argc, char *argv[])
        rv = fegetround();
        if (rv != FE_UPWARD)
                errx(1, "fegetround returned %d, not FE_UPWARD", rv);
+#if !defined(__arm__) && !defined(__aarch64__)
        rv = fegetexcept();
        if (rv != FE_DIVBYZERO)
                errx(1, "fegetexcept returned %d, not FE_DIVBYZERO",
                    rv);
+#endif
 
        /* Verify that the FPU exception flags weren't clobbered. */
        flag = 0;
Index: regress/lib/libc/setjmp-fpu/setjmp-fpu.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c,v
retrieving revision 1.5
diff -u -p -r1.5 setjmp-fpu.c
--- regress/lib/libc/setjmp-fpu/setjmp-fpu.c    16 Jan 2020 13:04:02 -0000      
1.5
+++ regress/lib/libc/setjmp-fpu/setjmp-fpu.c    18 Oct 2020 19:34:28 -0000
@@ -42,10 +42,12 @@ TEST_SETJMP(void)
                rv = fegetround();
                if (rv != FE_UPWARD)
                        errx(1, "fegetround returned %d, not FE_UPWARD", rv);
+#if !defined(__arm__) && !defined(__aarch64__)
                rv = fegetexcept();
                if (rv != FE_DIVBYZERO)
                        errx(1, "fegetexcept returned %d, not FE_DIVBYZERO",
                            rv);
+#endif
 
                /* Verify that the FPU exception flags weren't clobbered. */
                flag = 0;

Reply via email to