diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-08 18:13:42 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-08 18:13:42 +0100 |
| commit | 7a623ef19c3b032a015084b029705dd55e0af751 (patch) | |
| tree | 0a952f3eb1ffab5fb905e78452155402f11c6960 /src | |
| parent | f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1 (diff) | |
| download | box64-7a623ef19c3b032a015084b029705dd55e0af751.tar.gz box64-7a623ef19c3b032a015084b029705dd55e0af751.zip | |
Improved getcontext/setcontext ([BOX32] too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/libtools/signal32.c | 7 | ||||
| -rw-r--r-- | src/libtools/signals.c | 9 |
2 files changed, 9 insertions, 7 deletions
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index 064fd3a0..7d92f91f 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -863,8 +863,8 @@ EXPORT int my32_getcontext(x64emu_t* emu, void* ucp) u->uc_mcontext.gregs[I386_CS] = R_CS; u->uc_mcontext.gregs[I386_SS] = R_SS; // get FloatPoint status - if(u->uc_mcontext.fpregs) - save_fpreg(emu, from_ptrv(u->uc_mcontext.fpregs)); + u->uc_mcontext.fpregs = to_ptrv(ucp + 236); // magic offset of fpregs in an actual i386 u_context + fpu_savenv(emu, from_ptrv(u->uc_mcontext.fpregs), 1); // it seems getcontext only save fpu env, not fpu regs // get signal mask sigprocmask(SIG_SETMASK, NULL, (sigset_t*)&u->uc_sigmask); // ensure uc_link is properly initialized @@ -898,8 +898,7 @@ EXPORT int my32_setcontext(x64emu_t* emu, void* ucp) R_CS = u->uc_mcontext.gregs[I386_CS]; R_SS = u->uc_mcontext.gregs[I386_SS]; // set FloatPoint status - if(u->uc_mcontext.fpregs) - load_fpreg(emu, from_ptrv(u->uc_mcontext.fpregs)); + fpu_loadenv(emu, from_ptrv(u->uc_mcontext.fpregs), 1); // set signal mask sigprocmask(SIG_SETMASK, (sigset_t*)&u->uc_sigmask, NULL); // set uc_link 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 |