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
This commit is contained in:
Mitchell Horne 2020-09-08 15:39:19 +00:00
parent 752eb6a995
commit 66245bc536

View File

@ -58,7 +58,8 @@ __FBSDID("$FreeBSD$");
#endif
#if defined(__aarch64__)
#include <machine/cpu.h>
#include <machine/elf.h>
#include <machine/md_var.h>
#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