X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-linux-os.c;h=373ffc53e51f4a937f19accd871e5ef9c29b10b6;hb=d8422b9967f465801891907396bcc5bfde0f3297;hp=ddbe154236cccc0d4302c61caed03302873071ba;hpb=842d3c24e4a1a6b5ebadb9ee754814174a951029;p=sbcl.git diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index ddbe154..373ffc5 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -106,6 +106,19 @@ 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;