#include <machine/fpu.h>
#endif
+#if defined(LISP_FEATURE_OPENBSD)
+#include <machine/fpu.h>
+#endif
+
/* KLUDGE: There is strong family resemblance in the signal context
* stuff in FreeBSD and OpenBSD, but in detail they're different in
* almost every line of code. It would be nice to find some way to
* entails; unfortunately, currently the situation is worse, not
* better, than in the above paragraph. */
-#if defined(LISP_FEATURE_FREEBSD)
+#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)
{
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
int arch_os_thread_init(struct thread *thread) {
stack_t sigstack;
#ifdef LISP_FEATURE_SB_THREAD
+#ifdef LISP_FEATURE_GCC_TLS
+ current_thread = thread;
+#else
pthread_setspecific(specials,thread);
#endif
+#endif
+
+#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
+ mach_lisp_thread_init(thread);
+#endif
+
#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
/* Signal handlers are run on the control stack, so if it is exhausted
* we had better use an alternate stack for whatever signal tells us
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