From dca8bb025d7ed4b12c8a1afd545e6b85ecca4770 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 20 Jun 2022 23:36:21 +0000 Subject: [PATCH] Fix objtool: missing int3 after ret warning Resolve straight-line speculation warnings reported by objtool for x86_64 assembly on Linux when CONFIG_SLS is set. See the following LWN article for the complete details. https://lwn.net/Articles/877845/ Reviewed-by: Ryan Moeller Reviewed-by: Alexander Motin Signed-off-by: Brian Behlendorf Closes #13528 Closes #13575 --- module/icp/asm-x86_64/aes/aes_aesni.S | 24 +++++++++---------- module/icp/asm-x86_64/aes/aes_amd64.S | 4 ++-- module/icp/asm-x86_64/blake3/blake3_avx2.S | 2 +- module/icp/asm-x86_64/blake3/blake3_avx512.S | 6 ++--- module/icp/asm-x86_64/blake3/blake3_sse2.S | 6 ++--- module/icp/asm-x86_64/blake3/blake3_sse41.S | 6 ++--- .../icp/asm-x86_64/modes/aesni-gcm-x86_64.S | 6 ++--- module/icp/asm-x86_64/modes/gcm_pclmulqdq.S | 2 +- module/icp/asm-x86_64/sha2/sha256_impl.S | 2 +- module/icp/asm-x86_64/sha2/sha512_impl.S | 2 +- module/icp/include/sys/ia32/asm_linkage.h | 6 +++++ module/lua/setjmp/setjmp_x86_64.S | 10 ++++++-- 12 files changed, 44 insertions(+), 32 deletions(-) diff --git a/module/icp/asm-x86_64/aes/aes_aesni.S b/module/icp/asm-x86_64/aes/aes_aesni.S index 1a8669ccd1d6..f622235bd15b 100644 --- a/module/icp/asm-x86_64/aes/aes_aesni.S +++ b/module/icp/asm-x86_64/aes/aes_aesni.S @@ -208,7 +208,7 @@ _key_expansion_256a_local: pxor %xmm1, %xmm0 movups %xmm0, (%rcx) add $0x10, %rcx - ret + RET nop SET_SIZE(_key_expansion_128) SET_SIZE(_key_expansion_256a) @@ -236,7 +236,7 @@ _key_expansion_192a_local: shufps $0b01001110, %xmm2, %xmm1 movups %xmm1, 0x10(%rcx) add $0x20, %rcx - ret + RET SET_SIZE(_key_expansion_192a) @@ -257,7 +257,7 @@ _key_expansion_192b_local: movups %xmm0, (%rcx) add $0x10, %rcx - ret + RET SET_SIZE(_key_expansion_192b) @@ -271,7 +271,7 @@ _key_expansion_256b_local: pxor %xmm1, %xmm2 movups %xmm2, (%rcx) add $0x10, %rcx - ret + RET SET_SIZE(_key_expansion_256b) @@ -376,7 +376,7 @@ rijndael_key_setup_enc_intel_local: mov $14, %rax // return # rounds = 14 #endif FRAME_END - ret + RET .align 4 .Lenc_key192: @@ -413,7 +413,7 @@ rijndael_key_setup_enc_intel_local: mov $12, %rax // return # rounds = 12 #endif FRAME_END - ret + RET .align 4 .Lenc_key128: @@ -453,13 +453,13 @@ rijndael_key_setup_enc_intel_local: mov $10, %rax // return # rounds = 10 #endif FRAME_END - ret + RET .Lenc_key_invalid_param: #ifdef OPENSSL_INTERFACE mov $-1, %rax // user key or AES key pointer is NULL FRAME_END - ret + RET #else /* FALLTHROUGH */ #endif /* OPENSSL_INTERFACE */ @@ -471,7 +471,7 @@ rijndael_key_setup_enc_intel_local: xor %rax, %rax // a key pointer is NULL or invalid keysize #endif /* OPENSSL_INTERFACE */ FRAME_END - ret + RET SET_SIZE(rijndael_key_setup_enc_intel) @@ -548,7 +548,7 @@ FRAME_BEGIN // OpenSolaris: rax = # rounds (10, 12, or 14) or 0 for error // OpenSSL: rax = 0 for OK, or non-zero for error FRAME_END - ret + RET SET_SIZE(rijndael_key_setup_dec_intel) @@ -655,7 +655,7 @@ ENTRY_NP(aes_encrypt_intel) aesenclast %KEY, %STATE // last round movups %STATE, (%OUTP) // output - ret + RET SET_SIZE(aes_encrypt_intel) @@ -738,7 +738,7 @@ ENTRY_NP(aes_decrypt_intel) aesdeclast %KEY, %STATE // last round movups %STATE, (%OUTP) // output - ret + RET SET_SIZE(aes_decrypt_intel) #endif /* lint || __lint */ diff --git a/module/icp/asm-x86_64/aes/aes_amd64.S b/module/icp/asm-x86_64/aes/aes_amd64.S index d16cc9996e25..f546e8933be1 100644 --- a/module/icp/asm-x86_64/aes/aes_amd64.S +++ b/module/icp/asm-x86_64/aes/aes_amd64.S @@ -785,7 +785,7 @@ ENTRY_NP(aes_encrypt_amd64) mov 2*8(%rsp), %rbp mov 3*8(%rsp), %r12 add $[4*8], %rsp - ret + RET SET_SIZE(aes_encrypt_amd64) @@ -896,7 +896,7 @@ ENTRY_NP(aes_decrypt_amd64) mov 2*8(%rsp), %rbp mov 3*8(%rsp), %r12 add $[4*8], %rsp - ret + RET SET_SIZE(aes_decrypt_amd64) #endif /* lint || __lint */ diff --git a/module/icp/asm-x86_64/blake3/blake3_avx2.S b/module/icp/asm-x86_64/blake3/blake3_avx2.S index b15d8fc7744e..3a7094f12b39 100644 --- a/module/icp/asm-x86_64/blake3/blake3_avx2.S +++ b/module/icp/asm-x86_64/blake3/blake3_avx2.S @@ -1334,7 +1334,7 @@ zfs_blake3_hash_many_avx2: pop r13 pop r14 pop r15 - ret + RET .p2align 5 3: mov rbx, qword ptr [rbp+0x50] diff --git a/module/icp/asm-x86_64/blake3/blake3_avx512.S b/module/icp/asm-x86_64/blake3/blake3_avx512.S index d02c5e7ec92f..4bfdb74123d4 100644 --- a/module/icp/asm-x86_64/blake3/blake3_avx512.S +++ b/module/icp/asm-x86_64/blake3/blake3_avx512.S @@ -1116,7 +1116,7 @@ zfs_blake3_hash_many_avx512: pop r13 pop r14 pop r15 - ret + RET .p2align 6 3: test esi, 0x8 @@ -2487,7 +2487,7 @@ zfs_blake3_compress_in_place_avx512: vpxor xmm1, xmm1, xmm3 vmovdqu xmmword ptr [rdi], xmm0 vmovdqu xmmword ptr [rdi+0x10], xmm1 - ret + RET .p2align 6 zfs_blake3_compress_xof_avx512: @@ -2573,7 +2573,7 @@ zfs_blake3_compress_xof_avx512: vmovdqu xmmword ptr [r9+0x10], xmm1 vmovdqu xmmword ptr [r9+0x20], xmm2 vmovdqu xmmword ptr [r9+0x30], xmm3 - ret + RET .size zfs_blake3_hash_many_avx512, . - zfs_blake3_hash_many_avx512 .size zfs_blake3_compress_in_place_avx512, . - zfs_blake3_compress_in_place_avx512 diff --git a/module/icp/asm-x86_64/blake3/blake3_sse2.S b/module/icp/asm-x86_64/blake3/blake3_sse2.S index 39d23ee233df..8e891dd524c0 100644 --- a/module/icp/asm-x86_64/blake3/blake3_sse2.S +++ b/module/icp/asm-x86_64/blake3/blake3_sse2.S @@ -1671,7 +1671,7 @@ zfs_blake3_hash_many_sse2: pop r13 pop r14 pop r15 - ret + RET .p2align 5 3: test esi, 0x2 @@ -2157,7 +2157,7 @@ zfs_blake3_compress_in_place_sse2: pxor xmm1, xmm3 movups xmmword ptr [rdi], xmm0 movups xmmword ptr [rdi+0x10], xmm1 - ret + RET .p2align 6 zfs_blake3_compress_xof_sse2: @@ -2276,7 +2276,7 @@ zfs_blake3_compress_xof_sse2: movups xmmword ptr [r9+0x10], xmm1 movups xmmword ptr [r9+0x20], xmm2 movups xmmword ptr [r9+0x30], xmm3 - ret + RET .size zfs_blake3_hash_many_sse2, . - zfs_blake3_hash_many_sse2 .size zfs_blake3_compress_in_place_sse2, . - zfs_blake3_compress_in_place_sse2 diff --git a/module/icp/asm-x86_64/blake3/blake3_sse41.S b/module/icp/asm-x86_64/blake3/blake3_sse41.S index 1c40236f0628..51477232371f 100644 --- a/module/icp/asm-x86_64/blake3/blake3_sse41.S +++ b/module/icp/asm-x86_64/blake3/blake3_sse41.S @@ -1475,7 +1475,7 @@ zfs_blake3_hash_many_sse41: pop r13 pop r14 pop r15 - ret + RET .p2align 5 3: test esi, 0x2 @@ -1908,7 +1908,7 @@ zfs_blake3_compress_in_place_sse41: pxor xmm1, xmm3 movups xmmword ptr [rdi], xmm0 movups xmmword ptr [rdi+0x10], xmm1 - ret + RET .p2align 6 zfs_blake3_compress_xof_sse41: _CET_ENDBR @@ -2015,7 +2015,7 @@ zfs_blake3_compress_xof_sse41: movups xmmword ptr [r9+0x10], xmm1 movups xmmword ptr [r9+0x20], xmm2 movups xmmword ptr [r9+0x30], xmm3 - ret + RET .size zfs_blake3_hash_many_sse41, . - zfs_blake3_hash_many_sse41 .size zfs_blake3_compress_in_place_sse41, . - zfs_blake3_compress_in_place_sse41 diff --git a/module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S b/module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S index dc71ae2c1c89..70e419c2e4ab 100644 --- a/module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S +++ b/module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S @@ -1201,7 +1201,7 @@ aesni_gcm_encrypt: .align 32 clear_fpu_regs_avx: vzeroall - ret + RET .size clear_fpu_regs_avx,.-clear_fpu_regs_avx /* @@ -1219,7 +1219,7 @@ gcm_xor_avx: movdqu (%rsi), %xmm1 pxor %xmm1, %xmm0 movdqu %xmm0, (%rsi) - ret + RET .size gcm_xor_avx,.-gcm_xor_avx /* @@ -1236,7 +1236,7 @@ atomic_toggle_boolean_nv: jz 1f movl $1, %eax 1: - ret + RET .size atomic_toggle_boolean_nv,.-atomic_toggle_boolean_nv .align 64 diff --git a/module/icp/asm-x86_64/modes/gcm_pclmulqdq.S b/module/icp/asm-x86_64/modes/gcm_pclmulqdq.S index 74eacbbe6388..6c0540321884 100644 --- a/module/icp/asm-x86_64/modes/gcm_pclmulqdq.S +++ b/module/icp/asm-x86_64/modes/gcm_pclmulqdq.S @@ -244,7 +244,7 @@ ENTRY_NP(gcm_mul_pclmulqdq) // // Return // - ret + RET SET_SIZE(gcm_mul_pclmulqdq) #endif /* lint || __lint */ diff --git a/module/icp/asm-x86_64/sha2/sha256_impl.S b/module/icp/asm-x86_64/sha2/sha256_impl.S index 951297c72ff8..1391bd59a017 100644 --- a/module/icp/asm-x86_64/sha2/sha256_impl.S +++ b/module/icp/asm-x86_64/sha2/sha256_impl.S @@ -2058,7 +2058,7 @@ ENTRY_NP(SHA256TransformBlocks) .cfi_adjust_cfa_offset -8 .cfi_restore %rbx - ret + RET .cfi_endproc SET_SIZE(SHA256TransformBlocks) diff --git a/module/icp/asm-x86_64/sha2/sha512_impl.S b/module/icp/asm-x86_64/sha2/sha512_impl.S index 921d3d8cddae..e61e96957bc6 100644 --- a/module/icp/asm-x86_64/sha2/sha512_impl.S +++ b/module/icp/asm-x86_64/sha2/sha512_impl.S @@ -2059,7 +2059,7 @@ ENTRY_NP(SHA512TransformBlocks) .cfi_adjust_cfa_offset -8 .cfi_restore %rbx - ret + RET .cfi_endproc SET_SIZE(SHA512TransformBlocks) diff --git a/module/icp/include/sys/ia32/asm_linkage.h b/module/icp/include/sys/ia32/asm_linkage.h index 71588cb5ce5f..71157caeee2a 100644 --- a/module/icp/include/sys/ia32/asm_linkage.h +++ b/module/icp/include/sys/ia32/asm_linkage.h @@ -30,6 +30,12 @@ #include #include +#if defined(__linux__) && defined(CONFIG_SLS) +#define RET ret; int3 +#else +#define RET ret +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/module/lua/setjmp/setjmp_x86_64.S b/module/lua/setjmp/setjmp_x86_64.S index 459ebecbc1e7..8defa1c904fe 100644 --- a/module/lua/setjmp/setjmp_x86_64.S +++ b/module/lua/setjmp/setjmp_x86_64.S @@ -46,6 +46,12 @@ x: .size x, [.-x] #endif // WIN32 +#if defined(__linux__) && defined(CONFIG_SLS) +#define RET ret; int3 +#else +#define RET ret +#endif + /* * Setjmp and longjmp implement non-local gotos using state vectors * type label_t. @@ -63,7 +69,7 @@ x: movq 0(%rsp), %rdx /* return address */ movq %rdx, 56(%rdi) /* rip */ xorl %eax, %eax /* return 0 */ - ret + RET SET_SIZE(setjmp) ENTRY(longjmp) @@ -78,7 +84,7 @@ x: movq %rdx, 0(%rsp) xorl %eax, %eax incl %eax /* return 1 */ - ret + RET SET_SIZE(longjmp) #ifdef __ELF__