diff options
author | Alexey Dokuchaev <danfe@FreeBSD.org> | 2022-05-17 07:53:14 +0000 |
---|---|---|
committer | Alexey Dokuchaev <danfe@FreeBSD.org> | 2022-05-17 07:53:14 +0000 |
commit | 3951881016b76468ed9e558b26e23ab3d2a4d3db (patch) | |
tree | 2d604a8c355e3731c7c06190346208e23022809e /sysutils | |
parent | f30a25dc340f82f2f7b44594c2099c61b4945e24 (diff) | |
download | ports-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.c | 48 |
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; + } |