From: Richard M K. <kr...@us...> - 2008-01-09 19:12:30
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv27801/src/runtime Modified Files: Config.x86-openbsd bsd-os.c bsd-os.h Log Message: 1.0.13.18: Revived OpenBSD support, contributed by Josh Elsasser Index: Config.x86-openbsd =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Config.x86-openbsd,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Config.x86-openbsd 26 Sep 2007 11:30:51 -0000 1.3 +++ Config.x86-openbsd 9 Jan 2008 19:12:23 -0000 1.4 @@ -11,13 +11,18 @@ include Config.x86-bsd -OS_SRC += undefineds.c +ASSEM_SRC += ldso-stubs.S +OS_LIBS += -lutil -# KLUDGE: It might seem as though dynamic libraries should work the -# same way on both systems, but in fact gcc supports the "-export-dynamic" -# option on FreeBSD but not on OpenBSD. The documentation I've been -# able to find doesn't seem to begin to explain what's going on (e.g. I -# have never found documentation for the "-export-dynamic" option), -# so I've just punted and left link flags for OpenBSD in their -# pre-dynamic-library-support state. -- WHN 2000-10-02 -LINKFLAGS += -static +# The -Z linker flag conflicts with the default address space +# locations used. If you wish to link the runtime using -Z option then +# please see the comments in src/compiler/x86/parms.lisp + +# XXX why do all the other Configs set LINKFLAGS instead of LDFLAGS? +# LINKFLAGS is only used in src/runtime/GNUmakefile, this causes the +# dladdr test in tools-for-build/ to fail. + +LINKFLAGS += -export-dynamic +LDFLAGS += -export-dynamic + +CFLAGS = -g -Wall -O2 Index: bsd-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- bsd-os.c 2 Dec 2007 17:00:15 -0000 1.52 +++ bsd-os.c 9 Jan 2008 19:12:23 -0000 1.53 @@ -66,6 +66,15 @@ static void freebsd_init(); #endif /* __FreeBSD__ */ +#ifdef __OpenBSD__ +#include <sys/types.h> +#include <sys/resource.h> +#include <sys/stat.h> +#include <dlfcn.h> + +static void openbsd_init(); +#endif + void os_init(char *argv[], char *envp[]) { @@ -75,6 +84,8 @@ netbsd_init(); #elif defined(__FreeBSD__) freebsd_init(); +#elif defined(__OpenBSD__) + openbsd_init(); #endif } @@ -464,7 +475,7 @@ 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 @@ 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 Index: bsd-os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- bsd-os.h 26 Sep 2007 11:42:32 -0000 1.21 +++ bsd-os.h 9 Jan 2008 19:12:23 -0000 1.22 @@ -32,14 +32,6 @@ typedef off_t os_vm_offset_t; typedef int os_vm_prot_t; -#if defined __OpenBSD__ -/* name defined for compatibility between OpenBSD 3.1 sigaltstack(2) and - * Linux sigaltstack(2) */ -typedef struct sigaltstack stack_t; -#elif defined __FreeBSD__ -/* FreeBSD 4.6 and NetBSD 1.6 already have stack_t defined. */ -#endif - #if defined __FreeBSD__ /* Note: The man page for sigaction(2) in FreeBSD 4.0 says that this * is an mcontext_t, but according to comments by Raymond Wiker in the |