cleanup: remove cast to (unsigned long) from print_ptr()
[sbcl.git] / src / runtime / x86-64-bsd-os.c
index 5c29b22..8c54503 100644 (file)
@@ -8,6 +8,10 @@
 #include <machine/fpu.h>
 #endif
 
+#if defined(LISP_FEATURE_OPENBSD)
+#include <machine/fpu.h>
+#endif
+
 #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
 #include <mach/mach.h>
 
@@ -25,7 +29,7 @@ kern_return_t mach_thread_init(mach_port_t thread_exception_port);
  * entails; unfortunately, currently the situation is worse, not
  * better, than in the above paragraph. */
 
-#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DARWIN)
+#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DARWIN) || defined(LISP_FEATURE_OPENBSD)
 os_context_register_t *
 os_context_register_addr(os_context_t *context, int offset)
 {
@@ -79,6 +83,60 @@ os_context_pc_addr(os_context_t *context)
     return CONTEXT_ADDR_FROM_STEM(rip);
 }
 
+#elif defined(LISP_FEATURE_NETBSD)
+os_context_register_t *
+os_context_register_addr(os_context_t *context, int offset)
+{
+    switch(offset) {
+    case reg_RAX:
+        return CONTEXT_ADDR_FROM_STEM(RAX);
+    case reg_RCX:
+        return CONTEXT_ADDR_FROM_STEM(RCX);
+    case reg_RDX:
+        return CONTEXT_ADDR_FROM_STEM(RDX);
+    case reg_RBX:
+        return CONTEXT_ADDR_FROM_STEM(RBX);
+    case reg_RSP:
+        return CONTEXT_ADDR_FROM_STEM(RSP);
+    case reg_RBP:
+        return CONTEXT_ADDR_FROM_STEM(RBP);
+    case reg_RSI:
+        return CONTEXT_ADDR_FROM_STEM(RSI);
+    case reg_RDI:
+        return CONTEXT_ADDR_FROM_STEM(RDI);
+    case reg_R8:
+        return CONTEXT_ADDR_FROM_STEM(R8);
+    case reg_R9:
+        return CONTEXT_ADDR_FROM_STEM(R9);
+    case reg_R10:
+        return CONTEXT_ADDR_FROM_STEM(R10);
+    case reg_R11:
+        return CONTEXT_ADDR_FROM_STEM(R11);
+    case reg_R12:
+        return CONTEXT_ADDR_FROM_STEM(R12);
+    case reg_R13:
+        return CONTEXT_ADDR_FROM_STEM(R13);
+    case reg_R14:
+        return CONTEXT_ADDR_FROM_STEM(R14);
+    case reg_R15:
+        return CONTEXT_ADDR_FROM_STEM(R15);
+    default:
+        return 0;
+    }
+}
+
+os_context_register_t *
+os_context_sp_addr(os_context_t *context)
+{
+    return CONTEXT_ADDR_FROM_STEM(RSP);
+}
+
+os_context_register_t *
+os_context_pc_addr(os_context_t *context)
+{
+    return CONTEXT_ADDR_FROM_STEM(RIP);
+}
+
 #endif
 
 void
@@ -128,3 +186,16 @@ os_restore_fp_control(os_context_t *context)
     asm ("fldcw %0" : : "m" (ex->en_cw));
 }
 #endif
+
+#if defined(LISP_FEATURE_OPENBSD)
+void
+os_restore_fp_control(os_context_t *context)
+{
+    if (context->sc_fpstate != NULL) {
+        u_int32_t mxcsr = context->sc_fpstate->fx_mxcsr & ~0x3F;
+        u_int16_t cw = context->sc_fpstate->fx_fcw;
+        asm ("ldmxcsr %0" : : "m" (mxcsr));
+        asm ("fldcw %0" : : "m" (cw));
+    }
+}
+#endif