X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-bsd-os.c;h=bde0ac0bf1c80fe92fb3a4b0bfb2047617c54150;hb=8a4f2057bc208d8be2f743275a582b5c9d8e8de7;hp=490c7cf3b571a5f8541ee9445c396306ebf14926;hpb=402958f92506b9d3de852601b8c1ccb99b5ee558;p=sbcl.git diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c index 490c7cf..bde0ac0 100644 --- a/src/runtime/x86-bsd-os.c +++ b/src/runtime/x86-bsd-os.c @@ -36,21 +36,21 @@ os_context_register_addr(os_context_t *context, int offset) { switch(offset) { case 0: - return CONTEXT_ADDR_FROM_STEM(eax); + return (int *)CONTEXT_ADDR_FROM_STEM(eax); case 2: - return CONTEXT_ADDR_FROM_STEM(ecx); + return (int *)CONTEXT_ADDR_FROM_STEM(ecx); case 4: - return CONTEXT_ADDR_FROM_STEM(edx); + return (int *)CONTEXT_ADDR_FROM_STEM(edx); case 6: - return CONTEXT_ADDR_FROM_STEM(ebx); + return (int *)CONTEXT_ADDR_FROM_STEM(ebx); case 8: - return CONTEXT_ADDR_FROM_STEM(esp); + return (int *)CONTEXT_ADDR_FROM_STEM(esp); case 10: - return CONTEXT_ADDR_FROM_STEM(ebp); + return (int *)CONTEXT_ADDR_FROM_STEM(ebp); case 12: - return CONTEXT_ADDR_FROM_STEM(esi); + return (int *)CONTEXT_ADDR_FROM_STEM(esi); case 14: - return CONTEXT_ADDR_FROM_STEM(edi); + return (int *)CONTEXT_ADDR_FROM_STEM(edi); default: return 0; } @@ -59,7 +59,7 @@ os_context_register_addr(os_context_t *context, int offset) int * os_context_sp_addr(os_context_t *context) { - return CONTEXT_ADDR_FROM_STEM(esp); + return (int *)CONTEXT_ADDR_FROM_STEM(esp); } #endif /* __FreeBSD__ || __OpenBSD__ */ @@ -100,6 +100,22 @@ os_context_sp_addr(os_context_t *context) #endif /* __NetBSD__ */ +int *os_context_pc_addr(os_context_t *context) +{ +#if defined __FreeBSD__ + return CONTEXT_ADDR_FROM_STEM(eip); +#elif defined __OpenBSD__ + return CONTEXT_ADDR_FROM_STEM(pc); +#elif defined __NetBSD__ + return CONTEXT_ADDR_FROM_STEM(EIP); +#elif defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) + return (int *)CONTEXT_ADDR_FROM_STEM(eip); +#elif defined LISP_FEATURE_DARWIN + return &context->uc_mcontext->ss.srr0; +#else +#error unsupported BSD variant +#endif +} /* FIXME: If this can be a no-op on BSD/x86, then it * deserves a more precise name. @@ -150,7 +166,7 @@ int arch_os_thread_init(struct thread *thread) { } FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); sel = LSEL(n, SEL_UPL); - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); + load_fs(sel); thread->tls_cookie=n; pthread_setspecific(specials,thread); @@ -194,7 +210,12 @@ int arch_os_thread_cleanup(struct thread *thread) { void os_restore_fp_control(os_context_t *context) { + /* FPU state is saved per context on post-KSE systems. + * On earlier systems, it is shared in a whole process. + */ +#if defined(__FreeBSD_version) && __FreeBSD_version >= 500040 struct envxmm *ex = (struct envxmm*)(&context->uc_mcontext.mc_fpstate); asm ("fldcw %0" : : "m" (ex->en_cw)); +#endif } #endif