1.1.13: will be tagged as "sbcl-1.1.13"
[sbcl.git] / src / runtime / x86-64-linux-os.c
index d6b1cb9..e012289 100644 (file)
@@ -14,6 +14,8 @@
  * files for more information.
  */
 
+#define _GNU_SOURCE /* for REG_RAX etc. from sys/ucontext */
+
 #include <stdio.h>
 #include <stddef.h>
 #include <sys/param.h>
 #include <unistd.h>
 #include <errno.h>
 
-#define __USE_GNU
 #include <sys/ucontext.h>
-#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