summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-10-21 17:22:59 +0000
committerkettenis <kettenis@openbsd.org>2020-10-21 17:22:59 +0000
commite48de7d1d806622671b6228964df45ff72f58824 (patch)
tree87f56574f8c53bba807add39f297b6697ef6073f
parentStop documenting some functions as macros. (diff)
downloadwireguard-openbsd-e48de7d1d806622671b6228964df45ff72f58824.tar.xz
wireguard-openbsd-e48de7d1d806622671b6228964df45ff72f58824.zip
Save and restore the MXCSR register and the FPU control word such that
floating-point control modes are properly restored by longjmp(3). ok guenther@
-rw-r--r--lib/libc/arch/amd64/gen/_setjmp.S6
-rw-r--r--lib/libc/arch/amd64/gen/setjmp.S6
-rw-r--r--lib/libc/arch/amd64/gen/sigsetjmp.S6
3 files changed, 15 insertions, 3 deletions
diff --git a/lib/libc/arch/amd64/gen/_setjmp.S b/lib/libc/arch/amd64/gen/_setjmp.S
index 1aef964c102..d41ae94bb21 100644
--- a/lib/libc/arch/amd64/gen/_setjmp.S
+++ b/lib/libc/arch/amd64/gen/_setjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: _setjmp.S,v 1.4 2019/03/30 12:37:59 mortimer Exp $ */
+/* $OpenBSD: _setjmp.S,v 1.5 2020/10/21 17:22:59 kettenis Exp $ */
/* $NetBSD: _setjmp.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */
/*
@@ -71,6 +71,8 @@ ENTRY(_setjmp)
xorq (2*8)(%rcx),%rax
movq %rax,(_JB_PC * 8)(%rdi)
xorq %rcx,%rcx
+ stmxcsr (_JB_MXCSR * 8)(%rdi)
+ fnstcw (_JB_MXCSR * 8 + 4)(%rdi)
xorq %rax,%rax
RETGUARD_CHECK(_setjmp, r10)
@@ -86,6 +88,8 @@ ENTRY(_longjmp)
xorq (2*8)(%rcx),%r11
movq %r11,0(%rsp)
RETGUARD_SETUP(_longjmp, r10)
+ ldmxcsr (_JB_MXCSR * 8)(%rdi)
+ fldcw (_JB_MXCSR * 8 + 4)(%rdi)
movq (_JB_RBX * 8)(%rdi),%rbx
movq (_JB_RBP * 8)(%rdi),%r11
xorq (0*8)(%rcx),%r11
diff --git a/lib/libc/arch/amd64/gen/setjmp.S b/lib/libc/arch/amd64/gen/setjmp.S
index ecb6a353ebf..dff42508a9e 100644
--- a/lib/libc/arch/amd64/gen/setjmp.S
+++ b/lib/libc/arch/amd64/gen/setjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: setjmp.S,v 1.8 2019/03/30 12:37:59 mortimer Exp $ */
+/* $OpenBSD: setjmp.S,v 1.9 2020/10/21 17:22:59 kettenis Exp $ */
/* $NetBSD: __setjmp14.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */
/*
@@ -85,6 +85,8 @@ ENTRY(setjmp)
xorq (2*8)(%rcx),%rax
movq %rax,(_JB_PC * 8)(%rdi)
xorq %rcx,%rcx
+ stmxcsr (_JB_MXCSR * 8)(%rdi)
+ fnstcw (_JB_MXCSR * 8 + 4)(%rdi)
xorq %rax,%rax
RETGUARD_CHECK(setjmp, r10)
@@ -109,6 +111,8 @@ ENTRY(longjmp)
xorq (2*8)(%rcx),%r11
movq %r11,0(%rsp)
RETGUARD_SETUP(longjmp, r10)
+ ldmxcsr (_JB_MXCSR * 8)(%r12)
+ fldcw (_JB_MXCSR * 8 + 4)(%r12)
movq (_JB_RBX * 8)(%r12),%rbx
movq (_JB_RBP * 8)(%r12),%r11
xorq (0*8)(%rcx),%r11
diff --git a/lib/libc/arch/amd64/gen/sigsetjmp.S b/lib/libc/arch/amd64/gen/sigsetjmp.S
index 22414c1fc87..55a10c03d62 100644
--- a/lib/libc/arch/amd64/gen/sigsetjmp.S
+++ b/lib/libc/arch/amd64/gen/sigsetjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: sigsetjmp.S,v 1.8 2019/03/30 12:37:59 mortimer Exp $ */
+/* $OpenBSD: sigsetjmp.S,v 1.9 2020/10/21 17:22:59 kettenis Exp $ */
/* $NetBSD: __setjmp14.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */
/*
@@ -83,6 +83,8 @@ ENTRY(sigsetjmp)
xorq (2*8)(%rcx),%rax
movq %rax,(_JB_PC * 8)(%rdi)
xorq %rcx,%rcx
+ stmxcsr (_JB_MXCSR * 8)(%rdi)
+ fnstcw (_JB_MXCSR * 8 + 4)(%rdi)
xorq %rax,%rax
RETGUARD_CHECK(sigsetjmp, r10)
@@ -109,6 +111,8 @@ ENTRY(siglongjmp)
xorq (2*8)(%rcx),%r11
movq %r11,0(%rsp)
RETGUARD_SETUP(siglongjmp, r10)
+ ldmxcsr (_JB_MXCSR * 8)(%r12)
+ fldcw (_JB_MXCSR * 8 + 4)(%r12)
movq (_JB_RBX * 8)(%r12),%rbx
movq (_JB_RBP * 8)(%r12),%r11
xorq (0*8)(%rcx),%r11