crypto: x86 - make constants readonly, allow linker to merge them
authorDenys Vlasenko <dvlasenk@redhat.com>
Thu, 19 Jan 2017 21:33:04 +0000 (22:33 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 23 Jan 2017 14:50:29 +0000 (22:50 +0800)
A lot of asm-optimized routines in arch/x86/crypto/ keep its
constants in .data. This is wrong, they should be on .rodata.

Mnay of these constants are the same in different modules.
For example, 128-bit shuffle mask 0x000102030405060708090A0B0C0D0E0F
exists in at least half a dozen places.

There is a way to let linker merge them and use just one copy.
The rules are as follows: mergeable objects of different sizes
should not share sections. You can't put them all in one .rodata
section, they will lose "mergeability".

GCC puts its mergeable constants in ".rodata.cstSIZE" sections,
or ".rodata.cstSIZE.<object_name>" if -fdata-sections is used.
This patch does the same:

.section .rodata.cst16.SHUF_MASK, "aM", @progbits, 16

It is important that all data in such section consists of
16-byte elements, not larger ones, and there are no implicit
use of one element from another.

When this is not the case, use non-mergeable section:

.section .rodata[.VAR_NAME], "a", @progbits

This reduces .data by ~15 kbytes:

    text    data     bss     dec      hex filename
11097415 2705840 2630712 16433967  fac32f vmlinux-prev.o
11112095 2690672 2630712 16433479  fac147 vmlinux.o

Merged objects are visible in System.map:

ffffffff81a28810 r POLY
ffffffff81a28810 r POLY
ffffffff81a28820 r TWOONE
ffffffff81a28820 r TWOONE
ffffffff81a28830 r PSHUFFLE_BYTE_FLIP_MASK <- merged regardless of
ffffffff81a28830 r SHUF_MASK   <------------- the name difference
ffffffff81a28830 r SHUF_MASK
ffffffff81a28830 r SHUF_MASK
..
ffffffff81a28d00 r K512 <- merged three identical 640-byte tables
ffffffff81a28d00 r K512
ffffffff81a28d00 r K512

Use of object names in section name suffixes is not strictly necessary,
but might help if someday link stage will use garbage collection
to eliminate unused sections (ld --gc-sections).

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Herbert Xu <herbert@gondor.apana.org.au>
CC: Josh Poimboeuf <jpoimboe@redhat.com>
CC: Xiaodong Liu <xiaodong.liu@intel.com>
CC: Megha Dey <megha.dey@intel.com>
CC: linux-crypto@vger.kernel.org
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
33 files changed:
arch/x86/crypto/aesni-intel_asm.S
arch/x86/crypto/aesni-intel_avx-x86_64.S
arch/x86/crypto/camellia-aesni-avx-asm_64.S
arch/x86/crypto/camellia-aesni-avx2-asm_64.S
arch/x86/crypto/cast5-avx-x86_64-asm_64.S
arch/x86/crypto/cast6-avx-x86_64-asm_64.S
arch/x86/crypto/chacha20-avx2-x86_64.S
arch/x86/crypto/chacha20-ssse3-x86_64.S
arch/x86/crypto/crct10dif-pcl-asm_64.S
arch/x86/crypto/des3_ede-asm_64.S
arch/x86/crypto/ghash-clmulni-intel_asm.S
arch/x86/crypto/poly1305-avx2-x86_64.S
arch/x86/crypto/poly1305-sse2-x86_64.S
arch/x86/crypto/serpent-avx-x86_64-asm_64.S
arch/x86/crypto/serpent-avx2-asm_64.S
arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S
arch/x86/crypto/sha1-mb/sha1_mb_mgr_submit_avx2.S
arch/x86/crypto/sha1-mb/sha1_x8_avx2.S
arch/x86/crypto/sha1_ni_asm.S
arch/x86/crypto/sha256-avx-asm.S
arch/x86/crypto/sha256-avx2-asm.S
arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S
arch/x86/crypto/sha256-mb/sha256_mb_mgr_submit_avx2.S
arch/x86/crypto/sha256-mb/sha256_x8_avx2.S
arch/x86/crypto/sha256-ssse3-asm.S
arch/x86/crypto/sha256_ni_asm.S
arch/x86/crypto/sha512-avx-asm.S
arch/x86/crypto/sha512-avx2-asm.S
arch/x86/crypto/sha512-mb/sha512_mb_mgr_flush_avx2.S
arch/x86/crypto/sha512-mb/sha512_mb_mgr_submit_avx2.S
arch/x86/crypto/sha512-mb/sha512_x4_avx2.S
arch/x86/crypto/sha512-ssse3-asm.S
arch/x86/crypto/twofish-avx-x86_64-asm_64.S

index 383a6f84a060f103c7c43923ad84029e0ce2a9f1..3c465184ff8ab0256bd223084e3daeec67a74cc0 100644 (file)
 
 #ifdef __x86_64__
 
-.data
+# constants in mergeable sections, linker can reorder and merge
+.section       .rodata.cst16.gf128mul_x_ble_mask, "aM", @progbits, 16
 .align 16
 .Lgf128mul_x_ble_mask:
        .octa 0x00000000000000010000000000000087
+.section       .rodata.cst16.POLY, "aM", @progbits, 16
+.align 16
 POLY:   .octa 0xC2000000000000000000000000000001
+.section       .rodata.cst16.TWOONE, "aM", @progbits, 16
+.align 16
 TWOONE: .octa 0x00000001000000000000000000000001
 
-# order of these constants should not change.
-# more specifically, ALL_F should follow SHIFT_MASK,
-# and ZERO should follow ALL_F
-
+.section       .rodata.cst16.SHUF_MASK, "aM", @progbits, 16
+.align 16
 SHUF_MASK:  .octa 0x000102030405060708090A0B0C0D0E0F
+.section       .rodata.cst16.MASK1, "aM", @progbits, 16
+.align 16
 MASK1:      .octa 0x0000000000000000ffffffffffffffff
+.section       .rodata.cst16.MASK2, "aM", @progbits, 16
+.align 16
 MASK2:      .octa 0xffffffffffffffff0000000000000000
-SHIFT_MASK: .octa 0x0f0e0d0c0b0a09080706050403020100
-ALL_F:      .octa 0xffffffffffffffffffffffffffffffff
-ZERO:       .octa 0x00000000000000000000000000000000
+.section       .rodata.cst16.ONE, "aM", @progbits, 16
+.align 16
 ONE:        .octa 0x00000000000000000000000000000001
+.section       .rodata.cst16.F_MIN_MASK, "aM", @progbits, 16
+.align 16
 F_MIN_MASK: .octa 0xf1f2f3f4f5f6f7f8f9fafbfcfdfeff0
+.section       .rodata.cst16.dec, "aM", @progbits, 16
+.align 16
 dec:        .octa 0x1
+.section       .rodata.cst16.enc, "aM", @progbits, 16
+.align 16
 enc:        .octa 0x2
 
+# order of these constants should not change.
+# more specifically, ALL_F should follow SHIFT_MASK,
+# and zero should follow ALL_F
+.section       .rodata, "a", @progbits
+.align 16
+SHIFT_MASK: .octa 0x0f0e0d0c0b0a09080706050403020100
+ALL_F:      .octa 0xffffffffffffffffffffffffffffffff
+            .octa 0x00000000000000000000000000000000
+
 
 .text
 
index 522ab68d1c884fab49813f05b5b9cbb48d90275b..d664382c6e56b9e0a55a8e5f3b6e15b14201d8da 100644 (file)
 #include <linux/linkage.h>
 #include <asm/inst.h>
 
-.data
+# constants in mergeable sections, linker can reorder and merge
+.section       .rodata.cst16.POLY, "aM", @progbits, 16
 .align 16
-
 POLY:            .octa     0xC2000000000000000000000000000001
+
+.section       .rodata.cst16.POLY2, "aM", @progbits, 16
+.align 16
 POLY2:           .octa     0xC20000000000000000000001C2000000
-TWOONE:          .octa     0x00000001000000000000000000000001
 
-# order of these constants should not change.
-# more specifically, ALL_F should follow SHIFT_MASK, and ZERO should follow ALL_F
+.section       .rodata.cst16.TWOONE, "aM", @progbits, 16
+.align 16
+TWOONE:          .octa     0x00000001000000000000000000000001
 
+.section       .rodata.cst16.SHUF_MASK, "aM", @progbits, 16
+.align 16
 SHUF_MASK:       .octa     0x000102030405060708090A0B0C0D0E0F
-SHIFT_MASK:      .octa     0x0f0e0d0c0b0a09080706050403020100
-ALL_F:           .octa     0xffffffffffffffffffffffffffffffff
-ZERO:            .octa     0x00000000000000000000000000000000
+
+.section       .rodata.cst16.ONE, "aM", @progbits, 16
+.align 16
 ONE:             .octa     0x00000000000000000000000000000001
+
+.section       .rodata.cst16.ONEf, "aM", @progbits, 16
+.align 16
 ONEf:            .octa     0x01000000000000000000000000000000
 
+# order of these constants should not change.
+# more specifically, ALL_F should follow SHIFT_MASK, and zero should follow ALL_F
+.section       .rodata, "a", @progbits
+.align 16
+SHIFT_MASK:      .octa     0x0f0e0d0c0b0a09080706050403020100
+ALL_F:           .octa     0xffffffffffffffffffffffffffffffff
+                 .octa     0x00000000000000000000000000000000
+
 .text
 
 
index aa9e8bd163f61b0440372bfbc26e956f71bf95d3..f7c495e2863cb0daecb7b023e19e393cfc32c587 100644 (file)
@@ -571,7 +571,9 @@ ENDPROC(roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
        vmovdqu y6, 14 * 16(rio); \
        vmovdqu y7, 15 * 16(rio);
 
-.data
+
+/* NB: section is mergeable, all elements must be aligned 16-byte blocks */
+.section       .rodata.cst16, "aM", @progbits, 16
 .align 16
 
 #define SHUFB_BYTES(idx) \
@@ -711,6 +713,7 @@ ENDPROC(roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
        .byte 0x08, 0x05, 0x02, 0x0f, 0x0c, 0x09, 0x06, 0x03
 
 /* 4-bit mask */
+.section       .rodata.cst4.L0f0f0f0f, "aM", @progbits, 4
 .align 4
 .L0f0f0f0f:
        .long 0x0f0f0f0f
index 16186c18656dfdc67fc7433a48dcc51ee62d9bea..eee5b3982cfd3c6838a9a34534409df8935eba17 100644 (file)
@@ -610,20 +610,25 @@ ENDPROC(roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
        vmovdqu y6, 14 * 32(rio); \
        vmovdqu y7, 15 * 32(rio);
 
-.data
-.align 32
 
+.section       .rodata.cst32.shufb_16x16b, "aM", @progbits, 32
+.align 32
 #define SHUFB_BYTES(idx) \
        0 + (idx), 4 + (idx), 8 + (idx), 12 + (idx)
-
 .Lshufb_16x16b:
        .byte SHUFB_BYTES(0), SHUFB_BYTES(1), SHUFB_BYTES(2), SHUFB_BYTES(3)
        .byte SHUFB_BYTES(0), SHUFB_BYTES(1), SHUFB_BYTES(2), SHUFB_BYTES(3)
 
+.section       .rodata.cst32.pack_bswap, "aM", @progbits, 32
+.align 32
 .Lpack_bswap:
        .long 0x00010203, 0x04050607, 0x80808080, 0x80808080
        .long 0x00010203, 0x04050607, 0x80808080, 0x80808080
 
+/* NB: section is mergeable, all elements must be aligned 16-byte blocks */
+.section       .rodata.cst16, "aM", @progbits, 16
+.align 16
+
 /* For CTR-mode IV byteswap */
 .Lbswap128_mask:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
@@ -750,6 +755,7 @@ ENDPROC(roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
        .byte 0x00, 0x0d, 0x0a, 0x07, 0x04, 0x01, 0x0e, 0x0b
        .byte 0x08, 0x05, 0x02, 0x0f, 0x0c, 0x09, 0x06, 0x03
 
+.section       .rodata.cst4.L0f0f0f0f, "aM", @progbits, 4
 .align 4
 /* 4-bit mask */
 .L0f0f0f0f:
index 14fa1966bf01d4b89eb68456c21a5e750884d785..b4a8806234ea1c5f61f46898900a84035af72763 100644 (file)
        vpshufb rmask,  x0, x0;           \
        vpshufb rmask,  x1, x1;
 
-.data
-
+.section       .rodata.cst16.bswap_mask, "aM", @progbits, 16
 .align 16
 .Lbswap_mask:
        .byte 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
+.section       .rodata.cst16.bswap128_mask, "aM", @progbits, 16
+.align 16
 .Lbswap128_mask:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+.section       .rodata.cst16.bswap_iv_mask, "aM", @progbits, 16
+.align 16
 .Lbswap_iv_mask:
        .byte 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0
+
+.section       .rodata.cst4.16_mask, "aM", @progbits, 4
+.align 4
 .L16_mask:
        .byte 16, 16, 16, 16
+.section       .rodata.cst4.32_mask, "aM", @progbits, 4
+.align 4
 .L32_mask:
        .byte 32, 0, 0, 0
+.section       .rodata.cst4.first_mask, "aM", @progbits, 4
+.align 4
 .Lfirst_mask:
        .byte 0x1f, 0, 0, 0
 
index c419389889cddf24d60080940148bddecc8f6889..952d3156a93312ff8c5a5c2c193132a89f7413da 100644 (file)
        vpshufb rmask,          x2, x2;       \
        vpshufb rmask,          x3, x3;
 
-.data
-
+.section       .rodata.cst16, "aM", @progbits, 16
 .align 16
 .Lxts_gf128mul_and_shl1_mask:
        .byte 0x87, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0
        .byte 12, 13, 14, 15, 8, 9, 10, 11, 7, 6, 5, 4, 3, 2, 1, 0
 .Lrkr_dec_QBAR_QBAR_QBAR_QBAR:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+
+.section       .rodata.cst4.L16_mask, "aM", @progbits, 4
+.align 4
 .L16_mask:
        .byte 16, 16, 16, 16
+
+.section       .rodata.cst4.L32_mask, "aM", @progbits, 4
+.align 4
 .L32_mask:
        .byte 32, 0, 0, 0
+
+.section       .rodata.cst4.first_mask, "aM", @progbits, 4
+.align 4
 .Lfirst_mask:
        .byte 0x1f, 0, 0, 0
 
index 16694e625f77665633e8b93fed303d9e916d4139..3a2dc3dc6cac162bc51946bb08cf8da745c73f57 100644 (file)
 
 #include <linux/linkage.h>
 
-.data
+.section       .rodata.cst32.ROT8, "aM", @progbits, 32
 .align 32
-
 ROT8:  .octa 0x0e0d0c0f0a09080b0605040702010003
        .octa 0x0e0d0c0f0a09080b0605040702010003
+
+.section       .rodata.cst32.ROT16, "aM", @progbits, 32
+.align 32
 ROT16: .octa 0x0d0c0f0e09080b0a0504070601000302
        .octa 0x0d0c0f0e09080b0a0504070601000302
+
+.section       .rodata.cst32.CTRINC, "aM", @progbits, 32
+.align 32
 CTRINC:        .octa 0x00000003000000020000000100000000
        .octa 0x00000007000000060000000500000004
 
index 3a33124e91129e85c3f34fc6dc85ca43c8e35cff..3f511a7d73b897e2ea4560b6a5b2809c5e450255 100644 (file)
 
 #include <linux/linkage.h>
 
-.data
+.section       .rodata.cst16.ROT8, "aM", @progbits, 16
 .align 16
-
 ROT8:  .octa 0x0e0d0c0f0a09080b0605040702010003
+.section       .rodata.cst16.ROT16, "aM", @progbits, 16
+.align 16
 ROT16: .octa 0x0d0c0f0e09080b0a0504070601000302
+.section       .rodata.cst16.CTRINC, "aM", @progbits, 16
+.align 16
 CTRINC:        .octa 0x00000003000000020000000100000000
 
 .text
index 35e97569d05ffe6d684b02d028e1854d6519159a..de04d3e98d8d3fd93671cbf7b50c5c64d1300e13 100644 (file)
@@ -554,12 +554,11 @@ _only_less_than_2:
 
 ENDPROC(crc_t10dif_pcl)
 
-.data
-
+.section       .rodata, "a", @progbits
+.align 16
 # precomputed constants
 # these constants are precomputed from the poly:
 # 0x8bb70000 (0x8bb7 scaled to 32 bits)
-.align 16
 # Q = 0x18BB70000
 # rk1 = 2^(32*3) mod Q << 32
 # rk2 = 2^(32*5) mod Q << 32
@@ -613,14 +612,23 @@ rk20:
 
 
 
+.section       .rodata.cst16.mask1, "aM", @progbits, 16
+.align 16
 mask1:
 .octa 0x80808080808080808080808080808080
+
+.section       .rodata.cst16.mask2, "aM", @progbits, 16
+.align 16
 mask2:
 .octa 0x00000000FFFFFFFFFFFFFFFFFFFFFFFF
 
+.section       .rodata.cst16.SHUF_MASK, "aM", @progbits, 16
+.align 16
 SHUF_MASK:
 .octa 0x000102030405060708090A0B0C0D0E0F
 
+.section       .rodata.cst32.pshufb_shf_table, "aM", @progbits, 32
+.align 32
 pshufb_shf_table:
 # use these values for shift constants for the pshufb instruction
 # different alignments result in values as shown:
index 038f6ae87c5eea2890eaa548f9e9bdab16af8ab8..f3e91647ca274a4b20d4b18f0d7232a3c8ca4567 100644 (file)
@@ -537,7 +537,7 @@ ENTRY(des3_ede_x86_64_crypt_blk_3way)
        ret;
 ENDPROC(des3_ede_x86_64_crypt_blk_3way)
 
-.data
+.section       .rodata, "a", @progbits
 .align 16
 .L_s1:
        .quad 0x0010100001010400, 0x0000000000000000
index eed55c8cca4f8e64b2ef203453ab8c2b34e75722..f94375a8dcd18747ac8f2a45d6ea218e07c4fd96 100644 (file)
@@ -20,8 +20,7 @@
 #include <asm/inst.h>
 #include <asm/frame.h>
 
-.data
-
+.section       .rodata.cst16.bswap_mask, "aM", @progbits, 16
 .align 16
 .Lbswap_mask:
        .octa 0x000102030405060708090a0b0c0d0e0f
index eff2f414e22b7e1700a7f9dac730a644f0f8c7f4..3b6e70d085da89775317c8e2a560625ab4799e01 100644 (file)
 
 #include <linux/linkage.h>
 
-.data
+.section       .rodata.cst32.ANMASK, "aM", @progbits, 32
 .align 32
-
 ANMASK:        .octa 0x0000000003ffffff0000000003ffffff
        .octa 0x0000000003ffffff0000000003ffffff
+
+.section       .rodata.cst32.ORMASK, "aM", @progbits, 32
+.align 32
 ORMASK:        .octa 0x00000000010000000000000001000000
        .octa 0x00000000010000000000000001000000
 
index 338c748054ed2fefeb88935e1ed849e2445d2aba..c88c670cb5fc6d4b6331ba18882fae34038400b4 100644 (file)
 
 #include <linux/linkage.h>
 
-.data
+.section       .rodata.cst16.ANMASK, "aM", @progbits, 16
 .align 16
-
 ANMASK:        .octa 0x0000000003ffffff0000000003ffffff
+
+.section       .rodata.cst16.ORMASK, "aM", @progbits, 16
+.align 16
 ORMASK:        .octa 0x00000000010000000000000001000000
 
 .text
index 8be571808342b85df775ac897a2e38ad9f35cab4..2925077f8c6a28d2c89da9f936fef3fb9eba3e96 100644 (file)
 
 .file "serpent-avx-x86_64-asm_64.S"
 
-.data
+.section       .rodata.cst16.bswap128_mask, "aM", @progbits, 16
 .align 16
-
 .Lbswap128_mask:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+.section       .rodata.cst16.xts_gf128mul_and_shl1_mask, "aM", @progbits, 16
+.align 16
 .Lxts_gf128mul_and_shl1_mask:
        .byte 0x87, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0
 
index 97c48add33ed965e14561f663d98061fd3670ccd..d67888f2a52ae1d8d5bfea88c8a48d6fd5b6ac4c 100644 (file)
 
 .file "serpent-avx2-asm_64.S"
 
-.data
+.section       .rodata.cst16.bswap128_mask, "aM", @progbits, 16
 .align 16
-
 .Lbswap128_mask:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+
+.section       .rodata.cst16.xts_gf128mul_and_shl1_mask_0, "aM", @progbits, 16
+.align 16
 .Lxts_gf128mul_and_shl1_mask_0:
        .byte 0x87, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0
+
+.section       .rodata.cst16.xts_gf128mul_and_shl1_mask_1, "aM", @progbits, 16
+.align 16
 .Lxts_gf128mul_and_shl1_mask_1:
        .byte 0x0e, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
 
index 96df6a39d7e240d241d1c46077a1336d2717f80d..93b945597ecfb70b4f54758517d83530a3f042b6 100644 (file)
@@ -281,11 +281,13 @@ ENTRY(sha1_mb_mgr_get_comp_job_avx2)
        ret
 ENDPROC(sha1_mb_mgr_get_comp_job_avx2)
 
-.data
-
+.section       .rodata.cst16.clear_low_nibble, "aM", @progbits, 16
 .align 16
 clear_low_nibble:
 .octa  0x000000000000000000000000FFFFFFF0
+
+.section       .rodata.cst8, "aM", @progbits, 8
+.align 8
 one:
 .quad  1
 two:
index 63a0d9c8e31f7b5b94d526d051e9efce2090cacb..7a93b1c0d69ab7c7b2160ab9a67de5b4918b5a91 100644 (file)
@@ -203,8 +203,7 @@ return_null:
 
 ENDPROC(sha1_mb_mgr_submit_avx2)
 
-.data
-
+.section       .rodata.cst16.clear_low_nibble, "aM", @progbits, 16
 .align 16
 clear_low_nibble:
        .octa   0x000000000000000000000000FFFFFFF0
index c9dae1cd2919277376db3b7f378b6c547b2a3b05..20f77aa633dee6e20ce8d37e121db1ff44f08143 100644 (file)
@@ -461,21 +461,32 @@ lloop:
 ENDPROC(sha1_x8_avx2)
 
 
-.data
-
+.section       .rodata.cst32.K00_19, "aM", @progbits, 32
 .align 32
 K00_19:
 .octa 0x5A8279995A8279995A8279995A827999
 .octa 0x5A8279995A8279995A8279995A827999
+
+.section       .rodata.cst32.K20_39, "aM", @progbits, 32
+.align 32
 K20_39:
 .octa 0x6ED9EBA16ED9EBA16ED9EBA16ED9EBA1
 .octa 0x6ED9EBA16ED9EBA16ED9EBA16ED9EBA1
+
+.section       .rodata.cst32.K40_59, "aM", @progbits, 32
+.align 32
 K40_59:
 .octa 0x8F1BBCDC8F1BBCDC8F1BBCDC8F1BBCDC
 .octa 0x8F1BBCDC8F1BBCDC8F1BBCDC8F1BBCDC
+
+.section       .rodata.cst32.K60_79, "aM", @progbits, 32
+.align 32
 K60_79:
 .octa 0xCA62C1D6CA62C1D6CA62C1D6CA62C1D6
 .octa 0xCA62C1D6CA62C1D6CA62C1D6CA62C1D6
+
+.section       .rodata.cst32.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 32
+.align 32
 PSHUFFLE_BYTE_FLIP_MASK:
 .octa 0x0c0d0e0f08090a0b0405060700010203
 .octa 0x0c0d0e0f08090a0b0405060700010203
index 874a651b9e7dd3ce575f5224b2e7776769728f11..ebbdba72ae07a892494aa90a247edab709bd9118 100644 (file)
@@ -293,10 +293,12 @@ ENTRY(sha1_ni_transform)
        ret
 ENDPROC(sha1_ni_transform)
 
-.data
-
-.align 64
+.section       .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
+.align 16
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x000102030405060708090a0b0c0d0e0f
+
+.section       .rodata.cst16.UPPER_WORD_MASK, "aM", @progbits, 16
+.align 16
 UPPER_WORD_MASK:
        .octa 0xFFFFFFFF000000000000000000000000
index 92b3b5d75ba9d8c513123c0c44c5ced2a81cb46a..e08888a1a5f2cf5f8a6809d86d497664cece52a1 100644 (file)
@@ -463,7 +463,7 @@ done_hash:
        ret
 ENDPROC(sha256_transform_avx)
 
-.data
+.section       .rodata.cst256.K256, "aM", @progbits, 256
 .align 64
 K256:
        .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
@@ -483,14 +483,21 @@ K256:
        .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
        .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 
+.section       .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
+.align 16
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x0c0d0e0f08090a0b0405060700010203
 
+.section       .rodata.cst16._SHUF_00BA, "aM", @progbits, 16
+.align 16
 # shuffle xBxA -> 00BA
 _SHUF_00BA:
        .octa 0xFFFFFFFFFFFFFFFF0b0a090803020100
 
+.section       .rodata.cst16._SHUF_DC00, "aM", @progbits, 16
+.align 16
 # shuffle xDxC -> DC00
 _SHUF_DC00:
        .octa 0x0b0a090803020100FFFFFFFFFFFFFFFF
+
 #endif
index 570ec5ec62d7406e301e23500a94c507431b6957..89c8f09787d20552c12230ded345282bb2f2bf42 100644 (file)
@@ -723,7 +723,7 @@ done_hash:
        ret
 ENDPROC(sha256_transform_rorx)
 
-.data
+.section       .rodata.cst512.K256, "aM", @progbits, 512
 .align 64
 K256:
        .long   0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
@@ -759,14 +759,21 @@ K256:
        .long   0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
        .long   0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 
+.section       .rodata.cst32.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 32
+.align 32
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x0c0d0e0f08090a0b0405060700010203,0x0c0d0e0f08090a0b0405060700010203
 
 # shuffle xBxA -> 00BA
+.section       .rodata.cst32._SHUF_00BA, "aM", @progbits, 32
+.align 32
 _SHUF_00BA:
        .octa 0xFFFFFFFFFFFFFFFF0b0a090803020100,0xFFFFFFFFFFFFFFFF0b0a090803020100
 
 # shuffle xDxC -> DC00
+.section       .rodata.cst32._SHUF_DC00, "aM", @progbits, 32
+.align 32
 _SHUF_DC00:
        .octa 0x0b0a090803020100FFFFFFFFFFFFFFFF,0x0b0a090803020100FFFFFFFFFFFFFFFF
+
 #endif
index a78a0694ddef37be737599dbf6ba305eb88b3cba..8fe6338bcc845713338531694e3ed54fdf483662 100644 (file)
@@ -284,11 +284,13 @@ ENTRY(sha256_mb_mgr_get_comp_job_avx2)
        ret
 ENDPROC(sha256_mb_mgr_get_comp_job_avx2)
 
-.data
-
+.section       .rodata.cst16.clear_low_nibble, "aM", @progbits, 16
 .align 16
 clear_low_nibble:
 .octa  0x000000000000000000000000FFFFFFF0
+
+.section       .rodata.cst8, "aM", @progbits, 8
+.align 8
 one:
 .quad  1
 two:
index 7ea670e25acc82bbfe4f59687ac6628b631ef6e3..b36ae745408467698ed852e7fc9709f8494a7317 100644 (file)
@@ -208,8 +208,7 @@ return_null:
 
 ENDPROC(sha256_mb_mgr_submit_avx2)
 
-.data
-
+.section       .rodata.cst16.clear_low_nibble, "aM", @progbits, 16
 .align 16
 clear_low_nibble:
        .octa   0x000000000000000000000000FFFFFFF0
index aa21aea4c722d02936a49299f294dc666d9e1337..1687c80c59952d373a061d906f08a4e465fd0038 100644 (file)
@@ -437,7 +437,8 @@ Lrounds_16_xx:
 
        ret
 ENDPROC(sha256_x8_avx2)
-.data
+
+.section       .rodata.K256_8, "a", @progbits
 .align 64
 K256_8:
        .octa   0x428a2f98428a2f98428a2f98428a2f98
@@ -568,10 +569,14 @@ K256_8:
        .octa   0xbef9a3f7bef9a3f7bef9a3f7bef9a3f7
        .octa   0xc67178f2c67178f2c67178f2c67178f2
        .octa   0xc67178f2c67178f2c67178f2c67178f2
+
+.section       .rodata.cst32.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 32
+.align 32
 PSHUFFLE_BYTE_FLIP_MASK:
 .octa 0x0c0d0e0f08090a0b0405060700010203
 .octa 0x0c0d0e0f08090a0b0405060700010203
 
+.section       .rodata.cst256.K256, "aM", @progbits, 256
 .align 64
 .global K256
 K256:
index 2cedc44e81216ab89f3fc226dc9b27b2756dfd0b..39b83c93e7fd6cdbc658a35ef4698756cccef612 100644 (file)
@@ -474,7 +474,7 @@ done_hash:
        ret
 ENDPROC(sha256_transform_ssse3)
 
-.data
+.section       .rodata.cst256.K256, "aM", @progbits, 256
 .align 64
 K256:
         .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
@@ -494,13 +494,19 @@ K256:
         .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
         .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 
+.section       .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
+.align 16
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x0c0d0e0f08090a0b0405060700010203
 
+.section       .rodata.cst16._SHUF_00BA, "aM", @progbits, 16
+.align 16
 # shuffle xBxA -> 00BA
 _SHUF_00BA:
        .octa 0xFFFFFFFFFFFFFFFF0b0a090803020100
 
+.section       .rodata.cst16._SHUF_DC00, "aM", @progbits, 16
+.align 16
 # shuffle xDxC -> DC00
 _SHUF_DC00:
        .octa 0x0b0a090803020100FFFFFFFFFFFFFFFF
index 748cdf21a938ba9bda9c9e5d7e3bcc348425480e..fb58f58ecfbc76cf541c40f6153ca11175659714 100644 (file)
@@ -329,7 +329,7 @@ ENTRY(sha256_ni_transform)
        ret
 ENDPROC(sha256_ni_transform)
 
-.data
+.section       .rodata.cst256.K256, "aM", @progbits, 256
 .align 64
 K256:
        .long   0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
@@ -349,5 +349,7 @@ K256:
        .long   0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
        .long   0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
 
+.section       .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
+.align 16
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x0c0d0e0f08090a0b0405060700010203
index 565274d6a6419faac4a376aa658540372fecee26..39235fefe6f7c0c8e15c39c5828d9ff93e2609d6 100644 (file)
@@ -370,14 +370,17 @@ ENDPROC(sha512_transform_avx)
 ########################################################################
 ### Binary Data
 
-.data
-
+.section       .rodata.cst16.XMM_QWORD_BSWAP, "aM", @progbits, 16
 .align 16
-
 # Mask for byte-swapping a couple of qwords in an XMM register using (v)pshufb.
 XMM_QWORD_BSWAP:
        .octa 0x08090a0b0c0d0e0f0001020304050607
 
+# Mergeable 640-byte rodata section. This allows linker to merge the table
+# with other, exactly the same 640-byte fragment of another rodata section
+# (if such section exists).
+.section       .rodata.cst640.K512, "aM", @progbits, 640
+.align 64
 # K[t] used in SHA512 hashing
 K512:
        .quad 0x428a2f98d728ae22,0x7137449123ef65cd
index 1f20b35d8573a131241505d58f292d67bc866c6d..7f5f6c6ec72e9cb0a47c2b5babbbedff487fbbf3 100644 (file)
@@ -684,8 +684,11 @@ ENDPROC(sha512_transform_rorx)
 ########################################################################
 ### Binary Data
 
-.data
 
+# Mergeable 640-byte rodata section. This allows linker to merge the table
+# with other, exactly the same 640-byte fragment of another rodata section
+# (if such section exists).
+.section       .rodata.cst640.K512, "aM", @progbits, 640
 .align 64
 # K[t] used in SHA512 hashing
 K512:
@@ -730,14 +733,17 @@ K512:
        .quad   0x4cc5d4becb3e42b6,0x597f299cfc657e2a
        .quad   0x5fcb6fab3ad6faec,0x6c44198c4a475817
 
+.section       .rodata.cst32.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 32
 .align 32
-
 # Mask for byte-swapping a couple of qwords in an XMM register using (v)pshufb.
 PSHUFFLE_BYTE_FLIP_MASK:
        .octa 0x08090a0b0c0d0e0f0001020304050607
        .octa 0x18191a1b1c1d1e1f1011121314151617
 
+.section       .rodata.cst32.MASK_YMM_LO, "aM", @progbits, 32
+.align 32
 MASK_YMM_LO:
        .octa 0x00000000000000000000000000000000
        .octa 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+
 #endif
index 3ddba19a0db61c054e5cb921ceb05885de04e105..7c629caebc0523a244b32f0ad2088204d180f4f9 100644 (file)
@@ -280,12 +280,18 @@ ENTRY(sha512_mb_mgr_get_comp_job_avx2)
        pop     %rbx
         ret
 ENDPROC(sha512_mb_mgr_get_comp_job_avx2)
-.data
 
-.align 16
+.section       .rodata.cst8.one, "aM", @progbits, 8
+.align 8
 one:
 .quad  1
+
+.section       .rodata.cst8.two, "aM", @progbits, 8
+.align 8
 two:
 .quad  2
+
+.section       .rodata.cst8.three, "aM", @progbits, 8
+.align 8
 three:
 .quad  3
index 815f07bdd1f8f408468cbc27dde8baf8b08cf280..4ba709ba78e5a0ffcdbf018d1a6da0e851731b11 100644 (file)
@@ -209,8 +209,9 @@ return_null:
        xor     job_rax, job_rax
        jmp     return
 ENDPROC(sha512_mb_mgr_submit_avx2)
-.data
 
+/* UNUSED?
+.section       .rodata.cst16, "aM", @progbits, 16
 .align 16
 H0:     .int  0x6a09e667
 H1:     .int  0xbb67ae85
@@ -220,3 +221,4 @@ H4:     .int  0x510e527f
 H5:     .int  0x9b05688c
 H6:     .int  0x1f83d9ab
 H7:     .int  0x5be0cd19
+*/
index 31ab1eff64133c9b4da7e490fc3d09a24e5bb7a7..e22e907643a6df0537f62ae3c2b19b2389f1ae2c 100644 (file)
@@ -361,7 +361,7 @@ Lrounds_16_xx:
        ret
 ENDPROC(sha512_x4_avx2)
 
-.data
+.section       .rodata.K512_4, "a", @progbits
 .align 64
 K512_4:
        .octa 0x428a2f98d728ae22428a2f98d728ae22,\
@@ -525,5 +525,7 @@ K512_4:
        .octa 0x6c44198c4a4758176c44198c4a475817,\
                0x6c44198c4a4758176c44198c4a475817
 
+.section       .rodata.cst32.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 32
+.align 32
 PSHUFFLE_BYTE_FLIP_MASK: .octa 0x08090a0b0c0d0e0f0001020304050607
                          .octa 0x18191a1b1c1d1e1f1011121314151617
index e610e29cbc81841eddbd5d8954b2dff997c541f3..66bbd9058a90d67f51a44340e66ddfcd3801ec60 100644 (file)
@@ -369,14 +369,17 @@ ENDPROC(sha512_transform_ssse3)
 ########################################################################
 ### Binary Data
 
-.data
-
+.section       .rodata.cst16.XMM_QWORD_BSWAP, "aM", @progbits, 16
 .align 16
-
 # Mask for byte-swapping a couple of qwords in an XMM register using (v)pshufb.
 XMM_QWORD_BSWAP:
        .octa 0x08090a0b0c0d0e0f0001020304050607
 
+# Mergeable 640-byte rodata section. This allows linker to merge the table
+# with other, exactly the same 640-byte fragment of another rodata section
+# (if such section exists).
+.section       .rodata.cst640.K512, "aM", @progbits, 640
+.align 64
 # K[t] used in SHA512 hashing
 K512:
        .quad 0x428a2f98d728ae22,0x7137449123ef65cd
index dc66273e610d972d54efbd3f4b6b6f865015c92b..b3f49d2863480334e8b2d12828e4ca20045b8be9 100644 (file)
 
 .file "twofish-avx-x86_64-asm_64.S"
 
-.data
+.section       .rodata.cst16.bswap128_mask, "aM", @progbits, 16
 .align 16
-
 .Lbswap128_mask:
        .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+
+.section       .rodata.cst16.xts_gf128mul_and_shl1_mask, "aM", @progbits, 16
+.align 16
 .Lxts_gf128mul_and_shl1_mask:
        .byte 0x87, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0