aboutsummaryrefslogtreecommitdiff
path: root/sysutils
diff options
context:
space:
mode:
authorAlexey Dokuchaev <danfe@FreeBSD.org>2022-05-17 07:53:14 +0000
committerAlexey Dokuchaev <danfe@FreeBSD.org>2022-05-17 07:53:14 +0000
commit3951881016b76468ed9e558b26e23ab3d2a4d3db (patch)
tree2d604a8c355e3731c7c06190346208e23022809e /sysutils
parentf30a25dc340f82f2f7b44594c2099c61b4945e24 (diff)
downloadports-3951881016b76468ed9e558b26e23ab3d2a4d3db.tar.gz
ports-3951881016b76468ed9e558b26e23ab3d2a4d3db.zip
sysutils/cpuid2cpuflags: make the port build and work on ARM
- Replace getauxval(3), a non-standard glibc extension, with our native elf_aux_info(3) call - Return features supported by the specific machine processor architecture (uname -p) rather than the hardware platform (uname -m), because the latter is too vague on FreeBSD/arm PR: 258445 Reported by: pkg-fallout
Diffstat (limited to 'sysutils')
-rw-r--r--sysutils/cpuid2cpuflags/files/patch-src_hwcap.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/sysutils/cpuid2cpuflags/files/patch-src_hwcap.c b/sysutils/cpuid2cpuflags/files/patch-src_hwcap.c
new file mode 100644
index 000000000000..89c88e4f92b8
--- /dev/null
+++ b/sysutils/cpuid2cpuflags/files/patch-src_hwcap.c
@@ -0,0 +1,48 @@
+--- src/hwcap.c.orig 2020-07-13 17:14:55 UTC
++++ src/hwcap.c
+@@ -14,13 +14,19 @@
+ #ifdef HAVE_SYS_AUXV_H
+ # include <sys/auxv.h>
+ #endif
++#ifdef __FreeBSD__
++#include <sys/sysctl.h>
++#else
+ #include <sys/utsname.h>
+-
+-#ifndef __linux__
+-# error "Platform not supported (only Linux supported at the moment)"
+ #endif
++
+ #ifndef HAVE_GETAUXVAL
+-# error "Platform not supported (no getauxval())"
++static unsigned long getauxval(int aux)
++{
++ unsigned long auxval = 0;
++ elf_aux_info(aux, &auxval, sizeof(auxval));
++ return auxval;
++}
+ #endif
+
+ #include "hwcap.h"
+@@ -53,9 +59,21 @@ unsigned long get_hwcap2()
+ */
+ char* get_uname_machine()
+ {
++#ifdef __FreeBSD__
++ /**
++ * Contrary to this code expectation, on FreeBSD/arm, `uname -m'
++ * is always `arm', so we return more unique `uname -p' instead.
++ */
++ int mib[] = { CTL_HW, HW_MACHINE_ARCH };
++ static char buf[48];
++ size_t len = sizeof(buf);
++ if (sysctl(mib, 2, &buf, &len, NULL, 0) == 0)
++ return buf;
++#else
+ static struct utsname uname_res;
+ if (uname(&uname_res) != -1)
+ return uname_res.machine;
++#endif
+ else
+ return NULL;
+ }