OSDN Git Service

crypto: arm - use Kconfig based compiler checks for crypto opcodes
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 11 Oct 2019 09:08:00 +0000 (11:08 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 23 Oct 2019 08:46:56 +0000 (19:46 +1100)
Instead of allowing the Crypto Extensions algorithms to be selected when
using a toolchain that does not support them, and complain about it at
build time, use the information we have about the compiler to prevent
them from being selected in the first place. Users that are stuck with
a GCC version <4.8 are unlikely to care about these routines anyway, and
it cleans up the Makefile considerably.

While at it, add explicit 'armv8-a' CPU specifiers to the code that uses
the 'crypto-neon-fp-armv8' FPU specifier so we don't regress Clang, which
will complain about this in version 10 and later.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm/crypto/Kconfig
arch/arm/crypto/Makefile
arch/arm/crypto/aes-ce-core.S
arch/arm/crypto/crct10dif-ce-core.S
arch/arm/crypto/ghash-ce-core.S
arch/arm/crypto/sha1-ce-core.S
arch/arm/crypto/sha2-ce-core.S

index b24df84..9f257c1 100644 (file)
@@ -30,7 +30,7 @@ config CRYPTO_SHA1_ARM_NEON
 
 config CRYPTO_SHA1_ARM_CE
        tristate "SHA1 digest algorithm (ARM v8 Crypto Extensions)"
-       depends on KERNEL_MODE_NEON
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
        select CRYPTO_SHA1_ARM
        select CRYPTO_HASH
        help
@@ -39,7 +39,7 @@ config CRYPTO_SHA1_ARM_CE
 
 config CRYPTO_SHA2_ARM_CE
        tristate "SHA-224/256 digest algorithm (ARM v8 Crypto Extensions)"
-       depends on KERNEL_MODE_NEON
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
        select CRYPTO_SHA256_ARM
        select CRYPTO_HASH
        help
@@ -96,7 +96,7 @@ config CRYPTO_AES_ARM_BS
 
 config CRYPTO_AES_ARM_CE
        tristate "Accelerated AES using ARMv8 Crypto Extensions"
-       depends on KERNEL_MODE_NEON
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
        select CRYPTO_BLKCIPHER
        select CRYPTO_SIMD
        help
@@ -105,7 +105,7 @@ config CRYPTO_AES_ARM_CE
 
 config CRYPTO_GHASH_ARM_CE
        tristate "PMULL-accelerated GHASH using NEON/ARMv8 Crypto Extensions"
-       depends on KERNEL_MODE_NEON
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
        select CRYPTO_HASH
        select CRYPTO_CRYPTD
        select CRYPTO_GF128MUL
@@ -117,12 +117,14 @@ config CRYPTO_GHASH_ARM_CE
 
 config CRYPTO_CRCT10DIF_ARM_CE
        tristate "CRCT10DIF digest algorithm using PMULL instructions"
-       depends on KERNEL_MODE_NEON && CRC_T10DIF
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
+       depends on CRC_T10DIF
        select CRYPTO_HASH
 
 config CRYPTO_CRC32_ARM_CE
        tristate "CRC32(C) digest algorithm using CRC and/or PMULL instructions"
-       depends on KERNEL_MODE_NEON && CRC32
+       depends on KERNEL_MODE_NEON && (CC_IS_CLANG || GCC_VERSION >= 40800)
+       depends on CRC32
        select CRYPTO_HASH
 
 config CRYPTO_CHACHA20_NEON
index 4180f3a..c0d3677 100644 (file)
@@ -12,32 +12,12 @@ obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
 obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
 obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
 
-ce-obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
-ce-obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o
-ce-obj-$(CONFIG_CRYPTO_SHA2_ARM_CE) += sha2-arm-ce.o
-ce-obj-$(CONFIG_CRYPTO_GHASH_ARM_CE) += ghash-arm-ce.o
-ce-obj-$(CONFIG_CRYPTO_CRCT10DIF_ARM_CE) += crct10dif-arm-ce.o
-crc-obj-$(CONFIG_CRYPTO_CRC32_ARM_CE) += crc32-arm-ce.o
-
-ifneq ($(crc-obj-y)$(crc-obj-m),)
-ifeq ($(call as-instr,.arch armv8-a\n.arch_extension crc,y,n),y)
-ce-obj-y += $(crc-obj-y)
-ce-obj-m += $(crc-obj-m)
-else
-$(warning These CRC Extensions modules need binutils 2.23 or higher)
-$(warning $(crc-obj-y) $(crc-obj-m))
-endif
-endif
-
-ifneq ($(ce-obj-y)$(ce-obj-m),)
-ifeq ($(call as-instr,.fpu crypto-neon-fp-armv8,y,n),y)
-obj-y += $(ce-obj-y)
-obj-m += $(ce-obj-m)
-else
-$(warning These ARMv8 Crypto Extensions modules need binutils 2.23 or higher)
-$(warning $(ce-obj-y) $(ce-obj-m))
-endif
-endif
+obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
+obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o
+obj-$(CONFIG_CRYPTO_SHA2_ARM_CE) += sha2-arm-ce.o
+obj-$(CONFIG_CRYPTO_GHASH_ARM_CE) += ghash-arm-ce.o
+obj-$(CONFIG_CRYPTO_CRCT10DIF_ARM_CE) += crct10dif-arm-ce.o
+obj-$(CONFIG_CRYPTO_CRC32_ARM_CE) += crc32-arm-ce.o
 
 aes-arm-y      := aes-cipher-core.o aes-cipher-glue.o
 aes-arm-bs-y   := aes-neonbs-core.o aes-neonbs-glue.o
index b978cdf..4d17073 100644 (file)
@@ -9,6 +9,7 @@
 #include <asm/assembler.h>
 
        .text
+       .arch           armv8-a
        .fpu            crypto-neon-fp-armv8
        .align          3
 
index 86be258..46c02c5 100644 (file)
@@ -72,7 +72,7 @@
 #endif
 
        .text
-       .arch           armv7-a
+       .arch           armv8-a
        .fpu            crypto-neon-fp-armv8
 
        init_crc        .req    r0
index c47fe81..534c964 100644 (file)
@@ -88,6 +88,7 @@
        T3_H            .req    d17
 
        .text
+       .arch           armv8-a
        .fpu            crypto-neon-fp-armv8
 
        .macro          __pmull_p64, rd, rn, rm, b1, b2, b3, b4
index 49a74a4..8a702e0 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/assembler.h>
 
        .text
+       .arch           armv8-a
        .fpu            crypto-neon-fp-armv8
 
        k0              .req    q0
index 4ad5175..b6369d2 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/assembler.h>
 
        .text
+       .arch           armv8-a
        .fpu            crypto-neon-fp-armv8
 
        k0              .req    q7