Skip to content

Commit cb64777

Browse files
committed
add FreeBSD support
1 parent d7069b3 commit cb64777

File tree

6 files changed

+415
-7
lines changed

6 files changed

+415
-7
lines changed

CMakeLists.txt

+14-7
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ IF(NOT CMAKE_SYSTEM_PROCESSOR)
9292
"cpuinfo will compile, but cpuinfo_initialize() will always fail.")
9393
SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
9494
ENDIF()
95-
ELSEIF(NOT CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?|armv[5-8].*|aarch64|arm64.*|ARM64.*)$")
95+
ELSEIF(NOT CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|amd64|x86(_64)?|armv[5-8].*|aarch64|arm64.*|ARM64.*)$")
9696
MESSAGE(WARNING
9797
"Target processor architecture \"${CPUINFO_TARGET_PROCESSOR}\" is not supported in cpuinfo. "
9898
"cpuinfo will compile, but cpuinfo_initialize() will always fail.")
@@ -105,7 +105,7 @@ IF(NOT CMAKE_SYSTEM_NAME)
105105
"Target operating system is not specified. "
106106
"cpuinfo will compile, but cpuinfo_initialize() will always fail.")
107107
SET(CPUINFO_SUPPORTED_PLATFORM FALSE)
108-
ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS|Darwin|Linux|Android)$")
108+
ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS|Darwin|Linux|Android|FreeBSD)$")
109109
IF(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14" AND NOT IS_APPLE_OS)
110110
MESSAGE(WARNING
111111
"Target operating system \"${CMAKE_SYSTEM_NAME}\" is not supported in cpuinfo. "
@@ -152,7 +152,7 @@ ENDIF()
152152
SET(CPUINFO_SRCS src/api.c src/cache.c src/init.c src/log.c)
153153

154154
IF(CPUINFO_SUPPORTED_PLATFORM)
155-
IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten" AND (CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$" OR IOS_ARCH MATCHES "^(i386|x86_64)$"))
155+
IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten" AND (CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|amd64|x86(_64)?)$" OR IOS_ARCH MATCHES "^(i386|x86_64)$"))
156156
LIST(APPEND CPUINFO_SRCS
157157
src/x86/init.c
158158
src/x86/info.c
@@ -172,6 +172,8 @@ IF(CPUINFO_SUPPORTED_PLATFORM)
172172
LIST(APPEND CPUINFO_SRCS src/x86/mach/init.c)
173173
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS)$")
174174
LIST(APPEND CPUINFO_SRCS src/x86/windows/init.c)
175+
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
176+
LIST(APPEND CPUINFO_SRCS src/x86/freebsd/init.c)
175177
ENDIF()
176178
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^Windows" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(ARM64|arm64)$")
177179
LIST(APPEND CPUINFO_SRCS
@@ -219,9 +221,11 @@ IF(CPUINFO_SUPPORTED_PLATFORM)
219221
src/linux/processors.c)
220222
ELSEIF(IS_APPLE_OS)
221223
LIST(APPEND CPUINFO_SRCS src/mach/topology.c)
224+
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
225+
LIST(APPEND CPUINFO_SRCS src/freebsd/topology.c)
222226
ENDIF()
223227

224-
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
228+
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
225229
SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
226230
SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
227231
FIND_PACKAGE(Threads REQUIRED)
@@ -286,6 +290,9 @@ IF(CPUINFO_SUPPORTED_PLATFORM)
286290
TARGET_LINK_LIBRARIES(cpuinfo_internals PUBLIC ${CMAKE_THREAD_LIBS_INIT})
287291
TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE _GNU_SOURCE=1)
288292
TARGET_COMPILE_DEFINITIONS(cpuinfo_internals PRIVATE _GNU_SOURCE=1)
293+
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
294+
TARGET_LINK_LIBRARIES(cpuinfo PUBLIC ${CMAKE_THREAD_LIBS_INIT})
295+
TARGET_LINK_LIBRARIES(cpuinfo_internals PUBLIC ${CMAKE_THREAD_LIBS_INIT})
289296
ENDIF()
290297
ELSE()
291298
TARGET_COMPILE_DEFINITIONS(cpuinfo INTERFACE CPUINFO_SUPPORTED_PLATFORM=0)
@@ -348,7 +355,7 @@ ENDIF()
348355
# ---[ cpuinfo mock library and mock tests
349356
IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS)
350357
SET(CPUINFO_MOCK_SRCS "${CPUINFO_SRCS}")
351-
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$")
358+
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|amd64|x86_64)$")
352359
LIST(APPEND CPUINFO_MOCK_SRCS src/x86/mockcpuid.c)
353360
ENDIF()
354361
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
@@ -792,7 +799,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS)
792799
ADD_TEST(NAME get-current-test COMMAND get-current-test)
793800
ENDIF()
794801

