From e5ec13217d466f72d6a0bbbdf366ce4a190b6bf4 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 9 Feb 2019 20:59:57 +0000 Subject: [PATCH] dragonflybsd: Initial support. --- GNUmakefile | 4 +++ basis/unix/kqueue/platforms.txt | 4 ++- build.sh | 4 ++- core/system/system.factor | 7 ++--- vm/Config.dragonflybsd | 4 +++ vm/Config.dragonflybsd.x86.32 | 2 ++ vm/Config.dragonflybsd.x86.64 | 2 ++ vm/os-dragonflybsd-x86.32.hpp | 44 ++++++++++++++++++++++++++++++++ vm/os-dragonflybsd-x86.64.hpp | 40 +++++++++++++++++++++++++++++ vm/os-dragonflybsd.cpp | 45 +++++++++++++++++++++++++++++++++ vm/os-dragonflybsd.hpp | 7 +++++ vm/platform.hpp | 30 +++++++++++++++------- 12 files changed, 179 insertions(+), 14 deletions(-) create mode 100644 vm/Config.dragonflybsd create mode 100644 vm/Config.dragonflybsd.x86.32 create mode 100644 vm/Config.dragonflybsd.x86.64 create mode 100644 vm/os-dragonflybsd-x86.32.hpp create mode 100644 vm/os-dragonflybsd-x86.64.hpp create mode 100644 vm/os-dragonflybsd.cpp create mode 100644 vm/os-dragonflybsd.hpp diff --git a/GNUmakefile b/GNUmakefile index 53a1f0b8b5..eab937f343 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -141,6 +141,7 @@ help: @echo "linux-arm" @echo "freebsd-x86-32" @echo "freebsd-x86-64" + @echo "dragonflybsd-x86-64" @echo "macosx-x86-32" @echo "macosx-x86-64" @echo "macosx-x86-fat" @@ -161,6 +162,9 @@ freebsd-x86-32: freebsd-x86-64: $(MAKE) $(ALL) CONFIG=vm/Config.freebsd.x86.64 +dragonflybsd-x86-64: + $(MAKE) $(ALL) CONFIG=vm/Config.dragonflybsd.x86.64 + macosx-x86-32: $(MAKE) $(ALL) macosx.app CONFIG=vm/Config.macosx.x86.32 diff --git a/basis/unix/kqueue/platforms.txt b/basis/unix/kqueue/platforms.txt index f5763b39d9..2d925f4132 100644 --- a/basis/unix/kqueue/platforms.txt +++ b/basis/unix/kqueue/platforms.txt @@ -1 +1,3 @@ -macosx freebsd +macosx +freebsd +dragonflybsd diff --git a/build.sh b/build.sh index 7d99f7026b..861753179e 100755 --- a/build.sh +++ b/build.sh @@ -175,6 +175,7 @@ set_cc() { set_make() { case $OS in freebsd) MAKE=gmake ;; + dragonflybsd) MAKE=gmake ;; *) MAKE=make ;; esac if [[ $MAKE = 'gmake' ]] ; then @@ -262,6 +263,7 @@ find_os() { *linux*) OS=linux;; *Linux*) OS=linux;; FreeBSD) OS=freebsd;; + DragonFly) OS=dragonflybsd;; esac } @@ -290,7 +292,7 @@ find_num_cores() { case $uname_s in CYGWIN_NT-5.2-WOW64 | *CYGWIN_NT* | *CYGWIN* | MINGW32*) NUM_CORES=$NUMBER_OF_PROCESSORS;; *darwin* | *Darwin* | *linux* | *Linux*) NUM_CORES=$(getconf _NPROCESSORS_ONLN);; - freebsd) NUM_CORES=$(sysctl -n hw.ncpu);; + freebsd | dragonflybsd) NUM_CORES=$(sysctl -n hw.ncpu);; esac } diff --git a/core/system/system.factor b/core/system/system.factor index cd25edf4e7..2f136d98e1 100644 --- a/core/system/system.factor +++ b/core/system/system.factor @@ -16,10 +16,10 @@ UNION: ppc ppc.32 ppc.64 ; : cpu ( -- class ) \ cpu get-global ; foldable -SINGLETONS: windows macosx linux freebsd ; +SINGLETONS: windows macosx linux freebsd dragonflybsd ; -UNION: bsd freebsd ; -UNION: unix macosx linux freebsd bsd ; +UNION: bsd freebsd dragonflybsd ; +UNION: unix macosx linux freebsd dragonflybsd bsd ; : os ( -- class ) \ os get-global ; foldable @@ -51,6 +51,7 @@ CONSTANT: string>os-hash H{ { "windows" windows } { "macosx" macosx } { "freebsd" freebsd } + { "dragonflybsd" dragonflybsd } { "linux" linux } } diff --git a/vm/Config.dragonflybsd b/vm/Config.dragonflybsd new file mode 100644 index 0000000000..6d2244ad88 --- /dev/null +++ b/vm/Config.dragonflybsd @@ -0,0 +1,4 @@ +include vm/Config.unix +PLAF_DLL_OBJS += vm/os-genunix.o vm/os-dragonflybsd.o vm/mvm-unix.o +PLAF_MASTER_HEADERS += vm/os-genunix.hpp vm/os-dragonflybsd.hpp +LIBS = -L/usr/local/lib -lm $(X11_UI_LIBS) -pthread -lc -Wl,--export-dynamic -lpango-1.0 -lpangocairo-1.0 -lcairo -lglib-2.0 -lgobject-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lgdk_pixbuf-2.0 -lgtkglext-x11-1.0 -latk-1.0 -lgio-2.0 -lgdkglext-x11-1.0 -lGL diff --git a/vm/Config.dragonflybsd.x86.32 b/vm/Config.dragonflybsd.x86.32 new file mode 100644 index 0000000000..6ac4b9b3c1 --- /dev/null +++ b/vm/Config.dragonflybsd.x86.32 @@ -0,0 +1,2 @@ +include vm/Config.dragonflybsd +include vm/Config.x86.32 diff --git a/vm/Config.dragonflybsd.x86.64 b/vm/Config.dragonflybsd.x86.64 new file mode 100644 index 0000000000..e481f58155 --- /dev/null +++ b/vm/Config.dragonflybsd.x86.64 @@ -0,0 +1,2 @@ +include vm/Config.dragonflybsd +include vm/Config.x86.64 diff --git a/vm/os-dragonflybsd-x86.32.hpp b/vm/os-dragonflybsd-x86.32.hpp new file mode 100644 index 0000000000..664da1e997 --- /dev/null +++ b/vm/os-dragonflybsd-x86.32.hpp @@ -0,0 +1,44 @@ +#include +#include + +namespace factor +{ + +inline static unsigned int uap_fpu_status(void *uap) +{ + ucontext_t *ucontext = (ucontext_t *)uap; + if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_387) + { + struct save87 *x87 = (struct save87 *)(&ucontext->uc_mcontext.mc_fpstate); + return x87->sv_env.en_sw; + } + else if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM) + { + struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpstate); + return xmm->sv_env.en_sw | xmm->sv_env.en_mxcsr; + } + else + return 0; +} + +inline static void uap_clear_fpu_status(void *uap) +{ + ucontext_t *ucontext = (ucontext_t *)uap; + if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_387) + { + struct save87 *x87 = (struct save87 *)(&ucontext->uc_mcontext.mc_fpstate); + x87->sv_env.en_sw = 0; + } + else if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM) + { + struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpstate); + xmm->sv_env.en_sw = 0; + xmm->sv_env.en_mxcsr &= 0xffffffc0; + } +} + + +#define UAP_STACK_POINTER(ucontext) (((ucontext_t *)ucontext)->uc_mcontext.mc_esp) +#define UAP_PROGRAM_COUNTER(ucontext) (((ucontext_t *)ucontext)->uc_mcontext.mc_eip) + +} diff --git a/vm/os-dragonflybsd-x86.64.hpp b/vm/os-dragonflybsd-x86.64.hpp new file mode 100644 index 0000000000..a3d3c042e8 --- /dev/null +++ b/vm/os-dragonflybsd-x86.64.hpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +namespace factor { + + +inline static unsigned int uap_fpu_status(void *uap) +{ + ucontext_t *ucontext = (ucontext_t *)uap; + if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM) + { + struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpregs); + return xmm->sv_env.en_sw | xmm->sv_env.en_mxcsr; + } + else + return 0; +} + +inline static void uap_clear_fpu_status(void *uap) +{ + ucontext_t *ucontext = (ucontext_t *)uap; + if (ucontext->uc_mcontext.mc_fpformat == _MC_FPFMT_XMM) + { + struct savexmm *xmm = (struct savexmm *)(&ucontext->uc_mcontext.mc_fpregs); + xmm->sv_env.en_sw = 0; + xmm->sv_env.en_mxcsr &= 0xffffffc0; + } +} + +#define UAP_STACK_POINTER(ucontext) (((struct sigcontext *)ucontext)->sc_rsp) +#define UAP_PROGRAM_COUNTER(ucontext) (((struct sigcontext *)ucontext)->sc_rip) +#define UAP_SET_TOC_POINTER(uap, ptr) (void)0 +#define UAP_STACK_POINTER_TYPE long + +static const unsigned JIT_FRAME_SIZE = 32; +} diff --git a/vm/os-dragonflybsd.cpp b/vm/os-dragonflybsd.cpp new file mode 100644 index 0000000000..4948c053c7 --- /dev/null +++ b/vm/os-dragonflybsd.cpp @@ -0,0 +1,45 @@ +#include "master.hpp" + +#include +#include + +namespace factor { +char *vm_saved_path; + + + +/* From SBCL */ +const char *vm_executable_path() +{ + char path[PATH_MAX + 1]; + + if (getosreldate() >= 600024) + { + /* KERN_PROC_PATHNAME is available */ + size_t len = PATH_MAX + 1; + int mib[4]; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + if (sysctl(mib, 4, &path, &len, NULL, 0) != 0) + return NULL; + } + else + { + int size; + 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 safe_strdup(path); +} + + +} diff --git a/vm/os-dragonflybsd.hpp b/vm/os-dragonflybsd.hpp new file mode 100644 index 0000000000..f2105fe649 --- /dev/null +++ b/vm/os-dragonflybsd.hpp @@ -0,0 +1,7 @@ +namespace factor { + +#define CODE_TO_FUNCTION_POINTER(code) (void)0 +#define CODE_TO_FUNCTION_POINTER_CALLBACK(vm, code) (void)0 +#define FUNCTION_CODE_POINTER(ptr) ptr +#define FUNCTION_TOC_POINTER(ptr) ptr +} diff --git a/vm/platform.hpp b/vm/platform.hpp index c72b7b6334..a722151e64 100644 --- a/vm/platform.hpp +++ b/vm/platform.hpp @@ -27,15 +27,27 @@ #endif #else #include "os-genunix.hpp" - #if defined(__FreeBSD__) - #define FACTOR_OS_STRING "freebsd" - #include "os-freebsd.hpp" - #if defined(FACTOR_X86) - #include "os-freebsd-x86.32.hpp" - #elif defined(FACTOR_AMD64) - #include "os-freebsd-x86.64.hpp" - #else - #error "Unsupported FreeBSD flavor" + #if defined(BSD) + #if defined(__FreeBSD__) + #define FACTOR_OS_STRING "freebsd" + #include "os-freebsd.hpp" + #if defined(FACTOR_X86) + #include "os-freebsd-x86.32.hpp" + #elif defined(FACTOR_AMD64) + #include "os-freebsd-x86.64.hpp" + #else + #error "Unsupported FreeBSD flavor" + #endif + #elif defined(__DragonFly__) + #define FACTOR_OS_STRING "dragonflybsd" + #include "os-dragonflybsd.hpp" + #if defined(FACTOR_X86) + #include "os-dragonflybsd-x86.32.hpp" + #elif defined(FACTOR_AMD64) + #include "os-dragonflybsd-x86.64.hpp" + #else + #error "Unsupported DragonFlyBSD flavor" + #endif #endif #elif defined(__linux__) #define FACTOR_OS_STRING "linux"