x86: update AS_* macros to binutils >=2.23, supporting ADX and AVX2
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 26 Mar 2020 20:26:00 +0000 (14:26 -0600)
committerMasahiro Yamada <masahiroy@kernel.org>
Wed, 8 Apr 2020 15:12:48 +0000 (00:12 +0900)
Now that the kernel specifies binutils 2.23 as the minimum version, we
can remove ifdefs for AVX2 and ADX throughout.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
21 files changed:
arch/x86/Kconfig.assembler
arch/x86/crypto/Makefile
arch/x86/crypto/aesni-intel_avx-x86_64.S
arch/x86/crypto/aesni-intel_glue.c
arch/x86/crypto/chacha_glue.c
arch/x86/crypto/poly1305-x86_64-cryptogams.pl
arch/x86/crypto/poly1305_glue.c
arch/x86/crypto/sha1_ssse3_glue.c
arch/x86/crypto/sha256-avx2-asm.S
arch/x86/crypto/sha256_ssse3_glue.c
arch/x86/crypto/sha512-avx2-asm.S
arch/x86/crypto/sha512_ssse3_glue.c
crypto/Kconfig
lib/raid6/algos.c
lib/raid6/avx2.c
lib/raid6/recov_avx2.c
lib/raid6/test/Makefile
net/netfilter/Makefile
net/netfilter/nf_tables_api.c
net/netfilter/nft_set_pipapo.c
net/netfilter/nft_set_pipapo_avx2.h

index a5a1d2766b3a8e7f32d2b82edce99b4985d60b5b..13de0db38d4ef0a820cec792fc75cffb0d94dc86 100644 (file)
@@ -1,11 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 # Copyright (C) 2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 
-config AS_AVX2
-       def_bool $(as-instr,vpbroadcastb %xmm0$(comma)%ymm1)
-       help
-         Supported by binutils >= 2.22 and LLVM integrated assembler
-
 config AS_AVX512
        def_bool $(as-instr,vpmovm2b %k1$(comma)%zmm5)
        help
@@ -20,8 +15,3 @@ config AS_SHA256_NI
        def_bool $(as-instr,sha256msg1 %xmm0$(comma)%xmm1)
        help
          Supported by binutils >= 2.24 and LLVM integrated assembler
-
-config AS_ADX
-       def_bool $(as-instr,adox %eax$(comma)%eax)
-       help
-         Supported by binutils >= 2.23 and LLVM integrated assembler
index d1ded16c1dcd3bc32e3fd3ed7c61771ba64c2a58..a31de0c6ccde2111874b25da5594d9454d3e2be0 100644 (file)
@@ -47,8 +47,7 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2) += aegis128-aesni.o
 aegis128-aesni-y := aegis128-aesni-asm.o aegis128-aesni-glue.o
 
 obj-$(CONFIG_CRYPTO_CHACHA20_X86_64) += chacha-x86_64.o
-chacha-x86_64-y := chacha-ssse3-x86_64.o chacha_glue.o
-chacha-x86_64-$(CONFIG_AS_AVX2) += chacha-avx2-x86_64.o
+chacha-x86_64-y := chacha-avx2-x86_64.o chacha-ssse3-x86_64.o chacha_glue.o
 chacha-x86_64-$(CONFIG_AS_AVX512) += chacha-avx512vl-x86_64.o
 
 obj-$(CONFIG_CRYPTO_AES_NI_INTEL) += aesni-intel.o
@@ -56,8 +55,7 @@ aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o
 aesni-intel-$(CONFIG_64BIT) += aesni-intel_avx-x86_64.o aes_ctrby8_avx-x86_64.o
 
 obj-$(CONFIG_CRYPTO_SHA1_SSSE3) += sha1-ssse3.o
