opnsense-ports/multimedia/dav1d/files/patch-neon

76 lines
2.2 KiB
Plaintext

- Assume NEON on FreeBSD armv7
- Implement NEON runtime detection on FreeBSD armv6
--- meson.build.orig 2018-12-11 14:14:56 UTC
+++ meson.build
@@ -147,6 +147,9 @@ if (host_machine.cpu_family() == 'aarch64' or
if cc.has_function('getauxval', prefix : '#include <sys/auxv.h>', args : test_args)
cdata.set('HAVE_GETAUXVAL', 1)
endif
+ if cc.has_function('elf_aux_info', prefix : '#include <sys/auxv.h>', args : test_args)
+ cdata.set('HAVE_ELF_AUX_INFO', 1)
+ endif
endif
# Compiler flag tests
--- src/arm/cpu.c.orig 2018-12-11 14:14:56 UTC
+++ src/arm/cpu.c
@@ -29,7 +29,7 @@
#include "src/arm/cpu.h"
-#if defined(HAVE_GETAUXVAL) && ARCH_ARM
+#if (defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO)) && ARCH_ARM
#include <sys/auxv.h>
#ifndef HWCAP_ARM_NEON
@@ -68,12 +68,48 @@ static unsigned parse_proc_cpuinfo(const char *flag) {
}
#endif
+#if defined(__FreeBSD__) && __FreeBSD__ < 12
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <elf.h>
+#include <errno.h>
+#include <unistd.h>
+
+#define HAVE_GETAUXVAL
+#define NEON_HWCAP HWCAP_NEON
+static unsigned long getauxval(unsigned long type) {
+ Elf_Auxinfo auxv[AT_COUNT];
+ size_t len = sizeof(auxv);
+ int mib[] = {
+ CTL_KERN,
+ KERN_PROC,
+ KERN_PROC_AUXV,
+ getpid(),
+ };
+
+ if (sysctl(mib, nitems(mib), auxv, &len, NULL, 0) != -1) {
+ for (size_t i = 0; i < nitems(auxv); i++)
+ if ((unsigned long)auxv[i].a_type == type)
+ return auxv[i].a_un.a_val;
+
+ errno = ENOENT;
+ }
+ return 0;
+}
+#endif
+
unsigned dav1d_get_cpu_flags_arm(void) {
unsigned flags = 0;
#if ARCH_AARCH64
flags |= DAV1D_ARM_CPU_FLAG_NEON;
+#elif defined(__ARM_NEON)
+ flags |= DAV1D_ARM_CPU_FLAG_NEON;
#elif defined(HAVE_GETAUXVAL) && ARCH_ARM
unsigned long hw_cap = getauxval(AT_HWCAP);
+ flags |= (hw_cap & NEON_HWCAP) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
+#elif defined(HAVE_ELF_AUX_INFO) && ARCH_ARM
+ unsigned long hw_cap;
+ elf_aux_info(AT_HWCAP, &hw_cap, sizeof(hw_cap));
flags |= (hw_cap & NEON_HWCAP) ? DAV1D_ARM_CPU_FLAG_NEON : 0;
#elif defined(__ANDROID__)
flags |= parse_proc_cpuinfo("neon") ? DAV1D_ARM_CPU_FLAG_NEON : 0;