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
*(single_stepping-2) = single_step_save2;
*(single_stepping-1) = single_step_save3;
#else
- *context_eflags_addr(context) ^= 0x100;
+ *context_eflags_addr(context) &= ~0x100;
#endif
/* Re-install the breakpoint if possible. */
if (*os_context_pc_addr(context) == (int)single_stepping + 1) {
os_restore_fp_control(context);
#endif
+
+#ifdef LISP_FEATURE_SUNOS
+ /* For some reason the breakpoints that :ENCAPSULATE NIL tracing sets up
+ * cause a trace trap (i.e. processor single-stepping trap) on the following
+ * instruction on Solaris 10/x86. -- JES, 2006-04-07
+ */
+ if (info->si_code == TRAP_TRACE) {
+ lose("foo");
+ return;
+ }
+#endif
+
/* On entry %eip points just after the INT3 byte and aims at the
* 'kind' value (eg trap_Cerror). For error-trap and Cerror-trap a
* 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:
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();
}