diff options
author | Jan Beich <jbeich@FreeBSD.org> | 2020-01-27 02:53:38 -0700 |
---|---|---|
committer | Jan Beich <jbeich@FreeBSD.org> | 2020-01-27 02:53:38 -0700 |
commit | 7321ac15302f49d581e311a9599d9cb93dfe6a9a (patch) | |
tree | b27de686eb2d8966619af0bb0e6a4d2ca6603c56 | |
parent | d4c672a56be7b509236ffd66f0521a929a957845 (diff) | |
download | nss-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.c | 16 |
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 |