X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=df486eb63ba2a34cbb6aa78405b872843f4f87f8;hb=d442c23da9851beac541b8bddfc2c0837cb87309;hp=3d06aa38a6cc1c27c7c2dc241af0fa7d7db27ee3;hpb=2b0c46508938b606e70cd6f2bb51506d44e45262;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 3d06aa3..df486eb 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -70,7 +70,11 @@ static void freebsd_init(); #include #include #include +#include #include +#ifdef LISP_FEATURE_X86 +#include +#endif static void openbsd_init(); #endif @@ -194,14 +198,13 @@ is_valid_lisp_addr(os_vm_address_t addr) */ void -memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context +memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context #if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) /* FreeBSD/amd64 stores fault address only in undocumented 4th arg. */ ,void *fault_addr #endif ) { - os_context_t *context = arch_os_get_context(&void_context); #if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) /* KLUDGE: Store fault address into si_addr for compatibilities. */ siginfo->si_addr = fault_addr; @@ -218,30 +221,14 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context 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 + if(!handle_guard_page_triggered(context,fault_addr)) lisp_memory_fault_error(context, fault_addr); -#else - - /* this disabled section is what used to be here: */ -#if 0 - /* FIXME: never returns 0 */ - if (!maybe_gc(context)) { - interrupt_handle_now(signal, siginfo, context); - } -#endif - /* FIXME: Nowadays, maybe_gc does return 1 to indicate - * that GC did happen, but I'm keeping the code as it - * was. */ - maybe_gc(context); - interrupt_handle_now(signal, siginfo, context); -#endif - } } #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) void -mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context) { +mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, + os_context_t *context) { lose("Unhandled memory fault. Exiting."); } #endif @@ -271,9 +258,8 @@ os_install_interrupt_handlers(void) #else /* Currently PPC/Darwin/Cheney only */ static void -sigsegv_handler(int signal, siginfo_t *info, void* void_context) +sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); #if 0 unsigned int pc = (unsigned int *)(*os_context_pc_addr(context)); #endif @@ -499,15 +485,40 @@ os_get_runtime_executable_path() #endif #ifdef __OpenBSD__ + +int openbsd_use_fxsave = 0; + void openbsd_init() { +#ifdef LISP_FEATURE_X86 + int mib[2]; + size_t size; +#endif + /* + * Show a warning if it looks like the memory available after + * allocating the spaces won't be at least this much. + */ +#ifdef LISP_FEATURE_X86_64 + const int wantfree = 64 * 1024 * 1024; +#else + const int wantfree = 32 * 1024 * 1024; +#endif struct rlimit rl; +#ifdef LISP_FEATURE_X86 + /* Save the machdep.osfxsr sysctl for use by os_restore_fp_control() */ + mib[0] = CTL_MACHDEP; + mib[1] = CPU_OSFXSR; + size = sizeof (openbsd_use_fxsave); + sysctl(mib, 2, &openbsd_use_fxsave, &size, NULL, 0); +#endif + /* OpenBSD, like NetBSD, counts mmap()ed space against the * process's data size limit. If the soft limit is lower than the * hard limit then try to yank it up, this lets users in the - * "staff" login class run sbcl with a default /etc/login.conf + * "staff" or "daemon" login classes run sbcl with larger dynamic + * space sizes. */ getrlimit (RLIMIT_DATA, &rl); if (rl.rlim_cur < rl.rlim_max) { @@ -521,18 +532,17 @@ The system may fail to start.\n", } } - /* Display a (hopefully) helpful warning if it looks like we won't - * be able to allocate enough memory. In testing I found that on - * my system at least, a minimum of 25M on top of the three space - * sizes was needed to start SBCL. Show a warning below 32M so as - * to leave a little breathing room. + /* + * Display a (hopefully) helpful warning if it looks like we won't + * be able to allocate enough memory. */ getrlimit (RLIMIT_DATA, &rl); if (dynamic_space_size + READ_ONLY_SPACE_SIZE + STATIC_SPACE_SIZE + - LINKAGE_TABLE_SPACE_SIZE + (32*1024*1024) > rl.rlim_cur) + LINKAGE_TABLE_SPACE_SIZE + wantfree > rl.rlim_cur) fprintf (stderr, "RUNTIME WARNING: data size resource limit may be too low,\n" - " try decreasing the dynamic space size with --dynamic-space-size\n"); + " try decreasing the dynamic space size with --dynamic-space-size\n" + " or raising the datasize or datasize-max limits in /etc/login.conf\n"); } /* OpenBSD's dlsym() relies on the gcc bulitin