-/*
-
- $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 "arch.h"
#include "sbcl.h"
+#include "arch.h"
#include "globals.h"
#include "validate.h"
#include "os.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;
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;
static void
sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
{
- int badinst;
u32 code;
sigset_t *mask;
+#ifdef LISP_FEATURE_LINUX
+ os_restore_fp_control(context);
+#endif
mask=(os_context_sigmask_addr(context));
sigsetmask(mask);
code=*((u32 *)(*os_context_pc_addr(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:
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
}