From fc53c7ec6bbbe2cfca2448c7ecc8c11b006a2109 Mon Sep 17 00:00:00 2001 From: Loganaden Velvindron Date: Tue, 30 Jul 2024 20:12:14 +0400 Subject: [PATCH 1/2] CPU extension detection for arm64 on NetBSD. Joint work with Keelan Cannoo, Jeevesh Dindyal & UoM RICRG. Signed-off-by: Loganaden Velvindron --- src/common/common.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/common/common.c b/src/common/common.c index 6688b9b75..350fbc416 100644 --- a/src/common/common.c +++ b/src/common/common.c @@ -139,6 +139,48 @@ static void set_available_cpu_extensions(void) { } #endif } +#elif defined(__NetBSD__) || defined(__NetBSD) +#include +#include +#include + +static void set_available_cpu_extensions(void) { + /* mark that this function has been called */ + cpu_ext_data[OQS_CPU_EXT_INIT] = 1; + unsigned int cpu=0; + size_t len; + char impl_buf[8]; + int mib[2], ncpu; + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; + len = sizeof(ncpu); + if (sysctl(mib, 2, &ncpu, &len, NULL, 0) != 0) { + fprintf(stderr, "Error getting HWCAP for ARM on NetBSD\n"); + return; + } + + char path[128]; + struct aarch64_sysctl_cpu_id id; + + len = sizeof id; + snprintf(path, sizeof path, "machdep.cpu%d.cpu_id", cpu); + if (sysctlbyname(path, &id, &len, NULL, 0) != 0) { + fprintf(stderr, "Error getting HWCAP for ARM on NetBSD\n"); + return; + } + + /* extensions from aarch64-option-extensions.def */ + if (__SHIFTOUT(id.ac_aa64pfr0, ID_AA64PFR0_EL1_ADVSIMD) == ID_AA64PFR0_EL1_ADV_SIMD_IMPL) + cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1; + if (__SHIFTOUT(id.ac_aa64isar0, ID_AA64ISAR0_EL1_AES) == ID_AA64ISAR0_EL1_AES_AES) + cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1; + if ((__SHIFTOUT(id.ac_aa64isar0, ID_AA64ISAR0_EL1_SHA2) & ID_AA64ISAR0_EL1_SHA2_SHA256HSU) != 0) + cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1; + if ((__SHIFTOUT(id.ac_aa64isar0, ID_AA64ISAR0_EL1_SHA3) & ID_AA64ISAR0_EL1_SHA3_EOR3) != 0) + cpu_ext_data[OQS_CPU_EXT_ARM_SHA3] = 1; +} + #elif defined(_WIN32) static void set_available_cpu_extensions(void) { /* mark that this function has been called */ From 5e79056b5878fc14bc1b88b7f33bf4e0767ae678 Mon Sep 17 00:00:00 2001 From: Loganaden Velvindron Date: Tue, 30 Jul 2024 21:03:51 +0400 Subject: [PATCH 2/2] Fix styling issues reported by Jason Goertzen Signed-off-by: Loganaden Velvindron --- src/common/common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/common.c b/src/common/common.c index 350fbc416..0fdee2093 100644 --- a/src/common/common.c +++ b/src/common/common.c @@ -147,7 +147,7 @@ static void set_available_cpu_extensions(void) { static void set_available_cpu_extensions(void) { /* mark that this function has been called */ cpu_ext_data[OQS_CPU_EXT_INIT] = 1; - unsigned int cpu=0; + unsigned int cpu = 0; size_t len; char impl_buf[8]; int mib[2], ncpu; @@ -163,8 +163,8 @@ static void set_available_cpu_extensions(void) { char path[128]; struct aarch64_sysctl_cpu_id id; - len = sizeof id; - snprintf(path, sizeof path, "machdep.cpu%d.cpu_id", cpu); + len = sizeof(id); + snprintf(path, sizeof(path), "machdep.cpu%d.cpu_id", cpu); if (sysctlbyname(path, &id, &len, NULL, 0) != 0) { fprintf(stderr, "Error getting HWCAP for ARM on NetBSD\n"); return;