diff options
author | Piotr Kubaj <pkubaj@FreeBSD.org> | 2020-01-27 11:01:29 +0000 |
---|---|---|
committer | Piotr Kubaj <pkubaj@FreeBSD.org> | 2020-01-27 11:01:29 +0000 |
commit | 8a8f36e6c7b5a2eb2e80346f52b2b92544925bb6 (patch) | |
tree | 9fa2d9b9496f99509586f60a41df99bcfda4f62a | |
parent | 7321ac15302f49d581e311a9599d9cb93dfe6a9a (diff) | |
download | nss-hg-8a8f36e6c7b5a2eb2e80346f52b2b92544925bb6.tar.gz |
Bug 1602386 - Fix build on FreeBSD/powerpc platforms. r=jcj
FreeBSD has elf_aux_info instead of getauxval, but only since FreeBSD 12. Previous versions (11 is still supported) don't have any equivalent and users need to query sysctl manually.
Differential Revision: https://phabricator.services.mozilla.com/D56712
-rw-r--r-- | lib/freebl/Makefile | 4 | ||||
-rw-r--r-- | lib/freebl/blinit.c | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/freebl/Makefile b/lib/freebl/Makefile index d94cb0d48..eafa0da31 100644 --- a/lib/freebl/Makefile +++ b/lib/freebl/Makefile @@ -778,7 +778,9 @@ $(OBJDIR)/$(PROG_PREFIX)gcm-aarch64$(OBJ_SUFFIX): CFLAGS += -march=armv8-a+crypt endif ifeq ($(CPU_ARCH),ppc) -$(OBJDIR)/$(PROG_PREFIX)gcm-ppc$(OBJ_SUFFIX): CFLAGS += -mcrypto -maltivec +$(OBJDIR)/$(PROG_PREFIX)gcm-ppc$(OBJ_SUFFIX): CFLAGS += -mcrypto -maltivec -mvsx +$(OBJDIR)/$(PROG_PREFIX)gcm$(OBJ_SUFFIX): CFLAGS += -mcrypto -maltivec -mvsx +$(OBJDIR)/$(PROG_PREFIX)rijndael$(OBJ_SUFFIX): CFLAGS += -mcrypto -maltivec -mvsx endif $(OBJDIR)/$(PROG_PREFIX)Hacl_Chacha20_Vec128$(OBJ_SUFFIX): CFLAGS += -mssse3 -msse4 -mavx -maes diff --git a/lib/freebl/blinit.c b/lib/freebl/blinit.c index d76bf9627..01f036ea7 100644 --- a/lib/freebl/blinit.c +++ b/lib/freebl/blinit.c @@ -431,7 +431,11 @@ ppc_crypto_support() #if defined(__powerpc__) +#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 12) #include <sys/auxv.h> +#elif (defined(__FreeBSD__) && __FreeBSD__ < 12) +#include <sys/sysctl.h> +#endif // Defines from cputable.h in Linux kernel - PPC, letting us build on older kernels #ifndef PPC_FEATURE2_VEC_CRYPTO @@ -443,7 +447,17 @@ CheckPPCSupport() { char *disable_hw_crypto = PR_GetEnvSecure("NSS_DISABLE_PPC_GHASH"); - long hwcaps = getauxval(AT_HWCAP2); + unsigned long hwcaps = 0; +#if defined(__linux__) + hwcaps = getauxval(AT_HWCAP2); +#elif defined(__FreeBSD__) +# if __FreeBSD__ >= 12 + elf_aux_info(AT_HWCAP2, &hwcaps, sizeof(hwcaps)); +# else + size_t len = sizeof(hwcaps); + sysctlbyname("hw.cpu_features2", &hwcaps, &len, NULL, 0); +# endif +#endif ppc_crypto_support_ = hwcaps & PPC_FEATURE2_VEC_CRYPTO && disable_hw_crypto == NULL; } |