- os_context_t *context = arch_os_get_context(&void_context);
- if (!gencgc_handle_wp_violation(fault_addr))
- if(!handle_guard_page_triggered(context,fault_addr))
- /* FIXME is this context or void_context? not that it */
- /* makes a difference currently except on linux/sparc */
- interrupt_handle_now(signal, siginfo, void_context);
+#if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
+ FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in memory_fault_handler\n",
+ *CONTEXT_ADDR_FROM_STEM(fs)));
+ os_restore_tls_segment_register(context);
+#endif
+
+ FSHOW((stderr, "Memory fault at: %p, PC: %p\n", fault_addr, *os_context_pc_addr(context)));
+
+ if (!gencgc_handle_wp_violation(fault_addr))
+ if(!handle_guard_page_triggered(context,fault_addr)) {
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+ lisp_memory_fault_error(context, fault_addr);
+#else
+ if (!maybe_gc(context)) {
+ interrupt_handle_now(signal, siginfo, context);
+ }
+#if defined(LISP_FEATURE_DARWIN)
+ /* Work around G5 bug; fix courtesy gbyers */
+ DARWIN_FIX_CONTEXT(context);
+#endif
+#endif
+ }
+}
+
+#if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER)
+void
+mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context) {
+ lose("Unhandled memory fault. Exiting.");