+ if (!gencgc_handle_wp_violation(fault_addr))
+ if(!handle_control_stack_guard_triggered(context,fault_addr))
+ interrupt_handle_now(signal, info, void_context);
+}
+
+#else
+
+static void
+sigsegv_handler(int signal, siginfo_t *info, void* void_context)
+{
+ os_context_t *context = arch_os_get_context(&void_context);
+ os_vm_address_t addr;
+
+ addr = arch_get_bad_addr(signal,info,context);
+ if (addr != NULL &&
+ *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){
+
+ /* Alpha stuff: This is the end of a pseudo-atomic section
+ * during which a signal was received. We must deal with the
+ * pending interrupt (see also interrupt.c,
+ * ../code/interrupt.lisp)
+ */
+ /* (how we got here: when interrupting, we set bit 63 in
+ * reg_Alloc. At the end of the atomic section we tried to
+ * write to reg_ALLOC, got a SIGSEGV (there's nothing mapped
+ * there) so ended up here
+ */
+ *os_context_register_addr(context,reg_ALLOC) -= (1L<<63);
+ interrupt_handle_pending(context);
+ } else {
+ if(!interrupt_maybe_gc(signal, info, context))
+ if(!handle_control_stack_guard_triggered(context,addr))
+ interrupt_handle_now(signal, info, context);