-sha1-ssse3-y := sha1_ssse3_asm.o sha1_ssse3_glue.o
-sha1-ssse3-$(CONFIG_AS_AVX2) += sha1_avx2_x86_64_asm.o
+sha1-ssse3-y := sha1_avx2_x86_64_asm.o sha1_ssse3_asm.o sha1_ssse3_glue.o
 sha1-ssse3-$(CONFIG_AS_SHA1_NI) += sha1_ni_asm.o
 
 obj-$(CONFIG_CRYPTO_SHA256_SSSE3) += sha256-ssse3.o
index cc56ee43238b997b14583963ee8efaf6065f7ba3..0cea33295287eb2c35b01f23c61d8605f1fcf2f2 100644 (file)
@@ -1868,7 +1868,6 @@ key_256_finalize:
         ret
 SYM_FUNC_END(aesni_gcm_finalize_avx_gen2)
 
-#ifdef CONFIG_AS_AVX2
 ###############################################################################
 # GHASH_MUL MACRO to implement: Data*HashKey mod (128,127,126,121,0)
 # Input: A and B (128-bits each, bit-reflected)
@@ -2836,5 +2835,3 @@ key_256_finalize4:
         FUNC_RESTORE
         ret
 SYM_FUNC_END(aesni_gcm_finalize_avx_gen4)
-
-#endif /* CONFIG_AS_AVX2 */
index 655ad6bc8810768ef812e67070fbedd7eb335a12..ad8a7188a2bf757a0e455ae0e812b375a12db8e4 100644 (file)
@@ -233,7 +233,6 @@ static const struct aesni_gcm_tfm_s aesni_gcm_tfm_avx_gen2 = {
        .finalize = &aesni_gcm_finalize_avx_gen2,
 };
 
