diff --git a/CMakeLists.txt b/CMakeLists.txt index 73c4421b..7e102fc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,6 +133,10 @@ else() set(EXTRA_LIBS pthread) endif() +if (CMAKE_SYSTEM_NAME STREQUAL FreeBSD) + set(EXTRA_LIBS ${EXTRA_LIBS} kvm) +endif() + add_definitions(/D__STDC_FORMAT_MACROS) add_definitions(/DUNICODE) add_definitions(/DRAPIDJSON_SSE2) diff --git a/src/Cpu_unix.cpp b/src/Cpu_unix.cpp index 5d3a6d64..8de98c8c 100644 --- a/src/Cpu_unix.cpp +++ b/src/Cpu_unix.cpp @@ -22,6 +22,14 @@ */ +#ifdef __FreeBSD__ +# include +# include +# include +# include +#endif + + #include #include #include @@ -31,6 +39,11 @@ #include "Cpu.h" +#ifdef __FreeBSD__ +typedef cpuset_t cpu_set_t; +#endif + + void Cpu::init() { # ifdef XMRIG_NO_LIBCPUID @@ -53,7 +66,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..ecccc49e 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 }