0.8.7.57:
[sbcl.git] / src / runtime / ppc-arch.c
index 2d62424..aa8a522 100644 (file)
@@ -1,14 +1,6 @@
-/*
-
- $Header$
-
- This code was written as part of the CMU Common Lisp project at
- Carnegie Mellon University, and has been placed in the public domain.
-
-*/
-
 #include <stdio.h>
 
+#include "sbcl.h"
 #include "arch.h"
 #include "sbcl.h"
 #include "globals.h"
 #define PT_DSISR       42
 #endif
 
-void arch_init()
-{
+void arch_init() {
 }
 
 os_vm_address_t 
 arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context)
 {
-    unsigned long badinstr;
     unsigned int *pc =  (unsigned int *)(*os_context_pc_addr(context));
-    int instclass;
     os_vm_address_t addr;
     
     
@@ -58,7 +47,7 @@ arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context)
     if ((((unsigned long)pc) & 3) != 0 ||
        ((pc < READ_ONLY_SPACE_START ||
          pc >= READ_ONLY_SPACE_START+READ_ONLY_SPACE_SIZE) &&
-        ((lispobj *)pc < current_dynamic_space &&
+        ((lispobj *)pc < current_dynamic_space || 
          (lispobj *)pc >= current_dynamic_space + DYNAMIC_SPACE_SIZE)))
        return 0;
     
@@ -134,7 +123,6 @@ arch_do_displaced_inst(os_context_t *context,unsigned int orig_inst)
 static void 
 sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
 {
-    int badinst;
     u32 code;
     sigset_t *mask;
 #ifdef LISP_FEATURE_LINUX
@@ -156,7 +144,7 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
     }
     if ((code >> 16) == ((3 << 10) | (6 << 5))) {
        /* twllei reg_ZERO,N will always trap if reg_ZERO = 0 */
-       int trap = code & 0x1f, extra = (code >> 5) & 0x1f;
+       int trap = code & 0x1f;
        
        switch (trap) {
        case trap_Halt:
@@ -198,12 +186,24 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
            interrupt_handle_now(signal, code, context);
            break;
        }
+#ifdef LISP_FEATURE_DARWIN
+       sigreturn(context);
+#endif
+       return;
     }
     if (((code >> 26) == 3) && (((code >> 21) & 31) == 24)) {
        interrupt_internal_error(signal, code, context, 0);
+#ifdef LISP_FEATURE_DARWIN
+       sigreturn(context);
+#endif
+       return;
     }
     
     interrupt_handle_now(signal, code, context);
+#ifdef LISP_FEATURE_DARWIN
+    /* Work around G5 bug */
+    sigreturn(context);
+#endif
 }