Skip to content

Commit

Permalink
x86,kcfi: Fix EXPORT_SYMBOL vs kCFI
Browse files Browse the repository at this point in the history
The expectation is that all EXPORT'ed symbols are free to have their
address taken and called indirectly. The majority of the assembly
defined functions currently violate this expectation.

Make then all use SYM_TYPED_FUNC_START() in order to emit the proper
kCFI preamble.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Link: https://lore.kernel.org/r/20250207122546.302679189@infradead.org
  • Loading branch information
Peter Zijlstra committed Feb 14, 2025
1 parent 72e213a commit 2981557
Show file tree
Hide file tree
Showing 11 changed files with 32 additions and 21 deletions.
7 changes: 4 additions & 3 deletions arch/x86/crypto/camellia-aesni-avx-asm_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/frame.h>

#define CAMELLIA_TABLE_BYTE_LEN 272
Expand Down Expand Up @@ -882,7 +883,7 @@ SYM_FUNC_START_LOCAL(__camellia_dec_blk16)
jmp .Ldec_max24;
SYM_FUNC_END(__camellia_dec_blk16)

SYM_FUNC_START(camellia_ecb_enc_16way)
SYM_TYPED_FUNC_START(camellia_ecb_enc_16way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst (16 blocks)
Expand All @@ -907,7 +908,7 @@ SYM_FUNC_START(camellia_ecb_enc_16way)
RET;
SYM_FUNC_END(camellia_ecb_enc_16way)

SYM_FUNC_START(camellia_ecb_dec_16way)
SYM_TYPED_FUNC_START(camellia_ecb_dec_16way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst (16 blocks)
Expand Down Expand Up @@ -937,7 +938,7 @@ SYM_FUNC_START(camellia_ecb_dec_16way)
RET;
SYM_FUNC_END(camellia_ecb_dec_16way)

SYM_FUNC_START(camellia_cbc_dec_16way)
SYM_TYPED_FUNC_START(camellia_cbc_dec_16way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst (16 blocks)
Expand Down
1 change: 1 addition & 0 deletions arch/x86/crypto/camellia-aesni-avx2-asm_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/frame.h>

#define CAMELLIA_TABLE_BYTE_LEN 272
Expand Down
9 changes: 5 additions & 4 deletions arch/x86/crypto/camellia-x86_64-asm_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <linux/linkage.h>
#include <linux/cfi_types.h>

.file "camellia-x86_64-asm_64.S"
.text
Expand Down Expand Up @@ -177,7 +178,7 @@
bswapq RAB0; \
movq RAB0, 4*2(RIO);

SYM_FUNC_START(__camellia_enc_blk)
SYM_TYPED_FUNC_START(__camellia_enc_blk)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down Expand Up @@ -224,7 +225,7 @@ SYM_FUNC_START(__camellia_enc_blk)
RET;
SYM_FUNC_END(__camellia_enc_blk)

SYM_FUNC_START(camellia_dec_blk)
SYM_TYPED_FUNC_START(camellia_dec_blk)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down Expand Up @@ -411,7 +412,7 @@ SYM_FUNC_END(camellia_dec_blk)
bswapq RAB1; \
movq RAB1, 12*2(RIO);

SYM_FUNC_START(__camellia_enc_blk_2way)
SYM_TYPED_FUNC_START(__camellia_enc_blk_2way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down Expand Up @@ -460,7 +461,7 @@ SYM_FUNC_START(__camellia_enc_blk_2way)
RET;
SYM_FUNC_END(__camellia_enc_blk_2way)

SYM_FUNC_START(camellia_dec_blk_2way)
SYM_TYPED_FUNC_START(camellia_dec_blk_2way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down
7 changes: 4 additions & 3 deletions arch/x86/crypto/serpent-avx-x86_64-asm_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/

#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/frame.h>
#include "glue_helper-asm-avx.S"

Expand Down Expand Up @@ -656,7 +657,7 @@ SYM_FUNC_START_LOCAL(__serpent_dec_blk8_avx)
RET;
SYM_FUNC_END(__serpent_dec_blk8_avx)

SYM_FUNC_START(serpent_ecb_enc_8way_avx)
SYM_TYPED_FUNC_START(serpent_ecb_enc_8way_avx)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand All @@ -674,7 +675,7 @@ SYM_FUNC_START(serpent_ecb_enc_8way_avx)
RET;
SYM_FUNC_END(serpent_ecb_enc_8way_avx)

SYM_FUNC_START(serpent_ecb_dec_8way_avx)
SYM_TYPED_FUNC_START(serpent_ecb_dec_8way_avx)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand All @@ -692,7 +693,7 @@ SYM_FUNC_START(serpent_ecb_dec_8way_avx)
RET;
SYM_FUNC_END(serpent_ecb_dec_8way_avx)

SYM_FUNC_START(serpent_cbc_dec_8way_avx)
SYM_TYPED_FUNC_START(serpent_cbc_dec_8way_avx)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down
5 changes: 3 additions & 2 deletions arch/x86/crypto/twofish-x86_64-asm_64-3way.S
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <linux/linkage.h>
#include <linux/cfi_types.h>

.file "twofish-x86_64-asm-3way.S"
.text
Expand Down Expand Up @@ -220,7 +221,7 @@
rorq $32, RAB2; \
outunpack3(mov, RIO, 2, RAB, 2);

SYM_FUNC_START(__twofish_enc_blk_3way)
SYM_TYPED_FUNC_START(__twofish_enc_blk_3way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down Expand Up @@ -269,7 +270,7 @@ SYM_FUNC_START(__twofish_enc_blk_3way)
RET;
SYM_FUNC_END(__twofish_enc_blk_3way)

SYM_FUNC_START(twofish_dec_blk_3way)
SYM_TYPED_FUNC_START(twofish_dec_blk_3way)
/* input:
* %rdi: ctx, CTX
* %rsi: dst
Expand Down
5 changes: 3 additions & 2 deletions arch/x86/crypto/twofish-x86_64-asm_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
.text

#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/asm-offsets.h>

#define a_offset 0
Expand Down Expand Up @@ -202,7 +203,7 @@
xor %r8d, d ## D;\
ror $1, d ## D;

SYM_FUNC_START(twofish_enc_blk)
SYM_TYPED_FUNC_START(twofish_enc_blk)
pushq R1

/* %rdi contains the ctx address */
Expand Down Expand Up @@ -255,7 +256,7 @@ SYM_FUNC_START(twofish_enc_blk)
RET
SYM_FUNC_END(twofish_enc_blk)

SYM_FUNC_START(twofish_dec_blk)
SYM_TYPED_FUNC_START(twofish_dec_blk)
pushq R1

/* %rdi contains the ctx address */
Expand Down
7 changes: 4 additions & 3 deletions arch/x86/lib/clear_page_64.S
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <linux/export.h>
#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/asm.h>

/*
Expand All @@ -14,15 +15,15 @@
* Zero a page.
* %rdi - page
*/
SYM_FUNC_START(clear_page_rep)
SYM_TYPED_FUNC_START(clear_page_rep)
movl $4096/8,%ecx
xorl %eax,%eax
rep stosq
RET
SYM_FUNC_END(clear_page_rep)
EXPORT_SYMBOL_GPL(clear_page_rep)

SYM_FUNC_START(clear_page_orig)
SYM_TYPED_FUNC_START(clear_page_orig)
xorl %eax,%eax
movl $4096/64,%ecx
.p2align 4
Expand All @@ -44,7 +45,7 @@ SYM_FUNC_START(clear_page_orig)
SYM_FUNC_END(clear_page_orig)
EXPORT_SYMBOL_GPL(clear_page_orig)

SYM_FUNC_START(clear_page_erms)
SYM_TYPED_FUNC_START(clear_page_erms)
movl $4096,%ecx
xorl %eax,%eax
rep stosb
Expand Down
3 changes: 2 additions & 1 deletion arch/x86/lib/copy_page_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <linux/export.h>
#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/cpufeatures.h>
#include <asm/alternative.h>

Expand All @@ -13,7 +14,7 @@
* prefetch distance based on SMP/UP.
*/
ALIGN
SYM_FUNC_START(copy_page)
SYM_TYPED_FUNC_START(copy_page)
ALTERNATIVE "jmp copy_page_regs", "", X86_FEATURE_REP_GOOD
movl $4096/8, %ecx
rep movsq
Expand Down
3 changes: 2 additions & 1 deletion arch/x86/lib/memmove_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
#include <linux/export.h>
#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/cpufeatures.h>
#include <asm/alternative.h>

Expand All @@ -26,7 +27,7 @@
* Output:
* rax: dest
*/
SYM_FUNC_START(__memmove)
SYM_TYPED_FUNC_START(__memmove)

mov %rdi, %rax

Expand Down
3 changes: 2 additions & 1 deletion arch/x86/lib/memset_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <linux/export.h>
#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/cpufeatures.h>
#include <asm/alternative.h>

Expand All @@ -28,7 +29,7 @@
* only for the return value that is the same as the source input,
* which the compiler could/should do much better anyway.
*/
SYM_FUNC_START(__memset)
SYM_TYPED_FUNC_START(__memset)
ALTERNATIVE "jmp memset_orig", "", X86_FEATURE_FSRS

movq %rdi,%r9
Expand Down
3 changes: 2 additions & 1 deletion arch/x86/lib/msr-reg.S
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/linkage.h>
#include <linux/errno.h>
#include <linux/cfi_types.h>
#include <asm/asm.h>
#include <asm/msr.h>

Expand All @@ -12,7 +13,7 @@
*
*/
.macro op_safe_regs op
SYM_FUNC_START(\op\()_safe_regs)
SYM_TYPED_FUNC_START(\op\()_safe_regs)
pushq %rbx
pushq %r12
movq %rdi, %r10 /* Save pointer */
Expand Down

0 comments on commit 2981557

Please sign in to comment.