795-
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$")
802+
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|amd64|x86_64)$")
796803
ADD_EXECUTABLE(brand-string-test test/name/brand-string.cc)
797804
CPUINFO_TARGET_ENABLE_CXX11(brand-string-test)
798805
CPUINFO_TARGET_RUNTIME_LIBRARY(brand-string-test)
@@ -859,7 +866,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS)
859866
CPUINFO_TARGET_RUNTIME_LIBRARY(cpuinfo-dump)
860867
ENDIF()
861868

862-
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$")
869+
IF(CPUINFO_TARGET_PROCESSOR MATCHES "^(i[3-6]86|AMD64|amd64|x86_64)$")
863870
ADD_EXECUTABLE(cpuid-dump tools/cpuid-dump.c)
864871
CPUINFO_TARGET_ENABLE_C99(cpuid-dump)
865872
CPUINFO_TARGET_RUNTIME_LIBRARY(cpuid-dump)

src/cpuinfo/internal-api.h

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ extern CPUINFO_INTERNAL uint32_t cpuinfo_max_cache_size;
5050

5151
CPUINFO_PRIVATE void cpuinfo_x86_mach_init(void);
5252
CPUINFO_PRIVATE void cpuinfo_x86_linux_init(void);
53+
CPUINFO_PRIVATE void cpuinfo_x86_freebsd_init(void);
5354
#if defined(_WIN32) || defined(__CYGWIN__)
5455
#if CPUINFO_ARCH_ARM64
5556
CPUINFO_PRIVATE BOOL CALLBACK cpuinfo_arm_windows_init(PINIT_ONCE init_once, PVOID parameter, PVOID* context);

src/freebsd/api.h

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include <stdint.h>
4+
5+
6+
struct cpuinfo_freebsd_topology {
7+
uint32_t packages;
8+
uint32_t cores;
9+
uint32_t threads;
10+
};
11+
12+
13+
struct cpuinfo_freebsd_topology cpuinfo_freebsd_detect_topology(void);

src/freebsd/topology.c

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <string.h>
2+
#include <stdlib.h>
3+
#include <errno.h>
4+
5+
#include <sys/types.h>
6+
#include <sys/sysctl.h>
7+
8+
#include <cpuinfo/log.h>
9+
#include <freebsd/api.h>
10+
11+
12+
13+
struct cpuinfo_freebsd_topology cpuinfo_freebsd_detect_topology(void) {
14+
int threads = 1;
15+
size_t sizeof_threads = sizeof(threads);
16+
if (sysctlbyname("hw.ncpu", &threads, &sizeof_threads, NULL, 0) != 0) {
17+
cpuinfo_log_error("sysctlbyname(\"hw.ncpu\") failed: %s", strerror(errno));
18+
} else if (threads <= 0) {
19+
cpuinfo_log_error("sysctlbyname(\"hw.ncpu\") returned invalid value %d", threads);
20+
}
21+
22+
int cores = threads / 2;
23+
int packages = 1;
24+
25+
cpuinfo_log_debug("freebsd topology: packages = %d, cores = %d, threads = %d", packages, (int) cores, (int) threads);
26+
struct cpuinfo_freebsd_topology topology = {
27+
.packages = (uint32_t) packages,
28+
.cores = (uint32_t) cores,
29+
.threads = (uint32_t) threads
30+
};
31+
32+
return topology;
33+
}

src/init.c

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ bool CPUINFO_ABI cpuinfo_initialize(void) {
2525
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
2626
#if defined(__MACH__) && defined(__APPLE__)
2727
pthread_once(&init_guard, &cpuinfo_x86_mach_init);
28+
#elif defined(__FreeBSD__)
29+
pthread_once(&init_guard, &cpuinfo_x86_freebsd_init);
2830
#elif defined(__linux__)
2931
pthread_once(&init_guard, &cpuinfo_x86_linux_init);
3032
#elif defined(_WIN32) || defined(__CYGWIN__)

0 commit comments

Comments
 (0)