diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index e589e42983..ace938da51 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 90cc0f7b44..b3213321e5 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")) {