X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-arch.c;h=2b1edbae253847ae0c399473a83900c10a4a64a1;hb=dde834ef75cb12b8cdda23472b3365de72d9422a;hp=2b03d7af276eff306b71c5f969ec9d1d56cdf860;hpb=1419c1d2d50f039be46a8667351b7738ac4965e4;p=sbcl.git diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 2b03d7a..2b1edba 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -57,6 +57,8 @@ context_eflags_addr(os_context_t *context) return &context->uc_mcontext.mc_eflags; #elif defined __OpenBSD__ return &context->sc_eflags; +#elif defined __NetBSD__ + return &(context->uc_mcontext.__gregs[_REG_EFL]); #else #error unsupported OS #endif @@ -72,8 +74,7 @@ void arch_skip_instruction(os_context_t *context) int vlen; int code; - FSHOW((stderr, "/[arch_skip_inst at %x]\n", *os_context_pc_addr(context))); - + /* Get and skip the Lisp interrupt code. */ code = *(char*)(*os_context_pc_addr(context))++; switch (code) @@ -141,18 +142,6 @@ arch_install_breakpoint(void *pc) return result; } -void -get_spinlock(lispobj *word,int value) -{ - u32 eax=0; - do { - asm ("xor %0,%0;cmpxchg %1,%2" - : "=a" (eax) - : "r" (value), "m" (*word) - : "memory", "cc"); - } while(eax!=0); -} - void arch_remove_breakpoint(void *pc, unsigned long orig_inst) { @@ -204,6 +193,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) int code = info->si_code; os_context_t *context = (os_context_t*)void_context; unsigned int trap; + sigset_t ss; if (single_stepping && (signal==SIGTRAP)) { @@ -254,6 +244,9 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) case trap_PendingInterrupt: FSHOW((stderr, "/\n")); arch_skip_instruction(context); + sigemptyset(&ss); + sigaddset(&ss,SIGTRAP); + sigprocmask(SIG_UNBLOCK,&ss,0); interrupt_handle_pending(context); break;