X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-bsd-os.c;h=bde0ac0bf1c80fe92fb3a4b0bfb2047617c54150;hb=ee90e535c985f697c71d839083aed16710f846fd;hp=647eb52d9ea3ac2eddb2df31d3838270d89268b8;hpb=000e9e0b51a505e1e9079891d53317a9b8d8e807;p=sbcl.git diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c index 647eb52..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);