X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-linux-os.c;h=f02ea8d79612c995391c8344ad934e313b45c134;hb=b7a8f5313a83dea33ce60551a4fb987b415c2cc6;hp=460cc9ce5ed8d6e9ecc7d23c12fa6973668302fa;hpb=c2e825e81b3ed9355f7f3e3607cbc0274daaee84;p=sbcl.git diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index 460cc9c..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" @@ -56,10 +57,12 @@ u32 local_ldt_copy[LDT_ENTRIES*LDT_ENTRY_SIZE/sizeof(u32)]; void debug_get_ldt() { - int n=__modify_ldt (0, local_ldt_copy, sizeof local_ldt_copy); + int n=modify_ldt (0, local_ldt_copy, sizeof local_ldt_copy); printf("%d bytes in ldt: print/x local_ldt_copy\n", n); } +lispobj modify_ldt_lock; /* protect all calls to modify_ldt */ + int arch_os_thread_init(struct thread *thread) { stack_t sigstack; #ifdef LISP_FEATURE_SB_THREAD @@ -70,8 +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)) @@ -81,14 +87,18 @@ int arch_os_thread_init(struct thread *thread) { ldt_entry.base_addr=(unsigned long) thread; ldt_entry.limit=dynamic_values_bytes; ldt_entry.limit_in_pages=0; - if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) + if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { + 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 */ + 3)); /* privilege level */ thread->tls_cookie=n; + modify_ldt_lock=0; + if(n<0) return 0; #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK @@ -111,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 @@ -130,9 +145,13 @@ int arch_os_thread_cleanup(struct thread *thread) { }; ldt_entry.entry_number=thread->tls_cookie; - if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) + get_spinlock(&modify_ldt_lock,thread); + if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { + modify_ldt_lock=0; /* modify_ldt call failed: something magical is not happening */ return 0; + } + modify_ldt_lock=0; return 1; }