X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-linux-os.c;h=f02ea8d79612c995391c8344ad934e313b45c134;hb=c5759c03562c984984e368c2ab85a21dceb719ab;hp=b952e6a7945f069240901e92d10fe1e35e736c75;hpb=2495095104de841f12a17aeb94207055f75ed897;p=sbcl.git diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index b952e6a..f02ea8d 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "./signal.h" #include "os.h" @@ -72,10 +73,11 @@ int arch_os_thread_init(struct thread *thread) { 1, 0, 0, /* index, address, length filled in later */ 1, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 1 }; + int n; get_spinlock(&modify_ldt_lock,thread); - + n=modify_ldt(0,local_ldt_copy,sizeof local_ldt_copy); /* get next free ldt entry */ - int n=modify_ldt(0,local_ldt_copy,sizeof local_ldt_copy); + if(n) { u32 *p; for(n=0,p=local_ldt_copy;*p;p+=LDT_ENTRY_SIZE/sizeof(u32)) @@ -89,6 +91,7 @@ int arch_os_thread_init(struct thread *thread) { modify_ldt_lock=0; /* modify_ldt call failed: something magical is not happening */ return -1; + } __asm__ __volatile__ ("movw %w0, %%fs" : : "q" ((n << 3) /* selector number */ + (1 << 2) /* TI set = LDT */ @@ -118,13 +121,18 @@ struct thread *arch_os_get_current_thread() { #ifdef LISP_FEATURE_SB_THREAD register struct thread *me=0; if(all_threads) - __asm__ ("movl %%fs:%c1,%0" : "=r" (me) + __asm__ __volatile__ ("movl %%fs:%c1,%0" : "=r" (me) : "i" (offsetof (struct thread,this))); return me; #else return all_threads; #endif } +struct thread *debug_get_fs() { + register u32 fs; + __asm__ __volatile__ ("movl %%fs,%0" : "=r" (fs) : ); + return fs; +} /* free any arch/os-specific resources used by thread, which is now * defunct. Not called on live threads