X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-arch.c;h=e0806155810426f9d580448c1780ccf2606289d5;hb=df679ed627975948b1cee190f4d79c397588c43e;hp=5063c986d34e135620e765b6b6aed235f921a068;hpb=637371f800e71ac4449e01d59571c9d10f6bde26;p=sbcl.git diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 5063c98..e080615 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -24,6 +24,10 @@ #include "interr.h" #include "breakpoint.h" #include "monitor.h" +#include "thread.h" + +#include "genesis/static-symbols.h" +#include "genesis/symbol.h" #define BREAKPOINT_INST 0xcc /* INT3 */ @@ -112,13 +116,14 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return SymbolValue(PSEUDO_ATOMIC_ATOMIC); + return SymbolValue(PSEUDO_ATOMIC_ATOMIC,arch_os_get_current_thread()); } void arch_set_pseudo_atomic_interrupted(os_context_t *context) { - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1), + arch_os_get_current_thread()); } /* @@ -136,6 +141,18 @@ arch_install_breakpoint(void *pc) return result; } +void +get_spinlock(lispobj *word,int value) +{ + u32 eax=0; + do { + asm ("xor %0,%0;lock cmpxchg %1,%2" + : "=a" (eax) + : "r" (value), "m" (*word) + : "memory", "cc"); + } while(eax!=0); +} + void arch_remove_breakpoint(void *pc, unsigned long orig_inst) { @@ -313,6 +330,7 @@ call_into_lisp(lispobj fun, lispobj *args, int nargs); * could be in registers depending on what the compiler likes. So we * copy the args into a portable vector and let the assembly language * call-in function figure it out. */ + lispobj funcall0(lispobj function) {