Skip to content

Commit

Permalink
sysutils/cpuid2cpuflags: make the port build and work on ARM
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
Alexey Dokuchaev authored and Alexey Dokuchaev committed May 17, 2022
1 parent f30a25d commit 3951881
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions 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;
}

0 comments on commit 3951881

Please sign in to comment.