#include "interrupt.h"
#include "interr.h"
#include "breakpoint.h"
-#include "monitor.h"
#include "thread.h"
#include "genesis/static-symbols.h"
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
boolean
arch_pseudo_atomic_atomic(os_context_t *context)
{
- return SymbolValue(PSEUDO_ATOMIC_ATOMIC,arch_os_get_current_thread());
+ return get_pseudo_atomic_atomic(arch_os_get_current_thread());
}
void
arch_set_pseudo_atomic_interrupted(os_context_t *context)
{
- SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1),
- arch_os_get_current_thread());
+ struct thread *thread = arch_os_get_current_thread();
+ set_pseudo_atomic_interrupted(thread);
}
void
arch_clear_pseudo_atomic_interrupted(os_context_t *context)
{
- SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),
- arch_os_get_current_thread());
+ struct thread *thread = arch_os_get_current_thread();
+ clear_pseudo_atomic_interrupted(thread);
}
\f
/*
*(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) {
single-stepping (as far as I can tell) this is somewhat moot,
but it might be worth either moving this code up or deleting
the single-stepping code entirely. -- CSR, 2002-07-15 */
-#ifdef LISP_FEATURE_LINUX
+#if defined(LISP_FEATURE_LINUX) || defined(RESTORE_FP_CONTROL_FROM_CONTEXT)
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;
+
+ /* Triggering SIGTRAP using int3 is unreliable on OS X/x86, so
+ * we need to use illegal instructions for traps.
+ */
+#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();
+ lose("fake_foreign_call fell through");
}
void