summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beich <jbeich@FreeBSD.org>2020-01-27 02:53:38 -0700
committerJan Beich <jbeich@FreeBSD.org>2020-01-27 02:53:38 -0700
commit7321ac15302f49d581e311a9599d9cb93dfe6a9a (patch)
treeb27de686eb2d8966619af0bb0e6a4d2ca6603c56
parentd4c672a56be7b509236ffd66f0521a929a957845 (diff)
downloadnss-hg-7321ac15302f49d581e311a9599d9cb93dfe6a9a.tar.gz
Bug 1609181 - Detect ARM CPU features on FreeBSD. r=jcj
Implement `getauxval` via `elf_aux_info` to avoid code duplication. `AT_HWCAP*` can be used on powerpc* and riscv64 as well.
-rw-r--r--lib/freebl/blinit.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/freebl/blinit.c b/lib/freebl/blinit.c
index 4723d3bb1..d76bf9627 100644
--- a/lib/freebl/blinit.c
+++ b/lib/freebl/blinit.c
@@ -122,6 +122,22 @@ extern unsigned long getauxval(unsigned long type) __attribute__((weak));
static unsigned long (*getauxval)(unsigned long) = NULL;
#endif /* defined(__GNUC__) && __GNUC__ >= 2 && defined(__ELF__)*/
+#if defined(__FreeBSD__) && !defined(__aarch64__) && __has_include(<sys/auxv.h>)
+/* Avoid conflict with static declaration above */
+#define getauxval freebl_getauxval
+static unsigned long getauxval(unsigned long type)
+{
+ /* Only AT_HWCAP* return unsigned long */
+ if (type != AT_HWCAP && type != AT_HWCAP2) {
+ return 0;
+ }
+
+ unsigned long ret = 0;
+ elf_aux_info(type, &ret, sizeof(ret));
+ return ret;
+}
+#endif
+
#ifndef AT_HWCAP2
#define AT_HWCAP2 26
#endif