Differential D24026 Diff 69397 head/www/chromium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
Changeset View
Changeset View
Standalone View
Standalone View
head/www/chromium/files/patch-third__party_crc32c_src_src_crc32c__arm64__linux__check.h
--- third_party/crc32c/src/src/crc32c_arm64_linux_check.h.orig 2020-03-03 18:55:23 UTC | --- third_party/crc32c/src/src/crc32c_arm64_linux_check.h.orig 2020-03-03 18:55:23 UTC | ||||
+++ third_party/crc32c/src/src/crc32c_arm64_linux_check.h | +++ third_party/crc32c/src/src/crc32c_arm64_linux_check.h | ||||
@@ -7,8 +7,6 @@ | @@ -7,8 +7,6 @@ | ||||
#ifndef CRC32C_CRC32C_ARM_LINUX_CHECK_H_ | #ifndef CRC32C_CRC32C_ARM_LINUX_CHECK_H_ | ||||
#define CRC32C_CRC32C_ARM_LINUX_CHECK_H_ | #define CRC32C_CRC32C_ARM_LINUX_CHECK_H_ | ||||
-// X86-specific code checking for the availability of SSE4.2 instructions. | -// X86-specific code checking for the availability of SSE4.2 instructions. | ||||
- | - | ||||
#include <cstddef> | #include <cstddef> | ||||
#include <cstdint> | #include <cstdint> | ||||
@@ -16,30 +14,19 @@ | @@ -16,30 +14,25 @@ | ||||
#if HAVE_ARM64_CRC32C | #if HAVE_ARM64_CRC32C | ||||
-#if HAVE_STRONG_GETAUXVAL | -#if HAVE_STRONG_GETAUXVAL | ||||
-#include <sys/auxv.h> | -#include <sys/auxv.h> | ||||
-#elif HAVE_WEAK_GETAUXVAL | -#elif HAVE_WEAK_GETAUXVAL | ||||
-// getauxval() is not available on Android until API level 20. Link it as a weak | -// getauxval() is not available on Android until API level 20. Link it as a weak | ||||
-// symbol. | -// symbol. | ||||
-extern "C" unsigned long getauxval(unsigned long type) __attribute__((weak)); | -extern "C" unsigned long getauxval(unsigned long type) __attribute__((weak)); | ||||
- | +#include <sys/types.h> | ||||
+#include <machine/armreg.h> | |||||
-#define AT_HWCAP 16 | -#define AT_HWCAP 16 | ||||
-#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | -#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | ||||
- | +#ifndef ID_AA64ISAR0_AES_VAL | ||||
+#include <machine/armreg.h> | +#define ID_AA64ISAR0_AES_VAL ID_AA64ISAR0_AES | ||||
+#include <sys/types.h> | +#endif | ||||
+#ifndef ID_AA64ISAR0_CRC32_VAL | |||||
+#define ID_AA64ISAR0_CRC32_VAL ID_AA64ISAR0_CRC32 | |||||
+#endif | |||||
namespace crc32c { | namespace crc32c { | ||||
-inline bool CanUseArm64Linux() { | -inline bool CanUseArm64Linux() { | ||||
-#if HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | -#if HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | ||||
- // From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code. | - // From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code. | ||||
- constexpr unsigned long kHWCAP_PMULL = 1 << 4; | - constexpr unsigned long kHWCAP_PMULL = 1 << 4; | ||||
- constexpr unsigned long kHWCAP_CRC32 = 1 << 7; | - constexpr unsigned long kHWCAP_CRC32 = 1 << 7; | ||||
- unsigned long hwcap = (&getauxval != nullptr) ? getauxval(AT_HWCAP) : 0; | - unsigned long hwcap = (&getauxval != nullptr) ? getauxval(AT_HWCAP) : 0; | ||||
- return (hwcap & (kHWCAP_PMULL | kHWCAP_CRC32)) == | - return (hwcap & (kHWCAP_PMULL | kHWCAP_CRC32)) == | ||||
- (kHWCAP_PMULL | kHWCAP_CRC32); | - (kHWCAP_PMULL | kHWCAP_CRC32); | ||||
-#else | -#else | ||||
- return false; | - return false; | ||||
-#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | -#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL | ||||
-} | -} | ||||
+ inline bool CanUseArm64Linux() { | + inline bool CanUseArm64Linux() { | ||||
+ uint64_t id_aa64isar0; | + uint64_t id_aa64isar0; | ||||
+ | + | ||||
+ id_aa64isar0 = READ_SPECIALREG(ID_AA64ISAR0_EL1); | + id_aa64isar0 = READ_SPECIALREG(id_aa64isar0_el1); | ||||
+ if ((ID_AA64ISAR0_AES(id_aa64isar0) == ID_AA64ISAR0_AES_PMULL) && \ | + return ((ID_AA64ISAR0_AES_VAL(id_aa64isar0) == ID_AA64ISAR0_AES_PMULL) && | ||||
+ (ID_AA64ISAR0_CRC32(id_aa64isar0) == ID_AA64ISAR0_CRC32_BASE)) | + (ID_AA64ISAR0_CRC32_VAL(id_aa64isar0) == ID_AA64ISAR0_CRC32_BASE)); | ||||
+ return true; | |||||
+ return false; | |||||
+ } | + } | ||||
} // namespace crc32c | } // namespace crc32c | ||||