X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=3b883796e07076d2e5652f5ace295b4b02e612c0;hb=95591ed483dbb8c0846c129953acac1554f28809;hp=794e98a0b763c9e4343700469c2c602474ec90b8;hpb=ae09f8fd7765f6cab6ad317a13e27ff22ab0c11e;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 794e98a..3b88379 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,20 +198,9 @@ is_valid_lisp_addr(os_vm_address_t addr) */ void -memory_fault_handler(int signal, siginfo_t *siginfo, void *void_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 - ) +memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context) { - 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; -#else void *fault_addr = arch_get_bad_addr(signal, siginfo, context); -#endif #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT) FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in memory_fault_handler\n", @@ -218,30 +211,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 +248,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 @@ -407,14 +383,14 @@ static void freebsd_init() #endif /* LISP_FEATURE_X86 */ } -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) \ + && !defined(LISP_FEATURE_SB_LUTEX) int futex_wait(int *lock_word, long oldval, long sec, unsigned long usec) { struct timespec timeout; int ret; -again: if (sec < 0) ret = umtx_wait((void *)lock_word, oldval, NULL); else { @@ -429,8 +405,7 @@ again: case ETIMEDOUT: return 1; case EINTR: - /* spurious wakeup from interrupt */ - goto again; + return 2; default: /* EWOULDBLOCK and others, need to check the lock */ return -1; @@ -501,15 +476,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) { @@ -523,18 +523,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