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
/*
* hacking signal contexts
return &context->sc_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.
*/
-unsigned long
+unsigned int
arch_install_breakpoint(void *pc)
{
- unsigned long result = *(unsigned long*)pc;
+ unsigned int result = *(unsigned int*)pc;
*(char*)pc = BREAKPOINT_INST; /* x86 INT3 */
*((char*)pc+1) = trap_Breakpoint; /* Lisp trap code */
}
void
-arch_remove_breakpoint(void *pc, unsigned long orig_inst)
+arch_remove_breakpoint(void *pc, unsigned int orig_inst)
{
*((char *)pc) = orig_inst & 0xff;
*((char *)pc + 1) = (orig_inst & 0xff00) >> 8;
*context_eflags_addr(context) |= 0x100;
#endif
- single_stepping = (unsigned int*)pc;
+ single_stepping = pc;
#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG
*os_context_pc_addr(context) = (char *)pc - 9;
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. */
* 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;
}
* 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()");
}