X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=a1acc1e83168279916c9a279611f66ce31dae585;hb=64eccd1724e5f1e638bfc574f7f376427ee3dcb1;hp=c31ea5de15eb2dc0550f37cad0077e55a4627022;hpb=b9be3a45c0f503a0f26aa332f59d846e6e24e97a;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index c31ea5d..a1acc1e 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -66,6 +66,15 @@ static void netbsd_init(); static void freebsd_init(); #endif /* __FreeBSD__ */ +#ifdef __OpenBSD__ +#include +#include +#include +#include + +static void openbsd_init(); +#endif + void os_init(char *argv[], char *envp[]) { @@ -75,6 +84,8 @@ os_init(char *argv[], char *envp[]) netbsd_init(); #elif defined(__FreeBSD__) freebsd_init(); +#elif defined(__OpenBSD__) + openbsd_init(); #endif } @@ -207,19 +218,8 @@ 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 - if (!maybe_gc(context)) { - interrupt_handle_now(signal, siginfo, context); - } -#if defined(LISP_FEATURE_DARWIN) - /* Work around G5 bug; fix courtesy gbyers */ - DARWIN_FIX_CONTEXT(context); -#endif -#endif - } } #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) @@ -245,14 +245,8 @@ os_install_interrupt_handlers(void) #endif #ifdef LISP_FEATURE_SB_THREAD - undoably_install_low_level_interrupt_handler(SIG_INTERRUPT_THREAD, - interrupt_thread_handler); undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); -#ifdef SIG_RESUME_FROM_GC - undoably_install_low_level_interrupt_handler(SIG_RESUME_FROM_GC, - sig_stop_for_gc_handler); -#endif #endif SHOW("leaving os_install_interrupt_handlers()"); } @@ -272,8 +266,6 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) if (!cheneygc_handle_wp_violation(context, addr)) if (!handle_guard_page_triggered(context, addr)) interrupt_handle_now(signal, info, context); - /* Work around G5 bug; fix courtesy gbyers */ - DARWIN_FIX_CONTEXT(context); } void @@ -405,7 +397,6 @@ 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 { @@ -420,8 +411,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; @@ -470,7 +460,7 @@ os_get_runtime_executable_path() return NULL; return copied_string(path); } -#elif defined(LISP_FEATURE_NETBSD) +#elif defined(LISP_FEATURE_NETBSD) || defined(LISP_FEATURE_OPENBSD) char * os_get_runtime_executable_path() { @@ -483,10 +473,64 @@ os_get_runtime_executable_path() return NULL; } } -#else /* Not DARWIN or FREEBSD or NETBSD */ +#else /* Not DARWIN or FREEBSD or NETBSD or OPENBSD */ char * os_get_runtime_executable_path() { return NULL; } #endif + +#ifdef __OpenBSD__ +void +openbsd_init() +{ + struct rlimit rl; + + /* 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 + */ + getrlimit (RLIMIT_DATA, &rl); + if (rl.rlim_cur < rl.rlim_max) { + rl.rlim_cur = rl.rlim_max; + 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)); + } + } + + /* 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. + */ + 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) + fprintf (stderr, + "RUNTIME WARNING: data size resource limit may be too low,\n" + " try decreasing the dynamic space size with --dynamic-space-size\n"); +} + +/* OpenBSD's dlsym() relies on the gcc bulitin + * __builtin_return_address(0) returning an address in the + * executable's text segment, but when called from lisp it will return + * an address in the dynamic space. Work around this by calling this + * wrapper function instead. Note that tail-call optimization will + * defeat this, disable it by saving the dlsym() return value in a + * volatile variable. +*/ +void * +os_dlsym(void *handle, const char *symbol) +{ + void * volatile ret = dlsym(handle, symbol); + return ret; +} + +#endif