diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73c4421b..f0d81e2f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -122,6 +122,14 @@ elseif (APPLE)
src/Mem_unix.cpp
src/Platform_mac.cpp
)
+elseif (CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
+ set(SOURCES_OS
+ src/App_unix.cpp
+ src/Cpu_unix.cpp
+ src/Mem_unix.cpp
+ src/Platform_unix.cpp
+ )
+set(EXTRA_LIBS pthread kvm)
else()
set(SOURCES_OS
src/App_unix.cpp
diff --git a/src/Cpu_unix.cpp b/src/Cpu_unix.cpp
index 5d3a6d64..ca1225df 100644
--- a/src/Cpu_unix.cpp
+++ b/src/Cpu_unix.cpp
@@ -20,8 +20,12 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-
-
+#ifdef __FreeBSD__
+#include
+#include
+#include
+#include
+#endif
#include
#include
#include
@@ -30,6 +34,9 @@
#include "Cpu.h"
+#ifdef __FreeBSD__
+typedef cpuset_t cpu_set_t;
+#endif
void Cpu::init()
{
@@ -53,7 +60,9 @@ void Cpu::setAffinity(int id, uint64_t mask)
}
if (id == -1) {
+ #ifndef __FreeBSD__
sched_setaffinity(0, sizeof(&set), &set);
+ #endif
} else {
pthread_setaffinity_np(pthread_self(), sizeof(&set), &set);
}
diff --git a/src/Mem_unix.cpp b/src/Mem_unix.cpp
index 7c41fd16..2cb14bc9 100644
--- a/src/Mem_unix.cpp
+++ b/src/Mem_unix.cpp
@@ -51,10 +51,11 @@ bool Mem::allocate(int algo, int threads, bool doubleHash, bool enabled)
# if defined(__APPLE__)
m_memory = static_cast(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0));
+# elif defined(__FreeBSD__)
+ m_memory = static_cast(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER | MAP_PREFAULT_READ, -1, 0));
# else
m_memory = static_cast(mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_POPULATE, 0, 0));
# endif
-
if (m_memory == MAP_FAILED) {
m_memory = static_cast(_mm_malloc(size, 16));
return true;
diff --git a/src/Platform_unix.cpp b/src/Platform_unix.cpp
index 27d8de37..b6d16d6f 100644
--- a/src/Platform_unix.cpp
+++ b/src/Platform_unix.cpp
@@ -21,7 +21,6 @@
* along with this program. If not, see .
*/
-
#include
#include
#include
@@ -116,6 +115,7 @@ void Platform::setThreadPriority(int priority)
setpriority(PRIO_PROCESS, 0, prio);
+#ifdef SCHED_IDLE
if (priority == 0) {
sched_param param;
param.sched_priority = 0;
@@ -124,4 +124,5 @@ void Platform::setThreadPriority(int priority)
sched_setscheduler(0, SCHED_BATCH, ¶m);
}
}
+#endif
}