Skip to content

Commit

Permalink
1.0.13.18: Revived OpenBSD support, contributed by Josh Elsasser
Browse files Browse the repository at this point in the history
  • Loading branch information
Richard M Kreuter committed Jan 9, 2008
1 parent df57e28 commit c2ac5ba
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 35 deletions.
5 changes: 3 additions & 2 deletions make-config.sh
Expand Up @@ -284,9 +284,10 @@ if [ "$sbcl_arch" = "x86" ]; then
printf ' :gencgc :stack-grows-downward-not-upward :c-stack-is-control-stack' >> $ltf
printf ' :compare-and-swap-vops :unwind-to-frame-and-call-vop' >> $ltf
printf ' :stack-allocatable-closures :alien-callbacks' >> $ltf
if [ "$sbcl_os" = "linux" ] || [ "$sbcl_os" = "freebsd" ] || [ "$sbcl_os" = "netbsd" ] || [ "$sbcl_os" = "sunos" ] || [ "$sbcl_os" = "darwin" ] || [ "$sbcl_os" = "win32" ]; then
case "$sbcl_os" in
linux | freebsd | netbsd | openbsd | sunos | darwin | win32)
printf ' :linkage-table' >> $ltf
fi
esac
if [ "$sbcl_os" = "win32" ]; then
# of course it doesn't provide dlopen, but there is
# roughly-equivalent magic nevertheless.
Expand Down
5 changes: 4 additions & 1 deletion src/code/foreign-load.lisp
Expand Up @@ -33,7 +33,10 @@

(define-alien-routine dlerror c-string)

(define-alien-routine dlsym system-area-pointer
(define-alien-routine
#!-openbsd dlsym
#!+openbsd ("os_dlsym" dlsym)
system-area-pointer
(handle system-area-pointer)
(symbol c-string))

Expand Down
17 changes: 16 additions & 1 deletion src/code/run-program.lisp
Expand Up @@ -390,7 +390,7 @@ status slot."
;;; Find an unused pty. Return three values: the file descriptor for
;;; the master side of the pty, the file descriptor for the slave side
;;; of the pty, and the name of the tty device for the slave side.
#-win32
#-(or win32 openbsd)
(progn
(define-alien-routine ptsname c-string (fd int))
(define-alien-routine grantpt boolean (fd int))
Expand Down Expand Up @@ -437,6 +437,21 @@ status slot."
slave-name)))
(sb-unix:unix-close master-fd))))))
(error "could not find a pty")))
#+openbsd
(progn
(define-alien-routine openpty int (amaster int :out) (aslave int :out)
(name (* char)) (termp (* t)) (winp (* t)))
(defun find-a-pty ()
(with-alien ((name-buf (array char 16)))
(multiple-value-bind (return-val master-fd slave-fd)
(openpty (cast name-buf (* char)) nil nil)
(if (zerop return-val)
(values master-fd
slave-fd
(sb-alien::c-string-to-string (alien-sap name-buf)
(sb-impl::default-external-format)
'character))
(error "could not find a pty"))))))

#-win32
(defun open-pty (pty cookie)
Expand Down
22 changes: 14 additions & 8 deletions src/compiler/x86/parms.lisp
Expand Up @@ -159,6 +159,12 @@
;;; And if KVA_PAGES is extended from 1GB to 1.5GB, we can't use
;;; down to around 0xA0000000.
;;; So we use 0x58000000--0x98000000 for dynamic space.
;;; * OpenBSD address space changes for W^X as well as malloc
;;; randomization made the old addresses unsafe. The only range
;;; that is really safe is between the end of the text segment (it
;;; starts at #x3C000000) and #x7C000000. However if the -Z linker
;;; option is used then the safe range is (probably) #x00001000 to
;;; #x48048000, with the text and data segments at #x08048000.

#!+win32
(progn
Expand Down Expand Up @@ -219,18 +225,18 @@

#!+openbsd
(progn
(def!constant read-only-space-start #x10000000)
(def!constant read-only-space-end #x100ff000)
(def!constant read-only-space-start #x7b000000)
(def!constant read-only-space-end #x7b0ff000)

(def!constant static-space-start #x10100000)
(def!constant static-space-end #x101ff000)
(def!constant static-space-start #x7b100000)
(def!constant static-space-end #x7b1ff000)

(def!constant dynamic-space-start #x80000000)
(def!constant dynamic-space-end #xA0000000)
(def!constant dynamic-space-start #x4c000000)
(def!constant dynamic-space-end #x7b0ff000)

;; In CMUCL: 0xB0000000->0xB1000000
(def!constant linkage-table-space-start #x10200000)
(def!constant linkage-table-space-end #x102ff000))
(def!constant linkage-table-space-start #x7b200000)
(def!constant linkage-table-space-end #x7b2ff000))

#!+netbsd
(progn
Expand Down
23 changes: 14 additions & 9 deletions src/runtime/Config.x86-openbsd
Expand Up @@ -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
69 changes: 67 additions & 2 deletions src/runtime/bsd-os.c
Expand Up @@ -66,6 +66,15 @@ static void netbsd_init();
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[])
{
Expand All @@ -75,6 +84,8 @@ os_init(char *argv[], char *envp[])
netbsd_init();
#elif defined(__FreeBSD__)
freebsd_init();
#elif defined(__OpenBSD__)
openbsd_init();
#endif
}

Expand Down Expand Up @@ -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()
{
Expand All @@ -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
8 changes: 0 additions & 8 deletions src/runtime/bsd-os.h
Expand Up @@ -32,14 +32,6 @@ typedef vm_size_t os_vm_size_t;
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
Expand Down
4 changes: 2 additions & 2 deletions tests/float.pure.lisp
Expand Up @@ -93,7 +93,7 @@
(assert (= 0.0d0 (scale-float 1.0d0 (1- most-negative-fixnum))))

(with-test (:name (:scale-float-overflow :bug-372)
:fails-on '(or :ppc :darwin)) ;; bug 372
:fails-on '(or :ppc :darwin (and :x86 :openbsd))) ;; bug 372
(progn
(assert (raises-error? (scale-float 1.0 most-positive-fixnum)
floating-point-overflow))
Expand Down Expand Up @@ -125,7 +125,7 @@
(funcall (compile nil '(lambda () (tan (tan (round 0))))))

(with-test (:name (:addition-overflow :bug-372)
:fails-on '(or :ppc :darwin (and :x86 :netbsd)))
:fails-on '(or :ppc :darwin (and :x86 (or :netbsd :openbsd))))
(assert (typep (nth-value
1
(ignore-errors
Expand Down
4 changes: 3 additions & 1 deletion tools-for-build/ldso-stubs.lisp
Expand Up @@ -299,10 +299,12 @@ ldso_stub__ ## fct: ; \\
;; #!-linkage-table, as we only need these stubs if
;; we don't have linkage-table. Done this way now to
;; cut down on the number of ports affected.
#!-(or win32 darwin freebsd netbsd)
#!-(or win32 darwin freebsd netbsd openbsd)
'("ptsname"
"grantpt"
"unlockpt")
#!+openbsd
'("openpty")
#!-darwin
'("dlclose"
"dlerror"
Expand Down
2 changes: 1 addition & 1 deletion version.lisp-expr
Expand Up @@ -17,4 +17,4 @@
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
"1.0.13.17"
"1.0.13.18"

0 comments on commit c2ac5ba

Please sign in to comment.