crypto: arm64/sha - avoid non-standard inline asm tricks
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 26 Apr 2017 16:11:32 +0000 (17:11 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 18 May 2017 05:19:52 +0000 (13:19 +0800)
Replace the inline asm which exports struct offsets as ELF symbols
with proper const variables exposing the same values. This works
around an issue with Clang which does not interpret the "i" (or "I")
constraints in the same way as GCC.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Tested-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm64/crypto/sha1-ce-core.S
arch/arm64/crypto/sha1-ce-glue.c
arch/arm64/crypto/sha2-ce-core.S
arch/arm64/crypto/sha2-ce-glue.c

index c98e7e849f06f460d99cbddbe31aee73c8d1c686..8550408735a03e6657a994e3b0961d632b444818 100644 (file)
@@ -82,7 +82,8 @@ ENTRY(sha1_ce_transform)
        ldr             dgb, [x0, #16]
 
        /* load sha1_ce_state::finalize */
-       ldr             w4, [x0, #:lo12:sha1_ce_offsetof_finalize]
+       ldr_l           w4, sha1_ce_offsetof_finalize, x4
+       ldr             w4, [x0, x4]
 
        /* load input */
 0:     ld1             {v8.4s-v11.4s}, [x1], #64
@@ -132,7 +133,8 @@ CPU_LE(     rev32           v11.16b, v11.16b        )
         * the padding is handled by the C code in that case.
         */
        cbz             x4, 3f
-       ldr             x4, [x0, #:lo12:sha1_ce_offsetof_count]
+       ldr_l           w4, sha1_ce_offsetof_count, x4
+       ldr             x4, [x0, x4]
        movi            v9.2d, #0
        mov             x8, #0x80000000
        movi            v10.2d, #0
index aefda9868627bde843227d1074e7cc9b17004298..ea319c055f5dfbee35a31c68ceb005501a8f26b7 100644 (file)
@@ -17,9 +17,6 @@
 #include <linux/crypto.h>
 #include <linux/module.h>
 
-#define ASM_EXPORT(sym, val) \
-       asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
-
 MODULE_DESCRIPTION("SHA1 secure hash using ARMv8 Crypto Extensions");
 MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
 MODULE_LICENSE("GPL v2");
@@ -32,6 +29,9 @@ struct sha1_ce_state {
 asmlinkage void sha1_ce_transform(struct sha1_ce_state *sst, u8 const *src,
                                  int blocks);
 
+const u32 sha1_ce_offsetof_count = offsetof(struct sha1_ce_state, sst.count);
+const u32 sha1_ce_offsetof_finalize = offsetof(struct sha1_ce_state, finalize);
+
 static int sha1_ce_update(struct shash_desc *desc, const u8 *data,
                          unsigned int len)
 {
@@ -52,11 +52,6 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data,
        struct sha1_ce_state *sctx = shash_desc_ctx(desc);
        bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE);
 
-       ASM_EXPORT(sha1_ce_offsetof_count,
-                  offsetof(struct sha1_ce_state, sst.count));
-       ASM_EXPORT(sha1_ce_offsetof_finalize,
-                  offsetof(struct sha1_ce_state, finalize));
-
        /*
         * Allow the asm code to perform the finalization if there is no
         * partial data and the input is a round multiple of the block size.
index 01cfee066837cd9a65f6d54d8a27d4916e5a1675..679c6c002f4fbebffd7a0256602ce30e39ff86cb 100644 (file)
@@ -88,7 +88,8 @@ ENTRY(sha2_ce_transform)
        ld1             {dgav.4s, dgbv.4s}, [x0]
 
        /* load sha256_ce_state::finalize */
-       ldr             w4, [x0, #:lo12:sha256_ce_offsetof_finalize]
+       ldr_l           w4, sha256_ce_offsetof_finalize, x4
+       ldr             w4, [x0, x4]
 
        /* load input */
 0:     ld1             {v16.4s-v19.4s}, [x1], #64
@@ -136,7 +137,8 @@ CPU_LE(     rev32           v19.16b, v19.16b        )
         * the padding is handled by the C code in that case.
         */
        cbz             x4, 3f
-       ldr             x4, [x0, #:lo12:sha256_ce_offsetof_count]
+       ldr_l           w4, sha256_ce_offsetof_count, x4
+       ldr             x4, [x0, x4]
        movi            v17.2d, #0
        mov             x8, #0x80000000
        movi            v18.2d, #0
index 7cd587564a4176e902f12c7c7043b714caab48ea..0ed9486f75dd928568c86d1fdd3ad9bca3cde47a 100644 (file)
@@ -17,9 +17,6 @@
 #include <linux/crypto.h>
 #include <linux/module.h>
 
-#define ASM_EXPORT(sym, val) \
-       asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
-
 MODULE_DESCRIPTION("SHA-224/SHA-256 secure hash using ARMv8 Crypto Extensions");
 MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
 MODULE_LICENSE("GPL v2");
@@ -32,6 +29,11 @@ struct sha256_ce_state {
 asmlinkage void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
                                  int blocks);
 
+const u32 sha256_ce_offsetof_count = offsetof(struct sha256_ce_state,
+                                             sst.count);
+const u32 sha256_ce_offsetof_finalize = offsetof(struct sha256_ce_state,
+                                                finalize);
+
 static int sha256_ce_update(struct shash_desc *desc, const u8 *data,
                            unsigned int len)
 {
@@ -52,11 +54,6 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data,
        struct sha256_ce_state *sctx = shash_desc_ctx(desc);
        bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE);
 
-       ASM_EXPORT(sha256_ce_offsetof_count,
-                  offsetof(struct sha256_ce_state, sst.count));
-       ASM_EXPORT(sha256_ce_offsetof_finalize,
-                  offsetof(struct sha256_ce_state, finalize));
-
        /*
         * Allow the asm code to perform the finalization if there is no
         * partial data and the input is a round multiple of the block size.