From 66245bc5360ccff5d734bded0d22d436bc11b2a9 Mon Sep 17 00:00:00 2001 From: Mitchell Horne Date: Tue, 8 Sep 2020 15:39:19 +0000 Subject: [PATCH] arm64: check for CRC32 support via HWCAP Doing it this way eliminates the assumption about homogeneous support for the feature, since HWCAP values are only set if support is present on all CPUs. Reviewed by: tuexen, markj MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26032 --- sys/libkern/gsb_crc32.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sys/libkern/gsb_crc32.c b/sys/libkern/gsb_crc32.c index 81583567ce84..b2f7421c20eb 100644 --- a/sys/libkern/gsb_crc32.c +++ b/sys/libkern/gsb_crc32.c @@ -58,7 +58,8 @@ __FBSDID("$FreeBSD$"); #endif #if defined(__aarch64__) -#include +#include +#include #endif #endif /* _KERNEL */ @@ -755,14 +756,7 @@ calculate_crc32c(uint32_t crc32c, } else #endif #if defined(__aarch64__) - uint64_t reg; - - /* - * We only test for CRC32 support on the CPU with index 0 assuming that - * this applies to all CPUs. - */ - reg = READ_SPECIALREG(id_aa64isar0_el1); - if (ID_AA64ISAR0_CRC32_VAL(reg) != ID_AA64ISAR0_CRC32_NONE) { + if ((elf_hwcap & HWCAP_CRC32) != 0) { return (armv8_crc32c(crc32c, buffer, length)); } else #endif