Skip to content

Commit bdadbf6

Browse files
committed
fix: Detection of HW caps and Num Cpus for FreeBSD(R) and OpenBSD(R)
Signed-off-by: Martin Filla <freebsd@sysctl.cz>
1 parent e7ed1af commit bdadbf6

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

src/common/cpuinfo/CpuInfo.cpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@
5858
#include <asm/hwcap.h> /* Get HWCAP bits from asm/hwcap.h */
5959
#include <sys/auxv.h>
6060
#elif (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__)) && defined(__aarch64__)
61+
#include <sys/auxv.h>
6162
#include <sys/sysctl.h>
6263
#include <sys/types.h>
64+
#include <unistd.h>
6365
#endif /* defined(__APPLE__) && defined(__aarch64__)) */
6466
#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__QNX__) && (defined(__arm__) || defined(__aarch64__)) */
6567

@@ -435,8 +437,33 @@ CpuInfo CpuInfo::build()
435437
std::vector<CpuModel> cpus_model(1, midr_to_model(midr));
436438
CpuInfo info(isa, cpus_model);
437439
return info;
438-
#elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__) || \
439-
defined(__APPLE__)) /* #elif(BARE_METAL) && defined(__aarch64__) */
440+
441+
#elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__))
442+
/* #elif(BARE_METAL) && defined(__aarch64__) */
443+
int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
444+
445+
unsigned long hwcap = 0, hwcap2 = 0;
446+
elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
447+
elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
448+
449+
CpuIsaInfo isainfo;
450+
std::vector<CpuModel> cpus_model(ncpus);
451+
452+
isainfo.neon = (hwcap & HWCAP_ASIMD) != 0;
453+
isainfo.fp16 = (hwcap & HWCAP_FPHP) != 0;
454+
isainfo.dot = (hwcap & HWCAP_ASIMDDP) != 0;
455+
isainfo.bf16 = (hwcap2 & HWCAP2_BF16) != 0;
456+
isainfo.i8mm = (hwcap2 & HWCAP2_I8MM) != 0;
457+
isainfo.sme = (hwcap2 & HWCAP2_SME) != 0;
458+
isainfo.sme2 = (hwcap2 & HWCAP2_SME2) != 0;
459+
isainfo.sme_f32f32 = (hwcap2 & HWCAP2_SME_F32F32) != 0;
460+
isainfo.sme_i8i32 = (hwcap2 & HWCAP2_SME_I8I32) != 0;
461+
isainfo.sme_f16f32 = (hwcap2 & HWCAP2_SME_F16F32) != 0;
462+
isainfo.sme_b16f32 = (hwcap2 & HWCAP2_SME_B16F32) != 0;
463+
CpuInfo info(isainfo, cpus_model);
464+
return info;
465+
466+
#elif defined(__aarch64__) && defined(__APPLE__)
440467
int ncpus = get_hw_capability("hw.perflevel0.logicalcpu");
441468
CpuIsaInfo isainfo;
442469
std::vector<CpuModel> cpus_model(ncpus);
@@ -453,7 +480,7 @@ CpuInfo CpuInfo::build()
453480
isainfo.sme2 = get_hw_capability("hw.optional.arm.FEAT_SME2");
454481
CpuInfo info(isainfo, cpus_model);
455482
return info;
456-
#elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */
483+
#elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */
457484
CpuIsaInfo isainfo;
458485

459486
isainfo.neon = IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE);
@@ -485,7 +512,7 @@ CpuInfo CpuInfo::build()
485512
std::vector<CpuModel> cpus_model(ncpus);
486513
CpuInfo info(isainfo, cpus_model);
487514
return info;
488-
#else /* #elif defined(__aarch64__) && defined(_WIN64) */
515+
#else /* #elif defined(__aarch64__) && defined(_WIN64) */
489516
CpuInfo info(CpuIsaInfo(), {CpuModel::GENERIC});
490517
return info;
491518
#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */

0 commit comments

Comments
 (0)