1.0.4.13: refactor trap handling
[sbcl.git] / src / runtime / x86-bsd-os.c
index 647eb52..bde0ac0 100644 (file)
@@ -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);