endif()
endif()
endif()
+ if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR
+ ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
+ if("${ARCH}" MATCHES "aarch64")
+ check_c_source_compiles(
+ "#include <sys/auxv.h>
+ int main() {
+ unsigned long hwcap;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_CRC32);
+ }"
+ ARM_AUXV_HAS_CRC32
+ )
+ if(ARM_AUXV_HAS_CRC32)
+ add_definitions(-DARM_AUXV_HAS_CRC32)
+ else()
+ message(STATUS "HWCAP_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
+ endif()
+ else()
+ check_c_source_compiles(
+ "#include <sys/auxv.h>
+ int main() {
+ unsigned long hwcap2;
+ elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
+ return (hwcap2 & HWCAP2_CRC32);
+ }"
+ ARM_AUXV_HAS_CRC32
+ )
+ if(ARM_AUXV_HAS_CRC32)
+ add_definitions(-DARM_AUXV_HAS_CRC32)
+ else()
+ message(STATUS "HWCAP2_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
+ endif()
+ check_c_source_compiles(
+ "#include <sys/auxv.h>
+ int main() {
+ unsigned long hwcap;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_NEON);
+ }"
+ ARM_AUXV_HAS_NEON
+ )
+ if(ARM_AUXV_HAS_NEON)
+ add_definitions(-DARM_AUXV_HAS_NEON)
+ else()
+ message(STATUS "HWCAP_NEON not present in sys/auxv.h; cannot detect support at runtime.")
+ endif()
+ endif()
+ endif()
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_functions.h)
if(WITH_RUNTIME_CPU_DETECTION)
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h)
#include "zbuild.h"
#include "arm_features.h"
-#if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
+#if defined(HAVE_SYS_AUXV_H)
# include <sys/auxv.h>
# ifdef ARM_ASM_HWCAP
# include <asm/hwcap.h>
#endif
static int arm_has_crc32(void) {
-#if defined(__linux__) && defined(ARM_AUXV_HAS_CRC32)
-# ifdef HWCAP_CRC32
- return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0 ? 1 : 0;
+#if defined(ARM_AUXV_HAS_CRC32)
+# if defined(__FreeBSD__) || defined(__OpenBSD__)
+# ifdef HWCAP_CRC32
+ unsigned long hwcap = 0;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_CRC32) != 0 ? 1 : 0;
+# else
+ unsigned long hwcap2 = 0;
+ elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
+ return (hwcap2 & HWCAP2_CRC32) != 0 ? 1 : 0;
+# endif
# else
- return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0 ? 1 : 0;
+# ifdef HWCAP_CRC32
+ return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0 ? 1 : 0;
+# else
+ return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0 ? 1 : 0;
+# endif
# endif
#elif defined(__FreeBSD__) && defined(__aarch64__)
return getenv("QEMU_EMULATING") == NULL
/* AArch64 has neon. */
#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
static inline int arm_has_neon(void) {
-#if defined(__linux__) && defined(ARM_AUXV_HAS_NEON)
-# ifdef HWCAP_ARM_NEON
- return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON) != 0 ? 1 : 0;
+#if defined(ARM_AUXV_HAS_NEON)
+# if defined(__FreeBSD__) || defined(__OpenBSD__)
+ unsigned long hwcap = 0;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_NEON) != 0 ? 1 : 0;
# else
- return (getauxval(AT_HWCAP) & HWCAP_NEON) != 0 ? 1 : 0;
+# ifdef HWCAP_ARM_NEON
+ return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON) != 0 ? 1 : 0;
+# else
+ return (getauxval(AT_HWCAP) & HWCAP_NEON) != 0 ? 1 : 0;
+# endif
# endif
#elif defined(__APPLE__)
int hasneon;
esac
# Simplify some later conditionals
+LINUX=0
+FREEBSD=0
+OPENBSD=0
+
case "$uname" in
Linux* | linux*)
LINUX=1 ;;
-*)
- LINUX=0 ;;
+FreeBSD*)
+ FREEBSD=1 ;;
+OpenBSD*)
+ OPENBSD=1 ;;
esac
# destination names for shared library if not defined above
fi
fi
+ if test $FREEBSD -eq 1 -o $OPENBSD -eq 1; then
+ if test "$ARCH" = "aarch64"; then
+ cat > $test.c <<EOF
+#include <sys/auxv.h>
+int main() {
+ unsigned long hwcap;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_CRC32);
+}
+EOF
+ if try $CC -c $CFLAGS $test.c; then
+ CFLAGS="${CFLAGS} -DARM_AUXV_HAS_CRC32"
+ SFLAGS="${SFLAGS} -DARM_AUXV_HAS_CRC32"
+ else
+ echo "HWCAP_CRC32 not present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
+ fi
+ else
+ cat > $test.c <<EOF
+#include <sys/auxv.h>
+int main() {
+ unsigned long hwcap2;
+ elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
+ return (hwcap2 & HWCAP2_CRC32);
+}
+EOF
+ if try $CC -c $CFLAGS $test.c; then
+ CFLAGS="${CFLAGS} -DARM_AUXV_HAS_CRC32"
+ SFLAGS="${SFLAGS} -DARM_AUXV_HAS_CRC32"
+ else
+ echo "HWCAP2_CRC32 not present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
+ fi
+
+ cat > $test.c <<EOF
+#include <sys/auxv.h>
+int main() {
+ unsigned long hwcap;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
+ return (hwcap & HWCAP_NEON);
+}
+EOF
+ if try $CC -c $CFLAGS $test.c; then
+ CFLAGS="${CFLAGS} -DARM_AUXV_HAS_NEON"
+ SFLAGS="${SFLAGS} -DARM_AUXV_HAS_NEON"
+ else
+ echo "HWCAP_NEON not present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
+ fi
+ fi
+ fi
+
if test $buildarmv8 -eq 1; then
check_armv8_intrinsics