X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-bsd-os.c;h=3d9a9c74e2502e862bc5955d79926a2763e64a58;hb=a566e334e16d9cd0ff4f6858d796442305fd0f99;hp=cfbf2f46b8aed261f8e39bef8706cfbf9bbec72f;hpb=bd455348d39bee562296741689882dcb97c46ba3;p=sbcl.git diff --git a/src/runtime/x86-64-bsd-os.c b/src/runtime/x86-64-bsd-os.c index cfbf2f4..3d9a9c7 100644 --- a/src/runtime/x86-64-bsd-os.c +++ b/src/runtime/x86-64-bsd-os.c @@ -8,6 +8,10 @@ #include #endif +#if defined(LISP_FEATURE_OPENBSD) +#include +#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 @@ -19,7 +23,7 @@ * 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) { @@ -73,6 +77,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 @@ -83,8 +141,17 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) 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 @@ -113,3 +180,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