Skip to content

Commit

Permalink
x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO…
Browse files Browse the repository at this point in the history
…_CLANG

Linker script arch/x86/kernel/vmlinux.lds.S matches the thunk sections
".text.__x86.*" from arch/x86/lib/retpoline.S as follows:

.text {
  [...]
  TEXT_TEXT
  [...]
  __indirect_thunk_start = .;
  *(.text.__x86.*)
  __indirect_thunk_end = .;
  [...]
}

Macro TEXT_TEXT references TEXT_MAIN which normally expands to only
".text". However, with CONFIG_LTO_CLANG, TEXT_MAIN becomes
".text .text.[0-9a-zA-Z_]*" which wrongly matches also the thunk
sections. The output layout is then different than expected. For
instance, the currently defined range [__indirect_thunk_start,
__indirect_thunk_end] becomes empty.

Prevent the problem by using ".." as the first separator, for example,
".text..__x86.indirect_thunk". This pattern is utilized by other
explicit section names which start with one of the standard prefixes,
such as ".text" or ".data", and that need to be individually selected in
the linker script.

Fixes: dc5723b ("kbuild: add support for Clang LTO")
Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20230711091952.27944-2-petr.pavlu@suse.com
[nathan: Fix conflicts with SRSO and fold in fix issue brought up by Andrew
         Cooper in post-review:
         https://lore.kernel.org/20230803230323.1478869-1-andrew.cooper3@citrix.com/]
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
  • Loading branch information
petrpavlu authored and nathanchance committed Aug 9, 2023
1 parent 8a9b1f6 commit 150c424
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 9 deletions.
8 changes: 4 additions & 4 deletions arch/x86/kernel/vmlinux.lds.S
Expand Up @@ -134,15 +134,15 @@ SECTIONS
SOFTIRQENTRY_TEXT
#ifdef CONFIG_RETPOLINE
__indirect_thunk_start = .;
*(.text.__x86.indirect_thunk)
*(.text.__x86.return_thunk)
*(.text..__x86.indirect_thunk)
*(.text..__x86.return_thunk)
__indirect_thunk_end = .;
#endif
STATIC_CALL_TEXT

ALIGN_ENTRY_TEXT_BEGIN
#ifdef CONFIG_CPU_SRSO
*(.text.__x86.rethunk_untrain)
*(.text..__x86.rethunk_untrain)
#endif

ENTRY_TEXT
Expand All @@ -153,7 +153,7 @@ SECTIONS
* definition.
*/
. = srso_untrain_ret_alias | (1 << 2) | (1 << 8) | (1 << 14) | (1 << 20);
*(.text.__x86.rethunk_safe)
*(.text..__x86.rethunk_safe)
#endif
ALIGN_ENTRY_TEXT_END
*(.gnu.warning)
Expand Down
8 changes: 4 additions & 4 deletions arch/x86/lib/retpoline.S
Expand Up @@ -13,7 +13,7 @@
#include <asm/frame.h>
#include <asm/nops.h>

.section .text.__x86.indirect_thunk
.section .text..__x86.indirect_thunk


.macro POLINE reg
Expand Down Expand Up @@ -148,7 +148,7 @@ SYM_CODE_END(__x86_indirect_jump_thunk_array)
* As a result, srso_safe_ret_alias() becomes a safe return.
*/
#ifdef CONFIG_CPU_SRSO
.section .text.__x86.rethunk_untrain
.section .text..__x86.rethunk_untrain

SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
ANNOTATE_NOENDBR
Expand All @@ -158,7 +158,7 @@ SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
SYM_FUNC_END(srso_untrain_ret_alias)
__EXPORT_THUNK(srso_untrain_ret_alias)

.section .text.__x86.rethunk_safe
.section .text..__x86.rethunk_safe
#endif

/* Needs a definition for the __x86_return_thunk alternative below. */
Expand All @@ -172,7 +172,7 @@ SYM_START(srso_safe_ret_alias, SYM_L_GLOBAL, SYM_A_NONE)
int3
SYM_FUNC_END(srso_safe_ret_alias)

.section .text.__x86.return_thunk
.section .text..__x86.return_thunk

/*
* Safety details here pertain to the AMD Zen{1,2} microarchitecture:
Expand Down
2 changes: 1 addition & 1 deletion tools/objtool/check.c
Expand Up @@ -389,7 +389,7 @@ static int decode_instructions(struct objtool_file *file)
if (!strcmp(sec->name, ".noinstr.text") ||
!strcmp(sec->name, ".entry.text") ||
!strcmp(sec->name, ".cpuidle.text") ||
!strncmp(sec->name, ".text.__x86.", 12))
!strncmp(sec->name, ".text..__x86.", 13))
sec->noinstr = true;

/*
Expand Down

0 comments on commit 150c424

Please sign in to comment.