From 021e0dde7d76854758daa2212e358deddde29925 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 30 Dec 2024 04:38:09 -0500 Subject: [PATCH] ArmCPUDetect: Add OpenBSD support for elf_aux_info --- Source/CMakeLists.txt | 5 +++++ Source/Core/Common/ArmCPUDetect.cpp | 27 ++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index e589e4298366..ace938da5173 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -68,6 +68,11 @@ endif() add_definitions(-D__STDC_LIMIT_MACROS) add_definitions(-D__STDC_CONSTANT_MACROS) +check_symbol_exists(elf_aux_info sys/auxv.h HAVE_ELF_AUX_INFO) +if(HAVE_ELF_AUX_INFO) + add_definitions(-DHAVE_ELF_AUX_INFO) +endif() + add_subdirectory(Core) if (ANDROID) add_subdirectory(Android/jni) diff --git a/Source/Core/Common/ArmCPUDetect.cpp b/Source/Core/Common/ArmCPUDetect.cpp index 90cc0f7b44a4..b3213321e596 100644 --- a/Source/Core/Common/ArmCPUDetect.cpp +++ b/Source/Core/Common/ArmCPUDetect.cpp @@ -18,13 +18,16 @@ #elif defined(__linux__) #include #include -#elif defined(__FreeBSD__) +#elif defined(HAVE_ELF_AUX_INFO) #include #elif defined(__OpenBSD__) #include #include -#include +#endif + +#ifdef __OpenBSD__ #include +#include #endif #include @@ -142,13 +145,13 @@ static bool Read_MIDR_EL1_Sysfs(u64* value) #endif -#if defined(__linux__) || defined(__FreeBSD__) +#if defined(__linux__) || defined(HAVE_ELF_AUX_INFO) static u32 ReadHwCap(u32 type) { #if defined(__linux__) return getauxval(type); -#elif defined(__FreeBSD__) +#elif defined(HAVE_ELF_AUX_INFO) u_long hwcap = 0; elf_aux_info(type, &hwcap, sizeof(hwcap)); return hwcap; @@ -189,7 +192,7 @@ static bool Read_MIDR_EL1(u64* value) #endif -#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__) +#if defined(_WIN32) || defined(__linux__) || defined(HAVE_ELF_AUX_INFO) static std::string MIDRToString(u64 midr) { @@ -254,11 +257,21 @@ void CPUInfo::Detect() { cpu_id = MIDRToString(reg); } -#elif defined(__linux__) || defined(__FreeBSD__) - // Linux, Android, and FreeBSD +#elif defined(__linux__) || defined(HAVE_ELF_AUX_INFO) + // Linux, Android, FreeBSD and OpenBSD with elf_aux_info #if defined(__FreeBSD__) SysctlByName(&model_name, "hw.model"); +#elif defined(__OpenBSD__) + int mib[2]; + size_t len; + char hwmodel[256]; + + mib[0] = CTL_HW; + mib[1] = HW_MODEL; + len = std::size(hwmodel); + if (sysctl(mib, 2, &hwmodel, &len, nullptr, 0) != -1) + model_name = std::string(hwmodel, len - 1); #elif defined(__linux__) if (!ReadDeviceTree(&model_name, "model")) {