diff --git a/GNUmakefile b/GNUmakefile index 5c734220c5..53a1f0b8b5 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -139,6 +139,7 @@ help: @echo "linux-ppc-32" @echo "linux-ppc-64" @echo "linux-arm" + @echo "freebsd-x86-32" @echo "freebsd-x86-64" @echo "macosx-x86-32" @echo "macosx-x86-64" @@ -154,6 +155,9 @@ help: ALL = factor factor-ffi-test factor-lib +freebsd-x86-32: + $(MAKE) $(ALL) CONFIG=vm/Config.freebsd.x86.32 + freebsd-x86-64: $(MAKE) $(ALL) CONFIG=vm/Config.freebsd.x86.64 diff --git a/build.sh b/build.sh index 84d8b22aa4..7d99f7026b 100755 --- a/build.sh +++ b/build.sh @@ -700,7 +700,7 @@ install_deps_dnf() { } install_deps_pkg() { - sudo pkg install --yes git gcc rlwrap ripgrep curl gmake x11-toolkits/gtk30 x11-toolkits/gtkglext pango cairo + sudo pkg install --yes git gmake gcc rlwrap ripgrep curl gmake x11-toolkits/gtk30 x11-toolkits/gtkglext pango cairo vim } diff --git a/vm/Config.freebsd.x86.32 b/vm/Config.freebsd.x86.32 new file mode 100644 index 0000000000..969ba1cea6 --- /dev/null +++ b/vm/Config.freebsd.x86.32 @@ -0,0 +1,2 @@ +include vm/Config.freebsd +include vm/Config.x86.32 diff --git a/vm/os-freebsd-x86.32.hpp b/vm/os-freebsd-x86.32.hpp new file mode 100644 index 0000000000..664da1e997 --- /dev/null +++ b/vm/os-freebsd-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/platform.hpp b/vm/platform.hpp index 8c0ec7887c..c72b7b6334 100644 --- a/vm/platform.hpp +++ b/vm/platform.hpp @@ -30,7 +30,13 @@ #if defined(__FreeBSD__) #define FACTOR_OS_STRING "freebsd" #include "os-freebsd.hpp" - #include "os-freebsd-x86.64.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(__linux__) #define FACTOR_OS_STRING "linux" #include "os-linux.hpp"