From 863a41c2f343394f77d84ef1487a15dcf5a3b905 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Sun, 18 Aug 2024 03:03:12 -0400 Subject: [PATCH] Add Arm RTCD for OpenBSD Also fix FreeBSD CMake support on ARM. --- CMakeLists.txt | 3 ++- celt/arm/armcpu.c | 34 +++++++++++++++++++++++++++++++++- cmake/OpusConfig.cmake | 1 + cmake/OpusFunctions.cmake | 6 +++--- configure.ac | 2 +- meson.build | 1 + 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aedfbea6b..a212509fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -590,7 +590,8 @@ endif() target_compile_definitions(opus PRIVATE $<$:HAVE_LRINT> - $<$:HAVE_LRINTF>) + $<$:HAVE_LRINTF> + $<$:HAVE_ELF_AUX_INFO>) if(OPUS_BUILD_FRAMEWORK) set_target_properties(opus PROPERTIES diff --git a/celt/arm/armcpu.c b/celt/arm/armcpu.c index 6785121ac..36733b4cf 100644 --- a/celt/arm/armcpu.c +++ b/celt/arm/armcpu.c @@ -191,7 +191,7 @@ static opus_uint32 opus_cpu_capabilities(void) return flags; } -#elif defined(__FreeBSD__) +#elif defined(HAVE_ELF_AUX_INFO) #include static opus_uint32 opus_cpu_capabilities(void) @@ -239,6 +239,38 @@ static opus_uint32 opus_cpu_capabilities(void) return (flags); } +#elif defined(__OpenBSD__) +#include +#include +#include +#include + +static opus_uint32 opus_cpu_capabilities(void) +{ + opus_uint32 flags = 0; + +#if defined(OPUS_ARM_MAY_HAVE_DOTPROD) && defined(CPU_ID_AA64ISAR0) + const int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 }; + uint64_t isar0; + size_t len = sizeof(isar0); + + if (sysctl(isar0_mib, 2, &isar0, &len, NULL, 0) != -1) + { + if (ID_AA64ISAR0_DP(isar0) >= ID_AA64ISAR0_DP_IMPL) + flags |= OPUS_CPU_ARM_DOTPROD_FLAG; + } +#endif + +#if defined(OPUS_ARM_PRESUME_NEON_INTR) \ + || defined(OPUS_ARM_PRESUME_AARCH64_NEON_INTR) + flags |= OPUS_CPU_ARM_EDSP_FLAG | OPUS_CPU_ARM_MEDIA_FLAG | OPUS_CPU_ARM_NEON_FLAG; +# if defined(OPUS_ARM_PRESUME_DOTPROD) + flags |= OPUS_CPU_ARM_DOTPROD_FLAG; +# endif +#endif + return flags; +} + #else /* The feature registers which can tell us what the processor supports are * accessible in priveleged modes only, so we can't have a general user-space diff --git a/cmake/OpusConfig.cmake b/cmake/OpusConfig.cmake index 686471331..e9319fbad 100644 --- a/cmake/OpusConfig.cmake +++ b/cmake/OpusConfig.cmake @@ -48,6 +48,7 @@ endif() check_symbol_exists(lrintf "math.h" HAVE_LRINTF) check_symbol_exists(lrint "math.h" HAVE_LRINT) +check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO) cmake_pop_check_state() if(CMAKE_SYSTEM_PROCESSOR MATCHES "(i[0-9]86|x86|X86|amd64|AMD64|x86_64)") diff --git a/cmake/OpusFunctions.cmake b/cmake/OpusFunctions.cmake index eb308151c..2db77d7f8 100644 --- a/cmake/OpusFunctions.cmake +++ b/cmake/OpusFunctions.cmake @@ -166,9 +166,9 @@ function(opus_supports_cpu_detection RUNTIME_CPU_CAPABILITY_DETECTION) endif() endif() elseif(OPUS_CPU_ARM) - # ARM cpu detection is implemented for Windows and anything - # using a Linux kernel (such as Android). - if (CMAKE_SYSTEM_NAME MATCHES "(Windows|Linux|Android)") + # ARM cpu detection is implemented for Windows, Linux, Android, FreeBSD + # and OpenBSD. + if (CMAKE_SYSTEM_NAME MATCHES "(Windows|Linux|Android|FreeBSD|OpenBSD)") set(RUNTIME_CPU_CAPABILITY_DETECTION 1 PARENT_SCOPE) endif () else() diff --git a/configure.ac b/configure.ac index 5469c8e6a..4582b1c83 100644 --- a/configure.ac +++ b/configure.ac @@ -1040,7 +1040,7 @@ AC_CHECK_FUNCS([lrintf]) AC_CHECK_FUNCS([lrint]) LIBS="$saved_LIBS" -AC_CHECK_FUNCS([__malloc_hook]) +AC_CHECK_FUNCS([__malloc_hook elf_aux_info]) AC_SUBST([PC_BUILD]) diff --git a/meson.build b/meson.build index d040ddfd7..aadf7caf3 100644 --- a/meson.build +++ b/meson.build @@ -83,6 +83,7 @@ libm = cc.find_library('m', required : false) opus_conf.set('HAVE_LRINTF', cc.has_function('lrintf', prefix: '#include ', dependencies: libm)) opus_conf.set('HAVE_LRINT', cc.has_function('lrint', prefix: '#include ', dependencies: libm)) opus_conf.set('HAVE___MALLOC_HOOK', cc.has_function('__malloc_hook', prefix: '#include ')) +opus_conf.set('HAVE_ELF_AUX_INFO', cc.has_function('elf_aux_info', prefix: '#include ')) opus_conf.set('HAVE_STDINT_H', cc.check_header('stdint.h')) # Check for restrict keyword