diff --git a/CMakeLists.txt b/CMakeLists.txt index b2601623..e2e0691d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ ENDIF() # -- [ Determine target processor SET(CPUINFO_TARGET_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}") -IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND CPUINFO_TARGET_PROCESSOR STREQUAL "amd64") +IF(CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|NetBSD)" AND CPUINFO_TARGET_PROCESSOR STREQUAL "amd64") SET(CPUINFO_TARGET_PROCESSOR "AMD64") ENDIF() IF(IS_APPLE_OS AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64.*)$") @@ -108,7 +108,7 @@ IF(NOT CMAKE_SYSTEM_NAME) "Target operating system is not specified. " "cpuinfo will compile, but cpuinfo_initialize() will always fail.") SET(CPUINFO_SUPPORTED_PLATFORM FALSE) -ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS|Darwin|Linux|Android|FreeBSD|Emscripten)$") +ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS|Darwin|Linux|Android|FreeBSD|NetBSD|Emscripten)$") IF(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14" AND NOT IS_APPLE_OS) MESSAGE(WARNING "Target operating system \"${CMAKE_SYSTEM_NAME}\" is not supported in cpuinfo. " @@ -181,7 +181,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM) LIST(APPEND CPUINFO_SRCS src/x86/mach/init.c) ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|WindowsStore|CYGWIN|MSYS)$") LIST(APPEND CPUINFO_SRCS src/x86/windows/init.c) - ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|NetBSD)") LIST(APPEND CPUINFO_SRCS src/x86/freebsd/init.c) ENDIF() ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^Windows" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(ARM64|arm64)$") @@ -240,11 +240,11 @@ IF(CPUINFO_SUPPORTED_PLATFORM) src/linux/processors.c) ELSEIF(IS_APPLE_OS) LIST(APPEND CPUINFO_SRCS src/mach/topology.c) - ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|NetBSD)") LIST(APPEND CPUINFO_SRCS src/freebsd/topology.c) ENDIF() - IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android" OR CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|NetBSD)") SET(CMAKE_THREAD_PREFER_PTHREAD TRUE) SET(THREADS_PREFER_PTHREAD_FLAG TRUE) FIND_PACKAGE(Threads REQUIRED) @@ -309,7 +309,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM) TARGET_LINK_LIBRARIES(cpuinfo_internals PUBLIC ${CMAKE_THREAD_LIBS_INIT}) TARGET_COMPILE_DEFINITIONS(cpuinfo PRIVATE _GNU_SOURCE=1) TARGET_COMPILE_DEFINITIONS(cpuinfo_internals PRIVATE _GNU_SOURCE=1) - ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|NetBSD)") TARGET_LINK_LIBRARIES(cpuinfo PUBLIC ${CMAKE_THREAD_LIBS_INIT}) TARGET_LINK_LIBRARIES(cpuinfo_internals PUBLIC ${CMAKE_THREAD_LIBS_INIT}) ENDIF() diff --git a/src/freebsd/topology.c b/src/freebsd/topology.c index 675a81f8..7818aa0e 100644 --- a/src/freebsd/topology.c +++ b/src/freebsd/topology.c @@ -20,6 +20,7 @@ static int sysctl_int(const char* name) { return value; } +#if defined(__FreeBSD__) static char* sysctl_str(const char* name) { size_t value_size = 0; if (sysctlbyname(name, NULL, &value_size, NULL, 0) != 0) { @@ -42,6 +43,7 @@ static char* sysctl_str(const char* name) { } return value; } +#endif struct cpuinfo_freebsd_topology cpuinfo_freebsd_detect_topology(void) { struct cpuinfo_freebsd_topology topology = { @@ -50,6 +52,7 @@ struct cpuinfo_freebsd_topology cpuinfo_freebsd_detect_topology(void) { .threads_per_core = 0, .threads = 0, }; +#if defined(__FreeBSD__) char* topology_spec = sysctl_str("kern.sched.topology_spec"); if (!topology_spec) { return topology; @@ -94,6 +97,19 @@ struct cpuinfo_freebsd_topology cpuinfo_freebsd_detect_topology(void) { topology.threads_per_core); topology.threads = topology.threads_per_core * topology.cores; return topology; +#elif defined(__NetBSD__) + topology.cores = sysctl_int("hw.ncpu"); + if (topology.cores == 0) { + goto fail; + } + cpuinfo_log_debug("netbsd topology: cores = %d", topology.cores); + /* more details need active identification of the CPU, no sysctl available */ + /* TODO: improve */ + topology.threads = topology.cores; + topology.packages = 1; + topology.threads_per_core = 1; + return topology; +#endif fail: topology.packages = 0; return topology; diff --git a/src/init.c b/src/init.c index 81d5721c..10f70160 100644 --- a/src/init.c +++ b/src/init.c @@ -24,7 +24,7 @@ bool CPUINFO_ABI cpuinfo_initialize(void) { #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64 #if defined(__MACH__) && defined(__APPLE__) pthread_once(&init_guard, &cpuinfo_x86_mach_init); -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__NetBSD__) pthread_once(&init_guard, &cpuinfo_x86_freebsd_init); #elif defined(__linux__) pthread_once(&init_guard, &cpuinfo_x86_linux_init);