#include "interr.h"
#include "lispregs.h"
#include "thread.h"
+#include "runtime.h"
+#include "genesis/static-symbols.h"
+#include "genesis/fdefn.h"
#include <sys/types.h>
#include <signal.h>
/* #include <sys/sysinfo.h> */
#include "validate.h"
-
\f
os_vm_size_t os_vm_page_size;
#ifdef __NetBSD__
#include <sys/resource.h>
+#include <sys/sysctl.h>
#include <string.h>
static void netbsd_init();
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);
+ if(!handle_guard_page_triggered(context,fault_addr))
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+ arrange_return_to_lisp_function(context, SymbolFunction(MEMORY_FAULT_ERROR));
+#else
+ interrupt_handle_now(signal, siginfo, context);
+#endif
}
void
os_install_interrupt_handlers(void)
addr = arch_get_bad_addr(signal,info,context);
if(!interrupt_maybe_gc(signal, info, context))
- if(!handle_control_stack_guard_triggered(context,addr))
+ if(!handle_guard_page_triggered(context,addr))
interrupt_handle_now(signal, info, context);
/* Work around G5 bug; fix courtesy gbyers */
- sigreturn(void_context);
+ DARWIN_FIX_CONTEXT(context);
}
void
#ifdef __NetBSD__
static void netbsd_init()
{
- struct rlimit rl;
+ struct rlimit rl;
+ int mib[2], osrev;
+ size_t len;
+
+ /* Are we running on a sufficiently functional kernel? */
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_OSREV;
- /* NetBSD counts mmap()ed space against the process's data size limit,
- * so yank it up. This might be a nasty thing to do? */
- getrlimit (RLIMIT_DATA, &rl);
- rl.rlim_cur = 1073741824;
- if (setrlimit (RLIMIT_DATA, &rl) < 0) {
- fprintf (stderr, "RUNTIME WARNING: unable to raise process data size limit to 1GB (%s). The system may fail to start.\n",
- strerror(errno));
- }
+ len = sizeof(osrev);
+ sysctl(mib, 2, &osrev, &len, NULL, 0);
+
+ /* If we're older than 2.0... */
+ if (osrev < 200000000) {
+ fprintf(stderr, "osrev = %d (needed at least 200000000).\n", osrev);
+ lose("NetBSD kernel too old to run sbcl.\n");
+ }
+
+ /* NetBSD counts mmap()ed space against the process's data size limit,
+ * so yank it up. This might be a nasty thing to do? */
+ getrlimit (RLIMIT_DATA, &rl);
+ /* Amazingly for such a new port, the provenance and meaning of
+ this number are unknown. It might just mean REALLY_BIG_LIMIT,
+ or possibly it should be calculated from dynamic space size.
+ -- CSR, 2004-04-08 */
+ rl.rlim_cur = 1073741824;
+ if (setrlimit (RLIMIT_DATA, &rl) < 0) {
+ fprintf (stderr,
+ "RUNTIME WARNING: unable to raise process data size limit:\n\
+ %s.\n\
+The system may fail to start.\n",
+ strerror(errno));
+ }
}
#endif /* __NetBSD__ */
\f