X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=a364d5a0b0ef5f69e5d441df7961b8b17e559da2;hb=9b1fade83db8453b75b8c7380eb12ce41b5b889c;hp=f1697200f9f7655728f229ad726dd97eb255dae7;hpb=02d7495253b9075e4d86275590c3e827c814b596;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index f169720..a364d5a 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 } @@ -464,7 +475,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() { @@ -477,10 +488,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