From 3721c7fe276dbbc93e584359f87913e58f96626e Mon Sep 17 00:00:00 2001 From: Sitsofe Wheeler Date: Mon, 6 Dec 2021 20:02:53 +0000 Subject: [PATCH] os: detect PMULL support before enabling accelerated crc32c on ARM Issue #1239 shows a crash on a FUJITSU/A64FX ARM platform at the following line: crc/crc32c-arm64.c: 64 t1 = (uint64_t)vmull_p64(crc1, k2); On armv8 PMULL crypto instructions like vmull_p64 are defined as optional (see https://github.com/google/crc32c/pull/6#issuecomment-328713398 and https://github.com/dotnet/runtime/issues/35143#issuecomment-617263508 ). Avoid the crash by gating use of the hardware accelerated ARM crc32c path behind runtime detection of PMULL. Fixes: https://github.com/axboe/fio/issues/1239 Signed-off-by: Sitsofe Wheeler Tested-by: Yi Zhang Signed-off-by: Pavel Reichl --- os/os-linux.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/os/os-linux.h b/os/os-linux.h index 808f1d02..3001140c 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -20,6 +20,9 @@ #ifdef ARCH_HAVE_CRC_CRYPTO #include +#ifndef HWCAP_PMULL +#define HWCAP_PMULL (1 << 4) +#endif /* HWCAP_PMULL */ #ifndef HWCAP_CRC32 #define HWCAP_CRC32 (1 << 7) #endif /* HWCAP_CRC32 */ @@ -405,7 +408,8 @@ static inline bool os_cpu_has(cpu_features feature) #ifdef ARCH_HAVE_CRC_CRYPTO case CPU_ARM64_CRC32C: hwcap = getauxval(AT_HWCAP); - have_feature = (hwcap & HWCAP_CRC32) != 0; + have_feature = (hwcap & (HWCAP_PMULL | HWCAP_CRC32)) == + (HWCAP_PMULL | HWCAP_CRC32); break; #endif default: -- 2.38.1