1.0.30.31:
[sbcl.git] / src / runtime / ppc-arch.c
index e2d5c67..533293d 100644 (file)
 #include "globals.h"
 #include "validate.h"
 #include "os.h"
+#include "interrupt.h"
 #include "lispregs.h"
 #include "signal.h"
 #include "interrupt.h"
 #include "interr.h"
 #include "breakpoint.h"
+#include "alloc.h"
 
 #if defined(LISP_FEATURE_GENCGC)
 #include "gencgc-alloc-region.h"
@@ -355,7 +357,13 @@ handle_allocation_trap(os_context_t * context)
             dynamic_space_free_pointer);
 #endif
 
-    memory = (char *) alloc(size);
+    {
+        struct interrupt_data *data =
+            arch_os_get_current_thread()->interrupt_data;
+        data->allocation_trap_context = context;
+        memory = (char *) alloc(size);
+        data->allocation_trap_context = 0;
+    }
 
 #if 0
     fprintf(stderr, "alloc returned %p\n", memory);
@@ -426,9 +434,6 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
 {
     unsigned int code;
 
-#ifdef LISP_FEATURE_LINUX
-    os_restore_fp_control(context);
-#endif
     code=*((u32 *)(*os_context_pc_addr(context)));
     if (code == ((3 << 26) | (0x18 << 21) | (reg_NL3 << 16))) {
         arch_clear_pseudo_atomic_interrupted(context);
@@ -444,9 +449,6 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
     if (allocation_trap_p(context)) {
         handle_allocation_trap(context);
         arch_skip_instruction(context);
-#ifdef LISP_FEATURE_DARWIN
-        DARWIN_FIX_CONTEXT(context);
-#endif
         return;
     }
 #endif
@@ -455,32 +457,21 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
         /* twllei reg_ZERO,N will always trap if reg_ZERO = 0 */
         int trap = code & 0x1f;
         handle_trap(context,trap);
-
-#ifdef LISP_FEATURE_DARWIN
-        DARWIN_FIX_CONTEXT(context);
-#endif
         return;
     }
     if (((code >> 26) == 3) && (((code >> 21) & 31) == 24)) {
         interrupt_internal_error(context, 0);
-#ifdef LISP_FEATURE_DARWIN
-        DARWIN_FIX_CONTEXT(context);
-#endif
         return;
     }
 
-    interrupt_handle_now(signal, code, context);
-#ifdef LISP_FEATURE_DARWIN
-    /* Work around G5 bug */
-    DARWIN_FIX_CONTEXT(context);
-#endif
+    interrupt_handle_now(signal, (siginfo_t *)code, context);
 }
 
 
 void arch_install_interrupt_handlers()
 {
-    undoably_install_low_level_interrupt_handler(SIGILL,sigtrap_handler);
-    undoably_install_low_level_interrupt_handler(SIGTRAP,sigtrap_handler);
+    undoably_install_low_level_interrupt_handler(SIGILL, sigtrap_handler);
+    undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler);
 }
 
 void