-#ifdef CONFIG_AS_AVX2
 /*
  * asmlinkage void aesni_gcm_init_avx_gen4()
  * gcm_data *my_ctx_data, context data
@@ -276,8 +275,6 @@ static const struct aesni_gcm_tfm_s aesni_gcm_tfm_avx_gen4 = {
        .finalize = &aesni_gcm_finalize_avx_gen4,
 };
 
-#endif
-
 static inline struct
 aesni_rfc4106_gcm_ctx *aesni_rfc4106_gcm_ctx_get(struct crypto_aead *tfm)
 {
@@ -706,10 +703,8 @@ static int gcmaes_crypt_by_sg(bool enc, struct aead_request *req,
        if (!enc)
                left -= auth_tag_len;
 
-#ifdef CONFIG_AS_AVX2
        if (left < AVX_GEN4_OPTSIZE && gcm_tfm == &aesni_gcm_tfm_avx_gen4)
                gcm_tfm = &aesni_gcm_tfm_avx_gen2;
-#endif
        if (left < AVX_GEN2_OPTSIZE && gcm_tfm == &aesni_gcm_tfm_avx_gen2)
                gcm_tfm = &aesni_gcm_tfm_sse;
 
@@ -1069,12 +1064,10 @@ static int __init aesni_init(void)
        if (!x86_match_cpu(aesni_cpu_id))
                return -ENODEV;
 #ifdef CONFIG_X86_64
-#ifdef CONFIG_AS_AVX2
        if (boot_cpu_has(X86_FEATURE_AVX2)) {
                pr_info("AVX2 version of gcm_enc/dec engaged.\n");
                aesni_gcm_tfm = &aesni_gcm_tfm_avx_gen4;
        } else
-#endif
        if (boot_cpu_has(X86_FEATURE_AVX)) {
                pr_info("AVX version of gcm_enc/dec engaged.\n");
                aesni_gcm_tfm = &aesni_gcm_tfm_avx_gen2;
index 68a74953efaf94e20901dec9990c2aecaf162e53..b412c21ee06e29a7d29aa94b6ada32e4da09484d 100644 (file)
@@ -79,8 +79,7 @@ static void chacha_dosimd(u32 *state, u8 *dst, const u8 *src,
                }
        }
 
-       if (IS_ENABLED(CONFIG_AS_AVX2) &&
-           static_branch_likely(&chacha_use_avx2)) {
+       if (static_branch_likely(&chacha_use_avx2)) {
                while (bytes >= CHACHA_BLOCK_SIZE * 8) {
                        chacha_8block_xor_avx2(state, dst, src, bytes, nrounds);
                        bytes -= CHACHA_BLOCK_SIZE * 8;
@@ -288,8 +287,7 @@ static int __init chacha_simd_mod_init(void)
 
        static_branch_enable(&chacha_use_simd);
 
-       if (IS_ENABLED(CONFIG_AS_AVX2) &&
-           boot_cpu_has(X86_FEATURE_AVX) &&
+       if (boot_cpu_has(X86_FEATURE_AVX) &&
            boot_cpu_has(X86_FEATURE_AVX2) &&
            cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
                static_branch_enable(&chacha_use_avx2);
index 5bac2d53310468125333f41edaf91e9aaac98e6a..137edcf038cb786557d4e42264a5cdb4acf9080a 100644 (file)
@@ -1514,10 +1514,6 @@ ___
 
 if ($avx>1) {
 
-if ($kernel) {
-       $code .= "#ifdef CONFIG_AS_AVX2\n";
-}
-
 my ($H0,$H1,$H2,$H3,$H4, $MASK, $T4,$T0,$T1,$T2,$T3, $D0,$D1,$D2,$D3,$D4) =
     map("%ymm$_",(0..15));
 my $S4=$MASK;
@@ -2808,10 +2804,6 @@ ___
 poly1305_blocks_avxN(0);
 &end_function("poly1305_blocks_avx2");
 
-if($kernel) {
-       $code .= "#endif\n";
-}
-
 #######################################################################
 if ($avx>2) {
 # On entry we have input length divisible by 64. But since inner loop
index 4a6226e1d15ee165d6a48176a95ac642ba84a7da..6dfec19f7d579aa7b717dc511861324e3d3a86e8 100644 (file)
@@ -108,7 +108,7 @@ static void poly1305_simd_blocks(void *ctx, const u8 *inp, size_t len,
                kernel_fpu_begin();
                if (IS_ENABLED(CONFIG_AS_AVX512) && static_branch_likely(&poly1305_use_avx512))
                        poly1305_blocks_avx512(ctx, inp, bytes, padbit);
-               else if (IS_ENABLED(CONFIG_AS_AVX2) && static_branch_likely(&poly1305_use_avx2))
+               else if (static_branch_likely(&poly1305_use_avx2))
                        poly1305_blocks_avx2(ctx, inp, bytes, padbit);
                else
                        poly1305_blocks_avx(ctx, inp, bytes, padbit);
@@ -264,8 +264,7 @@ static int __init poly1305_simd_mod_init(void)
        if (boot_cpu_has(X86_FEATURE_AVX) &&
            cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
                static_branch_enable(&poly1305_use_avx);
-       if (IS_ENABLED(CONFIG_AS_AVX2) && boot_cpu_has(X86_FEATURE_AVX) &&
-           boot_cpu_has(X86_FEATURE_AVX2) &&
+       if (boot_cpu_has(X86_FEATURE_AVX) && boot_cpu_has(X86_FEATURE_AVX2) &&
            cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
                static_branch_enable(&poly1305_use_avx2);
        if (IS_ENABLED(CONFIG_AS_AVX512) && boot_cpu_has(X86_FEATURE_AVX) &&
index 275b65dd30c97aa825bbcb0b953bd8b14f6cc536..a801ffc10cbbf71263ec359c88fcbdfc6036c82e 100644 (file)
@@ -174,7 +174,6 @@ static void unregister_sha1_avx(void)
                crypto_unregister_shash(&sha1_avx_alg);
 }
 
-#if defined(CONFIG_AS_AVX2)
 #define SHA1_AVX2_BLOCK_OPTSIZE        4       /* optimal 4*64 bytes of SHA1 blocks */
 
 asmlinkage void sha1_transform_avx2(struct sha1_state *state,
@@ -246,11 +245,6 @@ static void unregister_sha1_avx2(void)
                crypto_unregister_shash(&sha1_avx2_alg);
 }
 
-#else
-static inline int register_sha1_avx2(void) { return 0; }
-static inline void unregister_sha1_avx2(void) { }
-#endif
-
 #ifdef CONFIG_AS_SHA1_NI
 asmlinkage void sha1_ni_transform(struct sha1_state *digest, const u8 *data,
                                  int rounds);
index 499d9ec129dee20f32037c084f04324b4f0dd55c..11ff60c29c8bb85c6af0b1245a95f7d311142ee0 100644 (file)
@@ -48,7 +48,6 @@
 # This code schedules 2 blocks at a time, with 4 lanes per block
 ########################################################################
 
-#ifdef CONFIG_AS_AVX2
 #include <linux/linkage.h>
 
 ## assume buffers not aligned
@@ -767,5 +766,3 @@ _SHUF_00BA:
 .align 32
 _SHUF_DC00:
        .octa 0x0b0a090803020100FFFFFFFFFFFFFFFF,0x0b0a090803020100FFFFFFFFFFFFFFFF
-
-#endif
index 8bdc3be31f644ef3cecaff34e7e4f8de5345a7f2..6394b5fe8db6da51f8c58c8a59682c154ab9f2dc 100644 (file)
@@ -220,7 +220,6 @@ static void unregister_sha256_avx(void)
                                ARRAY_SIZE(sha256_avx_algs));
 }
 
-#if defined(CONFIG_AS_AVX2)
 asmlinkage void sha256_transform_rorx(struct sha256_state *state,
                                      const u8 *data, int blocks);
 
@@ -295,11 +294,6 @@ static void unregister_sha256_avx2(void)
                                ARRAY_SIZE(sha256_avx2_algs));
 }
 
-#else
-static inline int register_sha256_avx2(void) { return 0; }
-static inline void unregister_sha256_avx2(void) { }
-#endif
-
 #ifdef CONFIG_AS_SHA256_NI
 asmlinkage void sha256_ni_transform(struct sha256_state *digest,
                                    const u8 *data, int rounds);
index 3dd886b14e7df7706d5e053796bd3c239c00e9b5..3a44bdcfd5837fad36c10f6934920263ebdbc6b8 100644 (file)
@@ -49,7 +49,6 @@
 # This code schedules 1 blocks at a time, with 4 lanes per block
 ########################################################################
 
-#ifdef CONFIG_AS_AVX2
 #include <linux/linkage.h>
 
 .text
@@ -749,5 +748,3 @@ PSHUFFLE_BYTE_FLIP_MASK:
 MASK_YMM_LO:
        .octa 0x00000000000000000000000000000000
        .octa 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-
-#endif
index 75214982a6338214ce4f34ed6c5ca3cf4e5e441f..82cc1b3ced1dbe6df5569d7065b0fda2ff1df9bf 100644 (file)
@@ -218,7 +218,6 @@ static void unregister_sha512_avx(void)
                        ARRAY_SIZE(sha512_avx_algs));
 }
 
-#if defined(CONFIG_AS_AVX2)
 asmlinkage void sha512_transform_rorx(struct sha512_state *state,
                                      const u8 *data, int blocks);
 
@@ -293,10 +292,6 @@ static void unregister_sha512_avx2(void)
                crypto_unregister_shashes(sha512_avx2_algs,
                        ARRAY_SIZE(sha512_avx2_algs));
 }
