X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-linux-os.c;h=e012289022eec477d7f0e3e9a6e8b23e2e75b3cd;hb=36717964ebcff8353035062789c08f223feccf1a;hp=d6b1cb92ca705957269dabb83484258de0793c3d;hpb=79cc569a97e444389350ea3f5b1017374fe16bec;p=sbcl.git diff --git a/src/runtime/x86-64-linux-os.c b/src/runtime/x86-64-linux-os.c index d6b1cb9..e012289 100644 --- a/src/runtime/x86-64-linux-os.c +++ b/src/runtime/x86-64-linux-os.c @@ -14,6 +14,8 @@ * files for more information. */ +#define _GNU_SOURCE /* for REG_RAX etc. from sys/ucontext */ + #include #include #include @@ -22,10 +24,7 @@ #include #include -#define __USE_GNU #include -#undef __USE_GNU - #include "./signal.h" #include "os.h" @@ -56,8 +55,12 @@ size_t os_vm_page_size; 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_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 @@ -147,11 +150,13 @@ os_context_sigmask_addr(os_context_t *context) void os_restore_fp_control(os_context_t *context) { - /* reset exception flags and restore control flags on SSE2 FPU */ - unsigned int temp = (context->uc_mcontext.fpregs->mxcsr) & ~0x3F; - asm ("ldmxcsr %0" : : "m" (temp)); - /* same for x87 FPU. */ - asm ("fldcw %0" : : "m" (context->uc_mcontext.fpregs->cwd)); + if (context->uc_mcontext.fpregs) { + /* reset exception flags and restore control flags on SSE2 FPU */ + unsigned int temp = (context->uc_mcontext.fpregs->mxcsr) & ~0x3F; + asm ("ldmxcsr %0" : : "m" (temp)); + /* same for x87 FPU. */ + asm ("fldcw %0" : : "m" (context->uc_mcontext.fpregs->cwd)); + } } void