diff options
author | 2020-10-21 17:22:59 +0000 | |
---|---|---|
committer | 2020-10-21 17:22:59 +0000 | |
commit | e48de7d1d806622671b6228964df45ff72f58824 (patch) | |
tree | 87f56574f8c53bba807add39f297b6697ef6073f | |
parent | Stop documenting some functions as macros. (diff) | |
download | wireguard-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.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/amd64/gen/setjmp.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/amd64/gen/sigsetjmp.S | 6 |
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 |