Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/TODO b/TODO
- index 6c8d83b..d60252c 100644
- --- a/TODO
- +++ b/TODO
- @@ -104,6 +104,9 @@ DARWIN
- Needs love, particularly threads and exceptions/signals. slam.sh is
- also broken there.
- +DRAGONFLY
- + Fix multithreading support on x86-64, add it on x86.
- +
- FUNCTION NAMES
- We'd like to be able to (SETF %FUNCTION-NAME) on a closure.
- diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr
- index 74bf083..c262c1c 100644
- --- a/base-target-features.lisp-expr
- +++ b/base-target-features.lisp-expr
- @@ -434,23 +434,24 @@
- ;; implemented for this platform.
- ;;
- ;; operating system features:
- - ;; :unix = We're intended to run under some Unix-like OS. (This is not
- - ;; exclusive with the features which indicate which particular
- - ;; Unix-like OS we're intended to run under.)
- - ;; :linux = We're intended to run under some version of Linux.
- - ;; :bsd = We're intended to run under some version of BSD Unix. (This
- - ;; is not exclusive with the features which indicate which
- - ;; particular version of BSD we're intended to run under.)
- - ;; :freebsd = We're intended to run under FreeBSD.
- - ;; :openbsd = We're intended to run under OpenBSD.
- - ;; :netbsd = We're intended to run under NetBSD.
- - ;; :darwin = We're intended to run under Darwin (including MacOS X).
- - ;; :sunos = We're intended to run under Solaris user environment
- - ;; with the SunOS kernel.
- - ;; :hpux = We're intended to run under HP-UX 11.11 or later
- - ;; :osf1 = We're intended to run under Tru64 (aka Digital Unix
- - ;; aka OSF/1).
- - ;; :win32 = We're intended to under some version of Microsoft Windows.
- + ;; :unix = We're intended to run under some Unix-like OS. (This is not
- + ;; exclusive with the features which indicate which particular
- + ;; Unix-like OS we're intended to run under.)
- + ;; :linux = We're intended to run under some version of Linux.
- + ;; :bsd = We're intended to run under some version of BSD Unix. (This
- + ;; is not exclusive with the features which indicate which
- + ;; particular version of BSD we're intended to run under.)
- + ;; :freebsd = We're intended to run under FreeBSD.
- + ;; :openbsd = We're intended to run under OpenBSD.
- + ;; :netbsd = We're intended to run under NetBSD.
- + ;; :dragonfly = We're intended to run under DragonFly.
- + ;; :darwin = We're intended to run under Darwin (including MacOS X).
- + ;; :sunos = We're intended to run under Solaris user environment
- + ;; with the SunOS kernel.
- + ;; :hpux = We're intended to run under HP-UX 11.11 or later
- + ;; :osf1 = We're intended to run under Tru64 (aka Digital Unix
- + ;; aka OSF/1).
- + ;; :win32 = We're intended to under some version of Microsoft Windows.
- ;; (No others are supported by SBCL as of 1.0.8, but :hpux or :irix
- ;; support could be ported from CMU CL if anyone is sufficiently
- ;; motivated to do so.)
- diff --git a/contrib/asdf/asdf.lisp b/contrib/asdf/asdf.lisp
- index ce7a1db..6274595 100644
- --- a/contrib/asdf/asdf.lisp
- +++ b/contrib/asdf/asdf.lisp
- @@ -3237,7 +3237,7 @@ located."
- '(:cygwin (:win :windows :mswindows :win32 :mingw32) ;; try cygwin first!
- (:linux :linux :linux-target) ;; for GCL at least, must appear before :bsd
- (:macosx :macosx :darwin :darwin-target :apple) ; also before :bsd
- - (:solaris :solaris :sunos) (:bsd :bsd :freebsd :netbsd :openbsd) :unix
- + (:solaris :solaris :sunos) (:bsd :bsd :freebsd :dragonfly :netbsd :openbsd) :unix
- :genera)))
- (defun architecture ()
- diff --git a/contrib/sb-bsd-sockets/constants.lisp b/contrib/sb-bsd-sockets/constants.lisp
- index eeabd11..b874b17 100644
- --- a/contrib/sb-bsd-sockets/constants.lisp
- +++ b/contrib/sb-bsd-sockets/constants.lisp
- @@ -316,7 +316,7 @@
- (:integer EAI-BADFLAGS "EAI_BADFLAGS")
- (:integer EAI-NONAME "EAI_NONAME")
- (:integer EAI-SERVICE "EAI_SERVICE")
- - #-freebsd
- + #-(or freebsd dragonfly)
- (:integer EAI-ADDRFAMILY "EAI_ADDRFAMILY")
- (:integer EAI-MEMORY "EAI_MEMORY")
- (:integer EAI-FAIL "EAI_FAIL")
- diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp
- index 776878c..f9e8c1b 100644
- --- a/contrib/sb-bsd-sockets/tests.lisp
- +++ b/contrib/sb-bsd-sockets/tests.lisp
- @@ -30,6 +30,7 @@
- ;;; Apparently getprotobyname_r on FreeBSD says -1 and EINTR
- ;;; for unknown protocols...
- #-(and freebsd sb-thread)
- +#-(and dragonfly sb-thread)
- (deftest get-protocol-by-name/error
- (handler-case (get-protocol-by-name "nonexistent-protocol")
- (unknown-protocol ()
- diff --git a/make-config.sh b/make-config.sh
- index 6b720e0..04a2dda 100644
- --- a/make-config.sh
- +++ b/make-config.sh
- @@ -277,6 +277,9 @@ case `uname` in
- ;;
- esac
- ;;
- + DragonFly)
- + sbcl_os="dragonfly"
- + ;;
- Darwin)
- sbcl_os="darwin"
- ;;
- @@ -385,7 +388,8 @@ then
- # If --fancy, enable threads on platforms where they can be built.
- case $sbcl_arch in
- x86|x86-64|ppc)
- - if [ "$sbcl_os" = "sunos" ] && [ "$sbcl_arch" = "x86-64" ]
- + if ([ "$sbcl_os" = "sunos" ] && [ "$sbcl_arch" = "x86-64" ]) || \
- + ([ "$sbcl_os" = "dragonfly" ] && [ "$sbcl_arch" = "x86" ])
- then
- echo "No threads on this platform."
- else
- @@ -502,6 +506,16 @@ case "$sbcl_os" in
- ;;
- esac
- ;;
- + dragonfly)
- + printf ' :unix' >> $ltf
- + printf ' :bsd' >> $ltf
- + printf ' :elf' >> $ltf
- + printf ' :dragonfly' >> $ltf
- + printf ' :sb-qshow' >> $ltf
- + link_or_copy $sbcl_arch-bsd-os.h target-arch-os.h
- + link_or_copy bsd-os.h target-os.h
- + link_or_copy Config.$sbcl_arch-dragonfly Config
- + ;;
- darwin)
- printf ' :unix' >> $ltf
- printf ' :mach-o' >> $ltf
- @@ -587,7 +601,7 @@ if [ "$sbcl_arch" = "x86" ]; then
- printf ' :alien-callbacks :cycle-counter :inline-constants ' >> $ltf
- printf ' :memory-barrier-vops :multiply-high-vops' >> $ltf
- case "$sbcl_os" in
- - linux | freebsd | netbsd | openbsd | sunos | darwin | win32)
- + linux | freebsd | netbsd | openbsd | sunos | darwin | win32 | dragonfly)
- printf ' :linkage-table' >> $ltf
- esac
- if [ "$sbcl_os" = "win32" ]; then
- diff --git a/src/code/unix.lisp b/src/code/unix.lisp
- index 9572a22..de330ae 100644
- --- a/src/code/unix.lisp
- +++ b/src/code/unix.lisp
- @@ -414,14 +414,14 @@ corresponds to NAME, or NIL if there is none."
- ;; comma not inside a backquote. This error has absolutely nothing
- ;; to do with the actual meaning of the error (and little to do with
- ;; its location, either).
- - #!-(or linux openbsd freebsd netbsd sunos osf1 darwin hpux win32) (,stub,)
- - #!+(or linux openbsd freebsd netbsd sunos osf1 darwin hpux win32)
- + #!-(or linux openbsd freebsd netbsd sunos osf1 darwin hpux win32 dragonfly) (,stub,)
- + #!+(or linux openbsd freebsd netbsd sunos osf1 darwin hpux win32 dragonfly)
- (or (newcharstar-string (alien-funcall (extern-alien "getcwd"
- (function (* char)
- (* char)
- size-t))
- nil
- - #!+(or linux openbsd freebsd netbsd darwin win32) 0
- + #!+(or linux openbsd freebsd netbsd dragonfly darwin win32) 0
- #!+(or sunos osf1 hpux) 1025))
- (simple-perror "getcwd")))
- diff --git a/src/compiler/x86/parms.lisp b/src/compiler/x86/parms.lisp
- index 5502afd..163ffd7 100644
- --- a/src/compiler/x86/parms.lisp
- +++ b/src/compiler/x86/parms.lisp
- @@ -187,13 +187,14 @@
- ;;; NetBSD configuration used to have this comment regarding the linkage
- ;;; table: "In CMUCL: 0xB0000000->0xB1000000"
- -#!+win32 (!gencgc-space-setup #x22000000 nil nil #x10000)
- -#!+linux (!gencgc-space-setup #x01000000 #x09000000)
- -#!+sunos (!gencgc-space-setup #x20000000 #x48000000)
- -#!+freebsd (!gencgc-space-setup #x01000000 #x58000000)
- -#!+openbsd (!gencgc-space-setup #x1b000000 #x40000000)
- -#!+netbsd (!gencgc-space-setup #x20000000 #x60000000)
- -#!+darwin (!gencgc-space-setup #x04000000 #x10000000)
- +#!+win32 (!gencgc-space-setup #x22000000 nil nil #x10000)
- +#!+linux (!gencgc-space-setup #x01000000 #x09000000)
- +#!+sunos (!gencgc-space-setup #x20000000 #x48000000)
- +#!+freebsd (!gencgc-space-setup #x01000000 #x58000000)
- +#!+dragonfly (!gencgc-space-setup #x01000000 #x58000000)
- +#!+openbsd (!gencgc-space-setup #x1b000000 #x40000000)
- +#!+netbsd (!gencgc-space-setup #x20000000 #x60000000)
- +#!+darwin (!gencgc-space-setup #x04000000 #x10000000)
- ;;; Size of one linkage-table entry in bytes.
- (def!constant linkage-table-entry-size 8)
- diff --git a/src/runtime/Config.x86-64-dragonfly b/src/runtime/Config.x86-64-dragonfly
- new file mode 100644
- index 0000000..f00b739
- --- /dev/null
- +++ b/src/runtime/Config.x86-64-dragonfly
- @@ -0,0 +1,26 @@
- +# -*- makefile -*- for the C-level run-time support for SBCL
- +
- +# This software is part of the SBCL system. See the README file for
- +# more information.
- +#
- +# This software is derived from the CMU CL system, which was
- +# written at Carnegie Mellon University and released into the
- +# public domain. The software is in the public domain and is
- +# provided with absolutely no warranty. See the COPYING and CREDITS
- +# files for more information.
- +
- +include Config.x86-64-bsd
- +
- +ASSEM_SRC += ldso-stubs.S
- +
- +# Until sbcl-0.6.7.3, we used "LINKFLAGS+=-static" here, which
- +# worked fine for most things, but LOAD-FOREIGN & friends require
- +# dlopen() etc., which in turn depend on dynamic linking of the
- +# runtime.
- +LINKFLAGS += -dynamic -export-dynamic
- +
- +# use 1:1 threading.
- +# FIXME: DragonFly's lpthread must be what we need.
- +ifdef LISP_FEATURE_SB_THREAD
- + OS_LIBS += -lpthread
- +endif
- diff --git a/src/runtime/Config.x86-dragonfly b/src/runtime/Config.x86-dragonfly
- new file mode 100644
- index 0000000..ab834fb
- --- /dev/null
- +++ b/src/runtime/Config.x86-dragonfly
- @@ -0,0 +1,26 @@
- +# -*- makefile -*- for the C-level run-time support for SBCL
- +
- +# This software is part of the SBCL system. See the README file for
- +# more information.
- +#
- +# This software is derived from the CMU CL system, which was
- +# written at Carnegie Mellon University and released into the
- +# public domain. The software is in the public domain and is
- +# provided with absolutely no warranty. See the COPYING and CREDITS
- +# files for more information.
- +
- +include Config.x86-bsd
- +
- +ASSEM_SRC += ldso-stubs.S
- +
- +# Until sbcl-0.6.7.3, we used "LINKFLAGS+=-static" here, which
- +# worked fine for most things, but LOAD-FOREIGN & friends require
- +# dlopen() etc., which in turn depend on dynamic linking of the
- +# runtime.
- +LINKFLAGS += -dynamic -export-dynamic
- +
- +ifdef LISP_FEATURE_SB_THREAD
- + OS_LIBS += -lpthread
- +endif
- +
- +CFLAGS += -fno-omit-frame-pointer
- diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c
- index 4c08b97..d308d9b 100644
- --- a/src/runtime/bsd-os.c
- +++ b/src/runtime/bsd-os.c
- @@ -72,6 +72,12 @@ static void netbsd_init();
- static void freebsd_init();
- #endif /* __FreeBSD__ */
- +#ifdef __DragonFly__
- +#include <sys/sysctl.h>
- +
- +static void dragonfly_init();
- +#endif /* __DragonFly__ */
- +
- #ifdef __OpenBSD__
- #include <sys/types.h>
- #include <sys/resource.h>
- @@ -98,6 +104,8 @@ os_init(char *argv[], char *envp[])
- openbsd_init();
- #elif defined(LISP_FEATURE_DARWIN)
- darwin_init();
- +#elif defined(__DragonFly__)
- + dragonfly_init();
- #endif
- }
- @@ -107,7 +115,7 @@ os_context_sigmask_addr(os_context_t *context)
- /* (Unlike most of the other context fields that we access, the
- * signal mask field is a field of the basic, outermost context
- * struct itself both in FreeBSD 4.0 and in OpenBSD 2.6.) */
- -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(LISP_FEATURE_DARWIN)
- +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(LISP_FEATURE_DARWIN) || defined(__DragonFly__)
- return &context->uc_sigmask;
- #elif defined (__OpenBSD__)
- return &context->sc_mask;
- @@ -444,6 +452,58 @@ futex_wake(int *lock_word, int n)
- #endif
- #endif /* __FreeBSD__ */
- +#ifdef __DragonFly__
- +static void dragonfly_init()
- +{
- +#ifdef LISP_FEATURE_X86
- + size_t len;
- + int instruction_sse;
- +
- + len = sizeof(instruction_sse);
- + if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len,
- + NULL, 0) == 0 && instruction_sse != 0) {
- + /* Use the SSE detector */
- + fast_bzero_pointer = fast_bzero_detect;
- + }
- +#endif /* LISP_FEATURE_X86 */
- +}
- +
- +
- +#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_FUTEX) \
- + && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX)
- +int
- +futex_wait(int *lock_word, long oldval, long sec, unsigned long usec)
- +{
- + int ret;
- +
- + if (sec < 0)
- + ret = umtx_sleep(lock_word, oldval, 0);
- + else {
- + int count = usec + 1000000 * sec;
- + ret = umtx_sleep(lock_word, oldval, count);
- + }
- +
- + if (ret == 0) return 0;
- + else {
- + switch (errno) {
- + case EWOULDBLOCK: // Operation timed out
- + return 1;
- + case EINTR:
- + return 2;
- + default: // Such as EINVAL or EBUSY
- + return -1;
- + }
- + }
- +}
- +
- +int
- +futex_wake(int *lock_word, int n)
- +{
- + return umtx_wakeup(lock_word, n);
- +}
- +#endif
- +#endif /* __DragonFly__ */
- +
- #ifdef LISP_FEATURE_DARWIN
- /* defined in ppc-darwin-os.c instead */
- #elif defined(LISP_FEATURE_FREEBSD)
- @@ -478,6 +538,20 @@ os_get_runtime_executable_path(int external)
- return NULL;
- return copied_string(path);
- }
- +#elif defined(LISP_FEATURE_DRAGONFLY)
- +char *
- +os_get_runtime_executable_path(int external)
- +{
- + char path[PATH_MAX + 1];
- + int size = readlink("/proc/curproc/file", path, sizeof(path) - 1);
- + if (size < 0)
- + return NULL;
- + path[size] = '\0';
- +
- + if (strcmp(path, "unknown") == 0)
- + return NULL;
- + return copied_string(path);
- +}
- #elif defined(LISP_FEATURE_NETBSD) || defined(LISP_FEATURE_OPENBSD)
- char *
- os_get_runtime_executable_path(int external)
- @@ -487,7 +561,7 @@ os_get_runtime_executable_path(int external)
- return copied_string("/proc/curproc/file");
- return NULL;
- }
- -#else /* Not DARWIN or FREEBSD or NETBSD or OPENBSD */
- +#else /* Not DARWIN or FREEBSD or NETBSD or OPENBSD or DragonFly */
- char *
- os_get_runtime_executable_path(int external)
- {
- diff --git a/src/runtime/bsd-os.h b/src/runtime/bsd-os.h
- index 880c5f7..61aaf0e 100644
- --- a/src/runtime/bsd-os.h
- +++ b/src/runtime/bsd-os.h
- @@ -9,7 +9,7 @@
- * files for more information.
- */
- -#ifdef __FreeBSD__
- +#if defined(__FreeBSD__) || defined(__DragonFly__)
- #include <osreldate.h>
- #endif
- @@ -61,6 +61,14 @@ extern int sig_memory_fault;
- #define SIG_STOP_FOR_GC (SIGUSR2)
- +#elif defined __DragonFly__
- +
- +#include <sys/ucontext.h>
- +typedef ucontext_t os_context_t;
- +
- +#define SIG_MEMORY_FAULT (SIGSEGV)
- +#define SIG_STOP_FOR_GC (SIGUSR2)
- +
- #elif defined __OpenBSD__
- typedef struct sigcontext os_context_t;
- diff --git a/src/runtime/pthread-futex.c b/src/runtime/pthread-futex.c
- index cddcda9..209480c 100644
- --- a/src/runtime/pthread-futex.c
- +++ b/src/runtime/pthread-futex.c
- @@ -279,7 +279,7 @@ again:
- * emulate this behaviour. */
- sigpending(&pendset);
- for (i = 1; i < NSIG; i++) {
- - if (sigismember(&pendset, i) && sigismember(&newset, i)) {
- + if (sigismember(&pendset, i) && sigismember(&oldset, i)) {
- result = EINTR;
- goto done;
- }
- diff --git a/src/runtime/thread.c b/src/runtime/thread.c
- index 26f6de6..dd89435 100644
- --- a/src/runtime/thread.c
- +++ b/src/runtime/thread.c
- @@ -58,7 +58,7 @@
- #define LOCK_CREATE_THREAD
- #endif
- -#ifdef LISP_FEATURE_FREEBSD
- +#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
- #define CREATE_CLEANUP_THREAD
- #define LOCK_CREATE_THREAD
- #endif
- diff --git a/src/runtime/undefineds.h b/src/runtime/undefineds.h
- index b1cb325..024b565 100644
- --- a/src/runtime/undefineds.h
- +++ b/src/runtime/undefineds.h
- @@ -39,7 +39,8 @@ F(brk)
- || defined(SVR4) \
- || defined(__FreeBSD__) \
- || defined(__OpenBSD__) \
- - || defined(__NetBSD__)
- + || defined(__NetBSD__) \
- + || defined(__DragonFly__)
- F(cfgetospeed)
- F(cfsetospeed)
- F(cfgetispeed)
- @@ -154,7 +155,7 @@ F(sigreturn)
- #if !defined(SVR4)
- F(sigsetmask)
- #endif
- -#if !defined(SVR4) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
- +#if !defined(SVR4) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__)
- F(sigstack)
- F(sigvec)
- #endif
- @@ -180,6 +181,7 @@ F(readdir)
- || defined(__FreeBSD__) \
- || defined(__OpenBSD__) \
- || defined(__NetBSD__) \
- + || defined(__DragonFly__) \
- || defined(__linux__)
- F(tcgetattr)
- F(tcsetattr)
- @@ -198,6 +200,7 @@ F(umask)
- && !defined(SOLARIS) \
- && !defined(__OpenBSD__) \
- && !defined(__FreeBSD__) \
- + && !defined(__DragonFly__) \
- && !defined(__NetBSD__)
- F(umount)
- #endif
- @@ -208,7 +211,7 @@ F(utimes)
- #ifndef irix
- F(vfork)
- #endif
- -#if !defined(osf1) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
- +#if !defined(osf1) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__)
- F(vhangup)
- #endif
- F(wait)
- diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c
- index 2e6ea23..f0831cf 100644
- --- a/src/runtime/x86-64-arch.c
- +++ b/src/runtime/x86-64-arch.c
- @@ -70,7 +70,7 @@ context_eflags_addr(os_context_t *context)
- * we need to do this nasty absolute index magic number thing
- * instead. */
- return &context->uc_mcontext.gregs[17];
- -#elif defined __FreeBSD__
- +#elif defined(__FreeBSD__) || defined(__DragonFly__)
- return &context->uc_mcontext.mc_rflags;
- #elif defined LISP_FEATURE_DARWIN
- return CONTEXT_ADDR_FROM_STEM(rflags);
- diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S
- index b85639e..61924a5 100644
- --- a/src/runtime/x86-64-assem.S
- +++ b/src/runtime/x86-64-assem.S
- @@ -25,7 +25,7 @@
- #include "genesis/thread.h"
- /* Minimize conditionalization for different OS naming schemes. */
- -#if defined __linux__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __sun || defined _WIN64
- +#if defined __linux__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __sun || defined _WIN64 || defined __DragonFly__
- #define GNAME(var) var
- #else
- #define GNAME(var) _##var
- @@ -33,7 +33,7 @@
- /* Get the right type of alignment. Linux, FreeBSD and OpenBSD
- * want alignment in bytes. */
- -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined __NetBSD__ || defined(__sun) || defined _WIN64
- +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined __NetBSD__ || defined(__sun) || defined _WIN64 || defined(__DragonFly__)
- #define align_4byte 4
- #define align_8byte 8
- #define align_16byte 16
- diff --git a/src/runtime/x86-64-bsd-os.c b/src/runtime/x86-64-bsd-os.c
- index 3d9a9c7..b394118 100644
- --- a/src/runtime/x86-64-bsd-os.c
- +++ b/src/runtime/x86-64-bsd-os.c
- @@ -12,6 +12,10 @@
- #include <machine/fpu.h>
- #endif
- +#if defined(LISP_FEATURE_DRAGONFLY)
- +#include <machine/npx.h>
- +#endif
- +
- /* KLUDGE: There is strong family resemblance in the signal context
- * stuff in FreeBSD and OpenBSD, but in detail they're different in
- * almost every line of code. It would be nice to find some way to
- @@ -23,7 +27,7 @@
- * entails; unfortunately, currently the situation is worse, not
- * better, than in the above paragraph. */
- -#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DARWIN) || defined(LISP_FEATURE_OPENBSD)
- +#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DARWIN) || defined(LISP_FEATURE_OPENBSD) || defined(LISP_FEATURE_DRAGONFLY)
- os_context_register_t *
- os_context_register_addr(os_context_t *context, int offset)
- {
- @@ -168,6 +172,19 @@ int arch_os_thread_cleanup(struct thread *thread) {
- return 1; /* success */
- }
- +#if defined(LISP_FEATURE_DRAGONFLY)
- +void
- +os_restore_fp_control(os_context_t *context)
- +{
- + struct envxmm *ex = (struct envxmm*)(&context->uc_mcontext.mc_fpregs);
- + /* reset exception flags and restore control flags on SSE2 FPU */
- + unsigned int temp = (ex->en_mxcsr) & ~0x3F;
- + asm ("ldmxcsr %0" : : "m" (temp));
- + /* same for x87 FPU. */
- + asm ("fldcw %0" : : "m" (ex->en_cw));
- +}
- +#endif
- +
- #if defined(LISP_FEATURE_FREEBSD)
- void
- os_restore_fp_control(os_context_t *context)
- diff --git a/src/runtime/x86-64-bsd-os.h b/src/runtime/x86-64-bsd-os.h
- index 9db3ae7..789748b 100644
- --- a/src/runtime/x86-64-bsd-os.h
- +++ b/src/runtime/x86-64-bsd-os.h
- @@ -5,6 +5,10 @@
- #include <machine/fpu.h>
- #endif
- +#ifdef LISP_FEATURE_DRAGONFLY
- +#include <machine/npx.h>
- +#endif
- +
- typedef register_t os_context_register_t;
- static inline os_context_t *arch_os_get_context(void **void_context)
- @@ -16,7 +20,7 @@ static inline os_context_t *arch_os_get_context(void **void_context)
- * store signal context information, but at least they tend to use the
- * same stems to name the structure fields, so by using this macro we
- * can share a fair amount of code between different variants. */
- -#if defined __FreeBSD__
- +#if defined(__FreeBSD__) || defined(__DragonFly__)
- #define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext.mc_ ## stem
- #elif defined(__OpenBSD__)
- #define CONTEXT_ADDR_FROM_STEM(stem) &context->sc_ ## stem
- @@ -26,6 +30,20 @@ static inline os_context_t *arch_os_get_context(void **void_context)
- #error unsupported BSD variant
- #endif
- +#if defined LISP_FEATURE_DRAGONFLY
- +#define RESTORE_FP_CONTROL_FROM_CONTEXT
- +void os_restore_fp_control(os_context_t *context);
- +
- +#define X86_64_SIGFPE_FIXUP
- +
- +static inline unsigned int *
- +arch_os_context_mxcsr_addr(os_context_t *context)
- +{
- + struct envxmm *ex = (struct envxmm *)(&context->uc_mcontext.mc_fpregs);
- + return &ex->en_mxcsr;
- +}
- +#endif
- +
- #if defined LISP_FEATURE_FREEBSD
- #define RESTORE_FP_CONTROL_FROM_CONTEXT
- void os_restore_fp_control(os_context_t *context);
- diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c
- index dfbf908..59ecf92 100644
- --- a/src/runtime/x86-arch.c
- +++ b/src/runtime/x86-arch.c
- @@ -68,7 +68,7 @@ context_eflags_addr(os_context_t *context)
- * we need to do this nasty absolute index magic number thing
- * instead. */
- return &context->uc_mcontext.gregs[16];
- -#elif defined __FreeBSD__
- +#elif defined(__FreeBSD__) || defined(__DragonFly__)
- return &context->uc_mcontext.mc_eflags;
- #elif defined __OpenBSD__
- return &context->sc_eflags;
- diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S
- index fba970b..024e137 100644
- --- a/src/runtime/x86-assem.S
- +++ b/src/runtime/x86-assem.S
- @@ -32,7 +32,7 @@
- *
- * (Except Win32, which is unlikely ever to be ELF, sorry. -- AB 2005-12-08)
- */
- -#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __sun
- +#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __sun || defined __DragonFly__
- #define GNAME(var) var
- #else
- #define GNAME(var) _##var
- @@ -47,7 +47,7 @@
- * matter any more, perhaps it's just clutter we could get
- * rid of? -- WHN 2004-04-18)
- */
- -#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun) || defined(LISP_FEATURE_WIN32)
- +#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun) || defined(LISP_FEATURE_WIN32) || defined(__Dragonfly__)
- #define align_4byte 4
- #define align_8byte 8
- #define align_16byte 16
- @@ -131,7 +131,7 @@
- # define LoadCurrentThreadSlot(offset,reg); \
- movl SBCL_THREAD_BASE_EA, reg ; \
- movl offset(reg), reg ;
- -#elif defined(LISP_FEATURE_LINUX) || defined(LISP_FEATURE_SUNOS) || defined(LISP_FEATURE_FREEBSD)
- +#elif defined(LISP_FEATURE_LINUX) || defined(LISP_FEATURE_SUNOS) || defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
- /* see comment in arch_os_thread_init */
- # define SBCL_THREAD_BASE_EA %fs:THREAD_SELFPTR_OFFSET
- # define MAYBE_FS(addr) addr
- diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c
- index fe75566..4f985fe 100644
- --- a/src/runtime/x86-bsd-os.c
- +++ b/src/runtime/x86-bsd-os.c
- @@ -16,7 +16,7 @@
- #endif /* LISP_FEATURE_DARWIN */
- #endif
- -#if defined(LISP_FEATURE_FREEBSD)
- +#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
- #include "machine/npx.h"
- #endif
- @@ -40,7 +40,7 @@
- * entails; unfortunately, currently the situation is worse, not
- * better, than in the above paragraph. */
- -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(LISP_FEATURE_DARWIN)
- +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(LISP_FEATURE_DARWIN) || defined(__DragonFly__)
- int *
- os_context_register_addr(os_context_t *context, int offset)
- {
- @@ -72,7 +72,7 @@ os_context_sp_addr(os_context_t *context)
- return (int *)CONTEXT_ADDR_FROM_STEM(esp);
- }
- -#endif /* __FreeBSD__ || __OpenBSD__ */
- +#endif /* __FreeBSD__ || __OpenBSD__ || __DragonFly__ */
- #ifdef __NetBSD__
- int *
- @@ -112,7 +112,7 @@ os_context_sp_addr(os_context_t *context)
- int *os_context_pc_addr(os_context_t *context)
- {
- -#if defined __FreeBSD__
- +#if defined(__FreeBSD__) || defined(__DragonFly__)
- return CONTEXT_ADDR_FROM_STEM(eip);
- #elif defined __OpenBSD__
- return CONTEXT_ADDR_FROM_STEM(pc);
- @@ -264,6 +264,14 @@ os_restore_fp_control(os_context_t *context)
- }
- #endif
- +#if defined(LISP_FEATURE_DRAGONFLY)
- +void os_restore_fp_control (os_context_t *context)
- +{
- + struct envxmm *ex = (struct envxmm *)(context->uc_mcontext.mc_fpregs);
- + __asm__ __volatile__ ("fldcw %0" : : "m" (ex->en_cw));
- +}
- +#endif /* LISP_FEATURE_DRAGONFLY */
- +
- #if defined(LISP_FEATURE_OPENBSD)
- void
- os_restore_fp_control(os_context_t *context)
- diff --git a/src/runtime/x86-bsd-os.h b/src/runtime/x86-bsd-os.h
- index dc9d9f7..2ae7d61 100644
- --- a/src/runtime/x86-bsd-os.h
- +++ b/src/runtime/x86-bsd-os.h
- @@ -1,7 +1,7 @@
- #ifndef _X86_BSD_OS_H
- #define _X86_BSD_OS_H
- -#ifdef LISP_FEATURE_FREEBSD
- +#if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
- #include <machine/segments.h>
- #include <machine/cpufunc.h>
- #endif
- @@ -17,7 +17,7 @@ static inline os_context_t *arch_os_get_context(void **void_context)
- * store signal context information, but at least they tend to use the
- * same stems to name the structure fields, so by using this macro we
- * can share a fair amount of code between different variants. */
- -#if defined __FreeBSD__
- +#if defined(__FreeBSD__) || defined(__DragonFly__)
- #define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext.mc_ ## stem
- #elif defined(__OpenBSD__)
- #define CONTEXT_ADDR_FROM_STEM(stem) &context->sc_ ## stem
- @@ -35,7 +35,7 @@ void os_restore_tls_segment_register(os_context_t *context);
- void os_restore_fp_control(os_context_t *context);
- #endif
- -#if defined LISP_FEATURE_OPENBSD
- +#if defined(LISP_FEATURE_OPENBSD) || defined(LISP_FEATURE_DRAGONFLY)
- #define RESTORE_FP_CONTROL_FROM_CONTEXT
- void os_restore_fp_control(os_context_t *context);
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement