#include "runtime.h"
#include "alloc.h"
#include "genesis/primitive-objects.h"
+#include "dynbind.h"
#include <sys/types.h>
#include <signal.h>
#include <sys/stat.h>
#include <unistd.h>
-/* KLUDGE: Avoid double definition of boolean by rpcndr.h included via
- * shlobj.h.
- *
- * FIXME: We should probably arrange to use the rpcndr.h boolean on Windows,
- * or get rid of our own boolean type.
- */
-#define boolean rpcndr_boolean
-#include <shlobj.h>
-#undef boolean
-
#include <math.h>
#include <float.h>
return 0;
}
-/*
- * any OS-dependent special low-level handling for signals
- */
-
/* A tiny bit of interrupt.c state we want our paws on. */
extern boolean internal_errors_enabled;
handle_exception(EXCEPTION_RECORD *exception_record,
struct lisp_exception_frame *exception_frame,
CONTEXT *context,
- void *dc) /* FIXME: What's dc again? */
+ void *dispatcher_context)
{
+ if (exception_record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) {
+ /* If we're being unwound, be graceful about it. */
+
+ /* Undo any dynamic bindings. */
+ unbind_to_here(exception_frame->bindstack_pointer,
+ arch_os_get_current_thread());
+
+ return ExceptionContinueSearch;
+ }
+
/* For EXCEPTION_ACCESS_VIOLATION only. */
void *fault_address = (void *)exception_record->ExceptionInformation[1];
}
if (exception_record->ExceptionCode == EXCEPTION_BREAKPOINT) {
- /* Pick off sigtrap case first. */
-
- extern void sigtrap_handler(int signal, siginfo_t *info, void *context);
- /*
- * Unlike some other operating systems, Win32 leaves EIP
- * pointing to the breakpoint instruction.
- */
+ unsigned char trap;
+ /* This is just for info in case the monitor wants to print an
+ * approximation. */
+ current_control_stack_pointer =
+ (lispobj *)*os_context_sp_addr(context);
+ /* Unlike some other operating systems, Win32 leaves EIP
+ * pointing to the breakpoint instruction. */
context->Eip++;
-
- sigtrap_handler(0, NULL, context);
-
+ /* Now EIP points just after the INT3 byte and aims at the
+ * 'kind' value (eg trap_Cerror). */
+ trap = *(unsigned char *)(*os_context_pc_addr(context));
+ handle_trap(context, trap);
+ /* Done, we're good to go! */
return ExceptionContinueExecution;
}
else if (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
_clearfp();
/* Call into lisp to handle things. */
- funcall2(SymbolFunction(HANDLE_WIN32_EXCEPTION), context_sap,
+ funcall2(StaticSymbolFunction(HANDLE_WIN32_EXCEPTION), context_sap,
exception_record_sap);
/* If Lisp doesn't nlx, we need to put things back. */
fflush(stderr);
fake_foreign_function_call(context);
- lose("fake_foreign_function_call fell through");
+ lose("Exception too early in cold init, cannot continue.");
/* FIXME: WTF? How are we supposed to end up here? */
return ExceptionContinueSearch;