From bdadbf68df4285e829840cb83a8075246682f5a7 Mon Sep 17 00:00:00 2001 From: Martin Filla Date: Mon, 16 Mar 2026 14:02:42 +0100 Subject: [PATCH] fix: Detection of HW caps and Num Cpus for FreeBSD(R) and OpenBSD(R) Signed-off-by: Martin Filla --- src/common/cpuinfo/CpuInfo.cpp | 35 ++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/common/cpuinfo/CpuInfo.cpp b/src/common/cpuinfo/CpuInfo.cpp index 0b220264d7..41fe81ae6a 100644 --- a/src/common/cpuinfo/CpuInfo.cpp +++ b/src/common/cpuinfo/CpuInfo.cpp @@ -58,8 +58,10 @@ #include /* Get HWCAP bits from asm/hwcap.h */ #include #elif (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__)) && defined(__aarch64__) +#include #include #include +#include #endif /* defined(__APPLE__) && defined(__aarch64__)) */ #endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__QNX__) && (defined(__arm__) || defined(__aarch64__)) */ @@ -435,8 +437,33 @@ CpuInfo CpuInfo::build() std::vector cpus_model(1, midr_to_model(midr)); CpuInfo info(isa, cpus_model); return info; -#elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__) || \ - defined(__APPLE__)) /* #elif(BARE_METAL) && defined(__aarch64__) */ + +#elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__)) + /* #elif(BARE_METAL) && defined(__aarch64__) */ + int ncpus = sysconf(_SC_NPROCESSORS_ONLN); + + unsigned long hwcap = 0, hwcap2 = 0; + elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)); + elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2)); + + CpuIsaInfo isainfo; + std::vector cpus_model(ncpus); + + isainfo.neon = (hwcap & HWCAP_ASIMD) != 0; + isainfo.fp16 = (hwcap & HWCAP_FPHP) != 0; + isainfo.dot = (hwcap & HWCAP_ASIMDDP) != 0; + isainfo.bf16 = (hwcap2 & HWCAP2_BF16) != 0; + isainfo.i8mm = (hwcap2 & HWCAP2_I8MM) != 0; + isainfo.sme = (hwcap2 & HWCAP2_SME) != 0; + isainfo.sme2 = (hwcap2 & HWCAP2_SME2) != 0; + isainfo.sme_f32f32 = (hwcap2 & HWCAP2_SME_F32F32) != 0; + isainfo.sme_i8i32 = (hwcap2 & HWCAP2_SME_I8I32) != 0; + isainfo.sme_f16f32 = (hwcap2 & HWCAP2_SME_F16F32) != 0; + isainfo.sme_b16f32 = (hwcap2 & HWCAP2_SME_B16F32) != 0; + CpuInfo info(isainfo, cpus_model); + return info; + +#elif defined(__aarch64__) && defined(__APPLE__) int ncpus = get_hw_capability("hw.perflevel0.logicalcpu"); CpuIsaInfo isainfo; std::vector cpus_model(ncpus); @@ -453,7 +480,7 @@ CpuInfo CpuInfo::build() isainfo.sme2 = get_hw_capability("hw.optional.arm.FEAT_SME2"); CpuInfo info(isainfo, cpus_model); return info; -#elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */ +#elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */ CpuIsaInfo isainfo; isainfo.neon = IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE); @@ -485,7 +512,7 @@ CpuInfo CpuInfo::build() std::vector cpus_model(ncpus); CpuInfo info(isainfo, cpus_model); return info; -#else /* #elif defined(__aarch64__) && defined(_WIN64) */ +#else /* #elif defined(__aarch64__) && defined(_WIN64) */ CpuInfo info(CpuIsaInfo(), {CpuModel::GENERIC}); return info; #endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */