1.0.4.54: x86-64/darwin preliminary threads support
authorCyrus Harmon <ch-sbcl@bobobeach.com>
Tue, 10 Apr 2007 04:18:10 +0000 (04:18 +0000)
committerCyrus Harmon <ch-sbcl@bobobeach.com>
Tue, 10 Apr 2007 04:18:10 +0000 (04:18 +0000)
 * add sb-lutex to features via make-config.sh
 * preserve_pointer context registers in gencgc.c
 * use lock/cmpxchg on darwin
 * GSYM/GNAME asm hacks
 * add -arch options when appropriate for building threads-foreign.so

make-config.sh
src/runtime/gencgc.c
src/runtime/x86-64-arch.h
src/runtime/x86-64-assem.S
tests/threads.impure.lisp
version.lisp-expr

index e5fbade..01aa681 100644 (file)
@@ -221,6 +221,9 @@ case "$sbcl_os" in
         if [ $sbcl_arch = "x86" ]; then
             printf ' :sb-lutex :restore-fs-segment-register-from-tls' >> $ltf
         fi
+        if [ $sbcl_arch = "x86-64" ]; then
+            printf ' :sb-lutex' >> $ltf
+        fi
         link_or_copy $sbcl_arch-darwin-os.h target-arch-os.h
         link_or_copy bsd-os.h target-os.h
         link_or_copy Config.$sbcl_arch-darwin Config
index 136e23e..3b2f2f0 100644 (file)
@@ -3822,6 +3822,22 @@ preserve_context_registers (os_context_t *c)
     preserve_pointer((void*)*os_context_register_addr(c,reg_ESI));
     preserve_pointer((void*)*os_context_register_addr(c,reg_EDI));
     preserve_pointer((void*)*os_context_pc_addr(c));
+#elif defined LISP_FEATURE_X86_64
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RAX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RCX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RDX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RBX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RSI));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RDI));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R8));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R9));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R10));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R11));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R12));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R13));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R14));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R15));
+    preserve_pointer((void*)*os_context_pc_addr(c));
 #else
     #error "preserve_context_registers needs to be tweaked for non-x86 Darwin"
 #endif
index 2085503..baa5b8d 100644 (file)
@@ -26,11 +26,19 @@ get_spinlock(volatile lispobj *word,long value)
     if(*word==value)
         lose("recursive get_spinlock: 0x%x,%ld\n",word,value);
     do {
+#if defined(LISP_FEATURE_DARWIN)
+        asm ("xor %0,%0\n\
+              lock/cmpxchg %1,%2"
+             : "=a" (rax)
+             : "r" (value), "m" (*word)
+             : "memory", "cc");
+#else
         asm ("xor %0,%0\n\
               lock cmpxchg %1,%2"
              : "=a" (rax)
              : "r" (value), "m" (*word)
              : "memory", "cc");
+#endif
     } while(rax!=0);
 #else
     *word=value;
index eb7d78f..8cfd582 100644 (file)
@@ -182,8 +182,12 @@ Lstack:
        push    %rsi    #
        push    %rdx    #
 #ifdef LISP_FEATURE_SB_THREAD
+#ifdef LISP_FEATURE_DARWIN
+       mov     GSYM(GNAME(specials)),%rdi
+#else
        mov     specials,%rdi
-       call    pthread_getspecific
+#endif
+       call    GNAME(pthread_getspecific)
        mov     %rax,%r12
 #endif
        pop     %rcx    # num args
index 3800bbc..0b85990 100644 (file)
@@ -99,7 +99,8 @@
  #-sunos "cc" #+sunos "gcc"
  (or #+(or linux freebsd sunos) '(#+x86-64 "-fPIC"
                                   "-shared" "-o" "threads-foreign.so" "threads-foreign.c")
-     #+darwin '("-dynamiclib" "-o" "threads-foreign.so" "threads-foreign.c")
+     #+darwin '(#+x86-64 "-arch" #+x86-64 "x86_64"
+                "-dynamiclib" "-o" "threads-foreign.so" "threads-foreign.c")
      (error "Missing shared library compilation options for this platform"))
  :search t)
 (sb-alien:load-shared-object "threads-foreign.so")
index cf0a988..1454db7 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.4.53"
+"1.0.4.54"