0.9.1.29:
[sbcl.git] / src / runtime / x86-arch.c
index 24adeca..a62d204 100644 (file)
 
 #include <stdio.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "globals.h"
 #include "validate.h"
 #include "os.h"
-#include "sbcl.h"
 #include "arch.h"
 #include "lispregs.h"
 #include "signal.h"
@@ -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)
@@ -84,7 +85,7 @@ void arch_skip_instruction(os_context_t *context)
            vlen = *(char*)(*os_context_pc_addr(context))++;
            /* Skip Lisp error arg data bytes. */
            while (vlen-- > 0) {
-               ( (char*)(*os_context_pc_addr(context)) )++;
+               ++*os_context_pc_addr(context);
            }
            break;
 
@@ -141,19 +142,6 @@ arch_install_breakpoint(void *pc)
     return result;
 }
 
-void 
-get_spinlock(lispobj *word,int value)
-{
-    u32 eax=0;
-    do {
-       asm ("xor %0,%0\n\
-              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)
 {
@@ -255,7 +243,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context)
     case trap_PendingInterrupt:
        FSHOW((stderr, "/<trap pending interrupt>\n"));
        arch_skip_instruction(context);
-       interrupt_handle_pending(context);
+        interrupt_handle_pending(context);
        break;
 
     case trap_Halt:
@@ -273,12 +261,12 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context)
        break;
 
     case trap_Breakpoint:
-       (char*)(*os_context_pc_addr(context)) -= 1;
+       --*os_context_pc_addr(context);
        handle_breakpoint(signal, info, context);
        break;
 
     case trap_FunEndBreakpoint:
-       (char*)(*os_context_pc_addr(context)) -= 1;
+       --*os_context_pc_addr(context);
        *os_context_pc_addr(context) =
            (int)handle_fun_end_breakpoint(signal, info, context);
        break;
@@ -364,3 +352,35 @@ funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2)
     args[2] = arg2;
     return call_into_lisp(function, args, 3);
 }
+
+#ifdef LISP_FEATURE_LINKAGE_TABLE
+/* FIXME: It might be cleaner to generate these from the lisp side of
+ * things.
+ */
+
+void 
+arch_write_linkage_table_jmp(char * reloc, void * fun)
+{
+    /* Make JMP to function entry. JMP offset is calculated from next
+     * instruction.
+     */
+    long offset = (char *)fun - (reloc + 5);
+    int i;
+
+    *reloc++ = 0xe9;           /* opcode for JMP rel32 */
+    for (i = 0; i < 4; i++) {
+       *reloc++ = offset & 0xff;
+       offset >>= 8;
+    }
+
+    /* write a nop for good measure. */
+    *reloc = 0x90;
+}
+
+void
+arch_write_linkage_table_ref(void * reloc, void * data)
+{
+    *(unsigned long *)reloc = (unsigned long)data;
+}
+
+#endif