X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-linux-os.c;h=373ffc53e51f4a937f19accd871e5ef9c29b10b6;hb=2b69e4fdba7249fb494635bf78bb3595e34c1eb7;hp=9321e6c1ead750325d60776d65de958a942828e6;hpb=6cde30b92d3e6092372d0164bb47b58568d9360f;p=sbcl.git diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index 9321e6c..373ffc5 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -81,7 +81,6 @@ int arch_os_thread_init(struct thread *thread) { 1, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 1 }; int n; - check_blockables_blocked_or_lose(); thread_mutex_lock(&modify_ldt_lock); n=modify_ldt(0,local_ldt_copy,sizeof local_ldt_copy); /* get next free ldt entry */ @@ -107,9 +106,26 @@ int arch_os_thread_init(struct thread *thread) { thread->tls_cookie=n; pthread_mutex_unlock(&modify_ldt_lock); + /* now %fs:0 refers to the current thread. Useful! Less usefully, + * Linux/x86 isn't capable of reporting a faulting si_addr on a + * segment as defined above (whereas faults on the segment that %gs + * usually points are reported just fine...). As a special + * workaround, we store each thread structure's absolute address as + * as slot in itself, so that within the thread, + * movl %fs:SELFPTR_OFFSET,x + * stores the absolute address of %fs:0 into x. + */ +#ifdef LISP_FEATURE_SB_SAFEPOINT + thread->selfptr = thread; +#endif + if(n<0) return 0; +#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 @@ -140,7 +156,6 @@ int arch_os_thread_cleanup(struct thread *thread) { }; int result; - check_blockables_blocked_or_lose(); ldt_entry.entry_number=thread->tls_cookie; thread_mutex_lock(&modify_ldt_lock); result = modify_ldt(1, &ldt_entry, sizeof (ldt_entry)); @@ -206,7 +221,8 @@ os_context_sigmask_addr(os_context_t *context) void os_restore_fp_control(os_context_t *context) { - asm ("fldcw %0" : : "m" (context->uc_mcontext.fpregs->cw)); + if (context->uc_mcontext.fpregs) + asm ("fldcw %0" : : "m" (context->uc_mcontext.fpregs->cw)); } void