X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fruntime%2Fx86-64-linux-os.c;h=01e69bcf15ef582f3035a130ebb501ea0bd9e197;hb=eaa8a506790bb6ed627da617247bfd13802eb365;hp=c9968137911f1123c3baf6fdb9a9b33085d276b5;hpb=78fa16bf55be44cc16845be84d98023e83fb14bc;p=sbcl.git diff --git a/src/runtime/x86-64-linux-os.c b/src/runtime/x86-64-linux-os.c index c996813..01e69bc 100644 --- a/src/runtime/x86-64-linux-os.c +++ b/src/runtime/x86-64-linux-os.c @@ -1,6 +1,6 @@ /* - * The x86 Linux incarnation of arch-dependent OS-dependent routines. - * See also "linux-os.c". + * The x86-64 Linux incarnation of arch-dependent OS-dependent + * routines. See also "linux-os.c". */ /* @@ -50,65 +50,13 @@ #include #include "thread.h" /* dynamic_values_bytes */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -#define user_desc modify_ldt_ldt_s -#endif - -_syscall3(int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount ); - #include "validate.h" size_t os_vm_page_size; -u32 local_ldt_copy[LDT_ENTRIES*LDT_ENTRY_SIZE/sizeof(u32)]; - -/* This is never actually called, but it's great for calling from gdb when - * users have thread-related problems that maintainers can't duplicate */ - -void debug_get_ldt() -{ - 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 - /* this must be called from a function that has an exclusive lock - * on all_threads - */ - struct user_desc ldt_entry = { - 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 */ - - if(n) { - u32 *p; - for(n=0,p=local_ldt_copy;*p;p+=LDT_ENTRY_SIZE/sizeof(u32)) - n++; - } - ldt_entry.entry_number=n; - 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) { - 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; +#error Threads are not supported on x86-64 in this SBCL version #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* Signal handlers are run on the control stack, so if it is exhausted @@ -122,30 +70,11 @@ int arch_os_thread_init(struct thread *thread) { return 1; } -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 */ int arch_os_thread_cleanup(struct thread *thread) { - struct user_desc ldt_entry = { - 0, 0, 0, - 0, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 0 - }; - - ldt_entry.entry_number=thread->tls_cookie; - 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; } @@ -200,12 +129,8 @@ os_context_fp_addr(os_context_t *context) unsigned long os_context_fp_control(os_context_t *context) { -#if 0 - return ((((context->uc_mcontext.fpregs->cw) & 0xffff) ^ 0x3f) | - (((context->uc_mcontext.fpregs->sw) & 0xffff) << 16)); -#else - return 0; -#endif + int mxcsr = context->uc_mcontext.fpregs->mxcsr; + return ((mxcsr & 0x3F) << 16 | ((mxcsr >> 7) & 0x3F)) ^ 0x3F; } sigset_t * @@ -217,9 +142,7 @@ os_context_sigmask_addr(os_context_t *context) void os_restore_fp_control(os_context_t *context) { -#if 0 - asm ("fldcw %0" : : "m" (context->uc_mcontext.fpregs->cw)); -#endif + asm ("ldmxcsr %0" : : "m" (context->uc_mcontext.fpregs->mxcsr)); } void