void arch_init(void)
{}
+#ifndef LISP_FEATURE_WIN32
os_vm_address_t
arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context)
{
return (os_vm_address_t)code->si_addr;
}
+#endif
\f
/*
return &context->uc_mcontext.mc_eflags;
#elif defined __OpenBSD__
return &context->sc_eflags;
+#elif defined LISP_FEATURE_DARWIN
+ return &context->uc_mcontext->ss.eflags;
#elif defined __NetBSD__
return &(context->uc_mcontext.__gregs[_REG_EFL]);
+#elif defined LISP_FEATURE_WIN32
+ return (int *)&context->EFlags;
#else
#error unsupported OS
#endif
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1),
arch_os_get_current_thread());
}
+
+void
+arch_clear_pseudo_atomic_interrupted(os_context_t *context)
+{
+ SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),
+ arch_os_get_current_thread());
+}
\f
/*
* This stuff seems to get called for TRACE and debug activity.
void
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;
+#ifndef LISP_FEATURE_WIN32
if (single_stepping && (signal==SIGTRAP))
{
/* fprintf(stderr,"* single step trap %x\n", single_stepping); */
single_stepping = NULL;
return;
}
+#endif
/* This is just for info in case the monitor wants to print an
* approximation. */
* number of bytes will follow, the first is the length of the byte
* arguments to follow. */
trap = *(unsigned char *)(*os_context_pc_addr(context));
+ /* FSHOW((stderr, "/<sigtrap trap %d at pc_addr: %p>\n", trap, *os_context_pc_addr(context))); */
switch (trap) {
case trap_PendingInterrupt:
* seems to be no point in doing that, since we're just
* going to lose(..) anyway. */
fake_foreign_function_call(context);
- lose("%%PRIMITIVE HALT called; the party is over.");
+ lose("%%PRIMITIVE HALT called; the party is over.\n");
case trap_Error:
case trap_Cerror:
- FSHOW((stderr, "<trap error/cerror %d>\n", code));
- interrupt_internal_error(signal, info, context, code==trap_Cerror);
+ FSHOW((stderr, "<trap error/cerror %d>\n", trap));
+ interrupt_internal_error(signal, info, context, trap==trap_Cerror);
break;
case trap_Breakpoint:
default:
FSHOW((stderr,"/[C--trap default %d %d %x]\n",
- signal, code, context));
+ signal, trap, context));
interrupt_handle_now(signal, info, context);
break;
}
static void
sigill_handler(int signal, siginfo_t *siginfo, void *void_context) {
os_context_t *context = (os_context_t*)void_context;
+
+#if defined(LISP_FEATURE_DARWIN)
+ if (*((unsigned short *)*os_context_pc_addr(context)) == 0x0b0f) {
+ *os_context_pc_addr(context) += 2;
+ return sigtrap_handler(signal, siginfo, void_context);
+ }
+#endif
+
fake_foreign_function_call(context);
monitor_or_something();
}
* OS I haven't tested on?) and we have to go back to the old CMU
* CL way, I hope there will at least be a comment to explain
* why.. -- WHN 2001-06-07 */
+#ifndef LISP_FEATURE_WIN32
undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler);
undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler);
+#endif
SHOW("returning from arch_install_interrupt_handlers()");
}