0.8.9.6.netbsd.2:
[sbcl.git] / src / runtime / x86-arch.c
index 1bb6ba1..fbe318b 100644 (file)
 #include "interrupt.h"
 #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 */
 
@@ -50,8 +55,10 @@ context_eflags_addr(os_context_t *context)
     return &context->uc_mcontext.gregs[16];
 #elif defined __FreeBSD__
     return &context->uc_mcontext.mc_eflags;
-#elif defined __OpenBSD__
+#elif defined __OpenBSD__ || defined __NetBSD__
     return &context->sc_eflags;
+#elif defined __NetBSD__
+    return &(context->uc_mcontext.__gregs[_REG_EFL]);
 #else
 #error unsupported OS
 #endif
@@ -67,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)
@@ -84,7 +90,7 @@ void arch_skip_instruction(os_context_t *context)
            break;
 
        case trap_Breakpoint:           /* not tested */
-       case trap_FunctionEndBreakpoint: /* not tested */
+       case trap_FunEndBreakpoint: /* not tested */
            break;
 
        case trap_PendingInterrupt:
@@ -111,13 +117,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());
 }
 \f
 /*
@@ -186,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))
     {
@@ -216,6 +224,16 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context)
     current_control_stack_pointer =
        (lispobj *)*os_context_sp_addr(context);
 
+    /* FIXME: CMUCL puts the float control restoration code here.
+       Thus, it seems to me that single-stepping won't restore the
+       float control.  Since SBCL currently doesn't support
+       single-stepping (as far as I can tell) this is somewhat moot,
+       but it might be worth either moving this code up or deleting
+       the single-stepping code entirely.  -- CSR, 2002-07-15 */
+#ifdef LISP_FEATURE_LINUX
+    os_restore_fp_control(context);
+#endif
+
     /* On entry %eip points just after the INT3 byte and aims at the
      * 'kind' value (eg trap_Cerror). For error-trap and Cerror-trap a
      * number of bytes will follow, the first is the length of the byte
@@ -226,6 +244,9 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context)
     case trap_PendingInterrupt:
        FSHOW((stderr, "/<trap pending interrupt>\n"));
        arch_skip_instruction(context);
+       sigemptyset(&ss);
+       sigaddset(&ss,SIGTRAP);
+       sigprocmask(SIG_UNBLOCK,&ss,0);
        interrupt_handle_pending(context);
        break;
 
@@ -248,10 +269,10 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context)
        handle_breakpoint(signal, info, context);
        break;
 
-    case trap_FunctionEndBreakpoint:
+    case trap_FunEndBreakpoint:
        (char*)(*os_context_pc_addr(context)) -= 1;
        *os_context_pc_addr(context) =
-           (int)handle_function_end_breakpoint(signal, info, context);
+           (int)handle_fun_end_breakpoint(signal, info, context);
        break;
 
     default:
@@ -266,7 +287,7 @@ static void
 sigill_handler(int signal, siginfo_t *siginfo, void *void_context) {
     os_context_t *context = (os_context_t*)void_context;
     fake_foreign_function_call(context);
-    ldb_monitor();
+    monitor_or_something();
 }
 
 void
@@ -302,6 +323,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)
 {