about summary refs log tree commit diff stats
path: root/src/libtools/signals.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-08 18:13:42 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-08 18:13:42 +0100
commit7a623ef19c3b032a015084b029705dd55e0af751 (patch)
tree0a952f3eb1ffab5fb905e78452155402f11c6960 /src/libtools/signals.c
parentf292be40b24a449238ca1fc0e3e0f6a6cf7b46a1 (diff)
downloadbox64-7a623ef19c3b032a015084b029705dd55e0af751.tar.gz
box64-7a623ef19c3b032a015084b029705dd55e0af751.zip
Improved getcontext/setcontext ([BOX32] too)
Diffstat (limited to 'src/libtools/signals.c')
-rw-r--r--src/libtools/signals.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index a4602bc6..6bebf6d2 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -2243,8 +2243,10 @@ EXPORT int my_getcontext(x64emu_t* emu, void* ucp)
     // get segments
     u->uc_mcontext.gregs[X64_CSGSFS] = ((uint64_t)(R_CS)) | (((uint64_t)(R_GS))<<16) | (((uint64_t)(R_FS))<<32);
     // get FloatPoint status
-    u->uc_mcontext.fpregs = &u->xstate;
-    fpu_fxsave64(emu, &u->xstate);
+    u->uc_mcontext.fpregs = ucp + 408;
+    fpu_savenv(emu, (void*)u->uc_mcontext.fpregs, 1);
+    *(uint32_t*)(ucp + 432) = emu->mxcsr.x32;
+
     // get signal mask
     sigprocmask(SIG_SETMASK, NULL, (sigset_t*)&u->uc_sigmask);
     // ensure uc_link is properly initialized
@@ -2283,7 +2285,8 @@ EXPORT int my_setcontext(x64emu_t* emu, void* ucp)
     R_GS = (u->uc_mcontext.gregs[X64_CSGSFS]>>16)&0xffff;
     R_FS = (u->uc_mcontext.gregs[X64_CSGSFS]>>32)&0xffff;
     // set FloatPoint status
-    fpu_fxrstor64(emu, &u->xstate);
+    fpu_loadenv(emu, (void*)u->uc_mcontext.fpregs, 1);
+    emu->mxcsr.x32 = *(uint32_t*)(ucp + 432);
     // set signal mask
     sigprocmask(SIG_SETMASK, (sigset_t*)&u->uc_sigmask, NULL);
     // set uc_link