Skip to content

Commit 8e597d1

Browse files
authored
Adds ARM CPU feature detection for FreeBSD and OpenBSD (#238)
Adds ARM CPU feature detection for FreeBSD and OpenBSD
1 parent 4d4f4e8 commit 8e597d1

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

src/core/openjph/ojph_arch.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ namespace ojph {
108108
#define OJPH_OS_ANDROID
109109
#elif (defined __linux)
110110
#define OJPH_OS_LINUX
111+
#elif (defined __FreeBSD__)
112+
#define OJPH_OS_FREEBSD
113+
#elif (defined __OpenBSD__)
114+
#define OJPH_OS_OPENBSD
111115
#endif
112116

113117
/////////////////////////////////////////////////////////////////////////////

src/core/others/ojph_arch.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,23 +161,32 @@ namespace ojph {
161161
}
162162
#elif defined(OJPH_ARCH_ARM)
163163

164-
#ifndef OJPH_OS_LINUX //Windows/Apple/Android
164+
#if !defined(OJPH_OS_LINUX) && !defined(OJPH_OS_FREEBSD) && !defined(OJPH_OS_OPENBSD) // Windows/Apple/Android
165165

166166
bool init_cpu_ext_level(int& level) {
167167
level = ARM_CPU_EXT_LEVEL_ASIMD;
168168
return true;
169169
}
170170

171-
#else // Linux
171+
#else // Linux/FreeBSD/OpenBSD
172172

173173
#if defined(__aarch64__) || defined(_M_ARM64) // 64-bit ARM
174174

175175
#include <sys/auxv.h>
176-
#include <asm/hwcap.h>
176+
#ifdef OJPH_OS_LINUX
177+
#include <asm/hwcap.h>
178+
#endif
177179

178180
bool init_cpu_ext_level(int& level) {
179-
unsigned long hwcaps = getauxval(AT_HWCAP);
180-
unsigned long hwcaps2 = getauxval(AT_HWCAP2);
181+
#ifdef OJPH_OS_LINUX
182+
unsigned long hwcaps = getauxval(AT_HWCAP);
183+
unsigned long hwcaps2 = getauxval(AT_HWCAP2);
184+
#else
185+
unsigned long hwcaps = 0;
186+
unsigned long hwcaps2 = 0;
187+
elf_aux_info(AT_HWCAP, &hwcaps, sizeof(hwcaps));
188+
elf_aux_info(AT_HWCAP2, &hwcaps2, sizeof(hwcaps2));
189+
#endif
181190

182191
level = ARM_CPU_EXT_LEVEL_GENERIC;
183192
if (hwcaps & HWCAP_ASIMD) {
@@ -194,10 +203,17 @@ namespace ojph {
194203
#else // 32-bit ARM
195204

196205
#include <sys/auxv.h>
197-
#include <asm/hwcap.h>
206+
#ifdef OJPH_OS_LINUX
207+
#include <asm/hwcap.h>
208+
#endif
198209

199210
bool init_cpu_ext_level(int& level) {
200-
unsigned long hwcaps = getauxval(AT_HWCAP);
211+
#ifdef OJPH_OS_LINUX
212+
unsigned long hwcaps = getauxval(AT_HWCAP);
213+
#else
214+
unsigned long hwcaps = 0;
215+
elf_aux_info(AT_HWCAP, &hwcaps, sizeof(hwcaps));
216+
#endif
201217
level = ARM_CPU_EXT_LEVEL_GENERIC;
202218
if (hwcaps & HWCAP_NEON)
203219
level = ARM_CPU_EXT_LEVEL_NEON;

0 commit comments

Comments
 (0)