return addr;
}
+/* FIXME: If this can be a no-op on BSD/x86, then it
+ * deserves a more precise name.
+ *
+ * (Perhaps os_prepare_data_area_to_be_executed()?) */
void
os_flush_icache(os_vm_address_t address, os_vm_size_t length)
{
#else
#error unsupported BSD variant
#endif
- if (!gencgc_handle_wp_violation(fault_addr)) {
- interrupt_handle_now(signal, siginfo, void_context);
- }
+ os_context_t *context = arch_os_get_context(&void_context);
+ if (!gencgc_handle_wp_violation(fault_addr))
+ if(!handle_control_stack_guard_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);
}
void
os_install_interrupt_handlers(void)
{
SHOW("os_install_interrupt_handlers()/bsd-os/defined(GENCGC)");
- SHOW("**1"); /* REMOVEME */
-#if defined __FreeBSD__
- SHOW("**2"); /* REMOVEME */
- SHOW("__FreeBSD__ case");
- interrupt_install_low_level_handler(SIGBUS, memory_fault_handler);
-#elif defined __OpenBSD__
- SHOW("**3"); /* REMOVEME */
- FSHOW((stderr, "/__OpenBSD__ case, SIGSEGV=%d\n", SIGSEGV));
- interrupt_install_low_level_handler(SIGSEGV, memory_fault_handler);
-#else
-#error unsupported BSD variant
-#endif
- SHOW("**4"); /* REMOVEME */
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
+ memory_fault_handler);
SHOW("leaving os_install_interrupt_handlers()");
}