From: Cyrus Harmon Date: Tue, 10 Apr 2007 04:18:10 +0000 (+0000) Subject: 1.0.4.54: x86-64/darwin preliminary threads support X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=1cf1afff10cfc48a2f4a26fd4533531081602219;p=sbcl.git 1.0.4.54: x86-64/darwin preliminary threads support * 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 --- diff --git a/make-config.sh b/make-config.sh index e5fbade..01aa681 100644 --- a/make-config.sh +++ b/make-config.sh @@ -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 diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 136e23e..3b2f2f0 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -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 diff --git a/src/runtime/x86-64-arch.h b/src/runtime/x86-64-arch.h index 2085503..baa5b8d 100644 --- a/src/runtime/x86-64-arch.h +++ b/src/runtime/x86-64-arch.h @@ -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; diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index eb7d78f..8cfd582 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -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 diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 3800bbc..0b85990 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -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") diff --git a/version.lisp-expr b/version.lisp-expr index cf0a988..1454db7 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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"