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;