Skip to content
Snippets Groups Projects
Commit b3a49942 authored by Robert Swindells's avatar Robert Swindells
Browse files

Update to NetBSD-7 mcontext API.

parent 19b642fb
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <errno.h> #include <errno.h>
#include <x86/fpu.h>
#include "os.h" #include "os.h"
#include "arch.h" #include "arch.h"
#include "globals.h" #include "globals.h"
...@@ -133,19 +135,19 @@ os_sigcontext_fpu_modes(ucontext_t *scp) ...@@ -133,19 +135,19 @@ os_sigcontext_fpu_modes(ucontext_t *scp)
{ {
unsigned int modes; unsigned int modes;
union savefpu *sv = (union savefpu *) &scp->uc_mcontext.__fpregs.__fp_reg_set; union savefpu *sv = &scp->uc_mcontext.__fpregs.__fp_reg_set;
struct env87 *env_87 = (struct env87 *) &sv->sv_87.sv_env; struct save87 *env_87 = (struct save87 *) &sv->sv_87;
struct envxmm *env_xmm = (struct envxmm *) &sv->sv_xmm.sv_env; struct fxsave *env_xmm = (struct fxsave *) &sv->sv_xmm;
u_int16_t cw; u_int16_t cw;
u_int16_t sw; u_int16_t sw;
if (scp->uc_flags & _UC_FPU) { if (scp->uc_flags & _UC_FPU) {
if (scp->uc_flags & _UC_FXSAVE) { if (scp->uc_flags & _UC_FXSAVE) {
cw = env_xmm->en_cw; cw = env_xmm->fx_cw;
sw = env_xmm->en_sw; sw = env_xmm->fx_sw;
} else { } else {
cw = env_87->en_cw & 0xffff; cw = env_87->s87_cw & 0xffff;
sw = env_87->en_sw & 0xffff; sw = env_87->s87_sw & 0xffff;
} }
} else { } else {
cw = 0; cw = 0;
...@@ -156,7 +158,7 @@ os_sigcontext_fpu_modes(ucontext_t *scp) ...@@ -156,7 +158,7 @@ os_sigcontext_fpu_modes(ucontext_t *scp)
#ifdef FEATURE_SSE2 #ifdef FEATURE_SSE2
if (fpu_mode == SSE2) { if (fpu_mode == SSE2) {
u_int32_t mxcsr = env_xmm->en_mxcsr; u_int32_t mxcsr = env_xmm->fx_mxcsr;
DPRINTF(0, (stderr, "SSE2 modes = %08x\n", (int)mxcsr)); DPRINTF(0, (stderr, "SSE2 modes = %08x\n", (int)mxcsr));
modes |= mxcsr; modes |= mxcsr;
...@@ -347,9 +349,9 @@ sigfpe_handler(HANDLER_ARGS) ...@@ -347,9 +349,9 @@ sigfpe_handler(HANDLER_ARGS)
} }
if (ucontext->uc_flags & _UC_FXSAVE) { if (ucontext->uc_flags & _UC_FXSAVE) {
sv->sv_xmm.sv_env.en_sw |= trap; sv->sv_xmm.fx_sw |= trap;
} else { } else {
sv->sv_87.sv_env.en_sw |= trap; sv->sv_87.s87_sw |= trap;
} }
interrupt_handle_now(signal, code, context); interrupt_handle_now(signal, code, context);
} }
...@@ -385,16 +387,16 @@ os_dlsym(const char *sym_name, lispobj lib_list) ...@@ -385,16 +387,16 @@ os_dlsym(const char *sym_name, lispobj lib_list)
void void
restore_fpu(ucontext_t *scp) restore_fpu(ucontext_t *scp)
{ {
union savefpu *sv = (union savefpu *) &scp->uc_mcontext.__fpregs.__fp_reg_set; union savefpu *sv = &scp->uc_mcontext.__fpregs.__fp_reg_set;
struct env87 *env_87 = &sv->sv_87.sv_env; struct save87 *env_87 = (struct save87 *) &sv->sv_87;
struct envxmm *env_xmm = &sv->sv_xmm.sv_env; struct fxsave *env_xmm = (struct fxsave *) &sv->sv_xmm;
u_int16_t cw; u_int16_t cw;
if (scp->uc_flags & _UC_FPU) { if (scp->uc_flags & _UC_FPU) {
if (scp->uc_flags & _UC_FXSAVE) { if (scp->uc_flags & _UC_FXSAVE) {
cw = env_xmm->en_cw; cw = env_xmm->fx_cw;
} else { } else {
cw = env_87->en_cw & 0xffff; cw = env_87->s87_cw & 0xffff;
} }
} else { } else {
return; return;
...@@ -403,7 +405,7 @@ restore_fpu(ucontext_t *scp) ...@@ -403,7 +405,7 @@ restore_fpu(ucontext_t *scp)
__asm__ __volatile__ ("fldcw %0"::"m"(*&cw)); __asm__ __volatile__ ("fldcw %0"::"m"(*&cw));
if (fpu_mode == SSE2) { if (fpu_mode == SSE2) {
u_int32_t mxcsr = env_xmm->en_mxcsr; u_int32_t mxcsr = env_xmm->fx_mxcsr;
DPRINTF(0, (stderr, "restore_fpu: mxcsr (raw) = %04x\n", mxcsr)); DPRINTF(0, (stderr, "restore_fpu: mxcsr (raw) = %04x\n", mxcsr));
__asm__ __volatile__ ("ldmxcsr %0"::"m"(*&mxcsr)); __asm__ __volatile__ ("ldmxcsr %0"::"m"(*&mxcsr));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment