From 7905a1f5dff38cc30af873461f083f30893adcbe Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 18 Sep 2018 02:18:47 +0200 Subject: crypto: allow for disabling simd in zinc modules --- src/crypto/zinc/poly1305/poly1305-x86_64-glue.h | 15 +++++++++++---- src/crypto/zinc/poly1305/poly1305.c | 6 +++++- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/crypto/zinc/poly1305') diff --git a/src/crypto/zinc/poly1305/poly1305-x86_64-glue.h b/src/crypto/zinc/poly1305/poly1305-x86_64-glue.h index 0ca3485..2158863 100644 --- a/src/crypto/zinc/poly1305/poly1305-x86_64-glue.h +++ b/src/crypto/zinc/poly1305/poly1305-x86_64-glue.h @@ -71,7 +71,8 @@ static inline bool poly1305_blocks_arch(void *ctx, const u8 *inp, { struct poly1305_arch_internal *state = ctx; - if ((len < (POLY1305_BLOCK_SIZE * 18) && !state->simd_is_engaged) || + if (!poly1305_use_avx || + (len < (POLY1305_BLOCK_SIZE * 18) && !state->simd_is_engaged) || !simd_use(simd_context)) poly1305_blocks_x86_64(ctx, inp, len, padbit); else @@ -98,18 +99,24 @@ static inline bool poly1305_emit_arch(void *ctx, u8 mac[POLY1305_MAC_SIZE], const u32 nonce[4], simd_context_t *simd_context) { + struct poly1305_arch_internal *state = ctx; + + if (!poly1305_use_avx || !state->simd_is_engaged || + !simd_use(simd_context)) + poly1305_emit_x86_64(ctx, mac, nonce); + else #ifdef CONFIG_AS_AVX512 - if (poly1305_use_avx512 && simd_use(simd_context)) + if (poly1305_use_avx512) poly1305_emit_avx(ctx, mac, nonce); else #endif #ifdef CONFIG_AS_AVX2 - if (poly1305_use_avx2 && simd_use(simd_context)) + if (poly1305_use_avx2) poly1305_emit_avx(ctx, mac, nonce); else #endif #ifdef CONFIG_AS_AVX - if (poly1305_use_avx && simd_use(simd_context)) + if (poly1305_use_avx) poly1305_emit_avx(ctx, mac, nonce); else #endif diff --git a/src/crypto/zinc/poly1305/poly1305.c b/src/crypto/zinc/poly1305/poly1305.c index 5377721..2add7aa 100644 --- a/src/crypto/zinc/poly1305/poly1305.c +++ b/src/crypto/zinc/poly1305/poly1305.c @@ -136,13 +136,16 @@ EXPORT_SYMBOL(poly1305_final); #include "../selftest/poly1305.h" +static bool nosimd __initdata = false; + #ifndef COMPAT_ZINC_IS_A_MODULE int __init poly1305_mod_init(void) #else static int __init mod_init(void) #endif { - poly1305_fpu_init(); + if (!nosimd) + poly1305_fpu_init(); #ifdef DEBUG if (!poly1305_selftest()) return -ENOTRECOVERABLE; @@ -155,6 +158,7 @@ static void __exit mod_exit(void) { } +module_param(nosimd, bool, 0); module_init(mod_init); module_exit(mod_exit); MODULE_LICENSE("GPL v2"); -- cgit v1.2.3-59-g8ed1b