-#else
-static inline int register_sha512_avx2(void) { return 0; }
-static inline void unregister_sha512_avx2(void) { }
-#endif
 
 static int __init sha512_ssse3_mod_init(void)
 {
index 49aae167e75c1d0f8e4bfd69e3aa7ca7ab0ed6af..c24a47406f8f57b7550a98a20654fde836d212d0 100644 (file)
@@ -267,7 +267,7 @@ config CRYPTO_CURVE25519
 
 config CRYPTO_CURVE25519_X86
        tristate "x86_64 accelerated Curve25519 scalar multiplication library"
-       depends on X86 && 64BIT && AS_ADX
+       depends on X86 && 64BIT
        select CRYPTO_LIB_CURVE25519_GENERIC
        select CRYPTO_ARCH_HAVE_LIB_CURVE25519
 
@@ -465,7 +465,7 @@ config CRYPTO_NHPOLY1305_SSE2
 
 config CRYPTO_NHPOLY1305_AVX2
        tristate "NHPoly1305 hash function (x86_64 AVX2 implementation)"
-       depends on X86 && 64BIT && AS_AVX2
+       depends on X86 && 64BIT
        select CRYPTO_NHPOLY1305
        help
          AVX2 optimized implementation of the hash function used by the
@@ -1303,7 +1303,7 @@ config CRYPTO_CAMELLIA_AESNI_AVX_X86_64
 
 config CRYPTO_CAMELLIA_AESNI_AVX2_X86_64
        tristate "Camellia cipher algorithm (x86_64/AES-NI/AVX2)"
-       depends on X86 && 64BIT && AS_AVX2
+       depends on X86 && 64BIT
        depends on CRYPTO
        select CRYPTO_CAMELLIA_AESNI_AVX_X86_64
        help
@@ -1573,7 +1573,7 @@ config CRYPTO_SERPENT_AVX_X86_64
 
 config CRYPTO_SERPENT_AVX2_X86_64
        tristate "Serpent cipher algorithm (x86_64/AVX2)"
-       depends on X86 && 64BIT && AS_AVX2
+       depends on X86 && 64BIT
        select CRYPTO_SERPENT_AVX_X86_64
        help
          Serpent cipher algorithm, by Anderson, Biham & Knudsen.
index df08664d34329ba5ada8cd6d2f7e638209eda5c5..6d5e5000fdd7967b77d49425a384ba7d7287cb9f 100644 (file)
@@ -34,10 +34,8 @@ const struct raid6_calls * const raid6_algos[] = {
        &raid6_avx512x2,
        &raid6_avx512x1,
 #endif
-#ifdef CONFIG_AS_AVX2
        &raid6_avx2x2,
        &raid6_avx2x1,
-#endif
        &raid6_sse2x2,
        &raid6_sse2x1,
        &raid6_sse1x2,
@@ -51,11 +49,9 @@ const struct raid6_calls * const raid6_algos[] = {
        &raid6_avx512x2,
        &raid6_avx512x1,
 #endif
-#ifdef CONFIG_AS_AVX2
        &raid6_avx2x4,
        &raid6_avx2x2,
        &raid6_avx2x1,
-#endif
        &raid6_sse2x4,
        &raid6_sse2x2,
        &raid6_sse2x1,
@@ -101,9 +97,7 @@ const struct raid6_recov_calls *const raid6_recov_algos[] = {
 #ifdef CONFIG_AS_AVX512
        &raid6_recov_avx512,
 #endif
-#ifdef CONFIG_AS_AVX2
        &raid6_recov_avx2,
-#endif
        &raid6_recov_ssse3,
 #endif
 #ifdef CONFIG_S390
index 87184b6da28a842d0edc848eba06493e88af39ab..f299476e1d76477355693fbc0dc045b0ccc9715e 100644 (file)
@@ -13,8 +13,6 @@
  *
  */
 
-#ifdef CONFIG_AS_AVX2
-
 #include <linux/raid/pq.h>
 #include "x86.h"
 
@@ -470,5 +468,3 @@ const struct raid6_calls raid6_avx2x4 = {
        1                       /* Has cache hints */
 };
 #endif
-
-#endif /* CONFIG_AS_AVX2 */
index 7a3b5e7f66ee3a5dc4756394f6928a2b79148a52..4e8095403ee2890833da99b7905fd2d177b928a4 100644 (file)
@@ -4,8 +4,6 @@
  * Author: Jim Kukunas <james.t.kukunas@linux.intel.com>
  */
 
-#ifdef CONFIG_AS_AVX2
-
 #include <linux/raid/pq.h>
 #include "x86.h"
 
@@ -313,7 +311,3 @@ const struct raid6_recov_calls raid6_recov_avx2 = {
 #endif
        .priority = 2,
 };
-
-#else
-#warning "your version of binutils lacks AVX2 support"
-#endif
index 60021319ac78f92aed05582f0649f314389db4cf..a4c7cd74cff589dcedc2efc57fa6238ea5e00006 100644 (file)
@@ -35,9 +35,6 @@ endif
 ifeq ($(IS_X86),yes)
         OBJS   += mmx.o sse1.o sse2.o avx2.o recov_ssse3.o recov_avx2.o avx512.o recov_avx512.o
         CFLAGS += -DCONFIG_X86
-        CFLAGS += $(shell echo "vpbroadcastb %xmm0, %ymm1" |   \
-                    gcc -c -x assembler - >/dev/null 2>&1 &&   \
-                    rm ./-.o && echo -DCONFIG_AS_AVX2=1)
        CFLAGS += $(shell echo "vpmovm2b %k1, %zmm5" |          \
                    gcc -c -x assembler - >/dev/null 2>&1 &&    \
                    rm ./-.o && echo -DCONFIG_AS_AVX512=1)
index ed4e52270520313e58b4670c9dd9ed64aa562501..0e0ded87e27b36fab25e400aeae4536ed1922d03 100644 (file)
@@ -83,7 +83,7 @@ nf_tables-objs := nf_tables_core.o nf_tables_api.o nft_chain_filter.o \
                  nft_set_pipapo.o
 
 ifdef CONFIG_X86_64
-ifdef CONFIG_AS_AVX2
+ifndef CONFIG_UML
 nf_tables-objs += nft_set_pipapo_avx2.o
 endif
 endif
index d0ab5ffa1e2c9e915af4fd77bcd6b4f9ed875a09..4471393da6d8dc1e0cfece7bc8fb2e69963d29b7 100644 (file)
@@ -3291,7 +3291,7 @@ static const struct nft_set_type *nft_set_types[] = {
        &nft_set_rhash_type,
        &nft_set_bitmap_type,
        &nft_set_rbtree_type,
-#if defined(CONFIG_X86_64) && defined(CONFIG_AS_AVX2)
+#if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
        &nft_set_pipapo_avx2_type,
 #endif
        &nft_set_pipapo_type,
index 87aabf651cfe6043755a711e95267cea9d471f09..8b5acc6910fd7d10e2f7ce1895aced91d87fae13 100644 (file)
@@ -2201,7 +2201,7 @@ const struct nft_set_type nft_set_pipapo_type = {
        },
 };
 
-#if defined(CONFIG_X86_64) && defined(CONFIG_AS_AVX2)
+#if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
 const struct nft_set_type nft_set_pipapo_avx2_type = {
        .features       = NFT_SET_INTERVAL | NFT_SET_MAP | NFT_SET_OBJECT |
                          NFT_SET_TIMEOUT,
index 396caf7bfca80246170ada677d8194db2eaf0437..394bcb704db7acc2f8d38809bb35748815a77a60 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 #ifndef _NFT_SET_PIPAPO_AVX2_H
 
-#ifdef CONFIG_AS_AVX2
+#if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
 #include <asm/fpu/xstate.h>
 #define NFT_PIPAPO_ALIGN       (XSAVE_YMM_SIZE / BITS_PER_BYTE)
 
@@ -9,6 +9,6 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
                            const u32 *key, const struct nft_set_ext **ext);
 bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features,
                              struct nft_set_estimate *est);
-#endif /* CONFIG_AS_AVX2 */
+#endif /* defined(CONFIG_X86_64) && !defined(CONFIG_UML) */
 
 #endif /* _NFT_SET_PIPAPO_AVX2_H */