Skip to content

Commit 7e78061

Browse files
Peter Zijlstragregkh
authored andcommitted
x86/its: FineIBT-paranoid vs ITS
commit e52c1dc upstream. FineIBT-paranoid was using the retpoline bytes for the paranoid check, disabling retpolines, because all parts that have IBT also have eIBRS and thus don't need no stinking retpolines. Except... ITS needs the retpolines for indirect calls must not be in the first half of a cacheline :-/ So what was the paranoid call sequence: <fineibt_paranoid_start>: 0: 41 ba 78 56 34 12 mov $0x12345678, %r10d 6: 45 3b 53 f7 cmp -0x9(%r11), %r10d a: 4d 8d 5b <f0> lea -0x10(%r11), %r11 e: 75 fd jne d <fineibt_paranoid_start+0xd> 10: 41 ff d3 call *%r11 13: 90 nop Now becomes: <fineibt_paranoid_start>: 0: 41 ba 78 56 34 12 mov $0x12345678, %r10d 6: 45 3b 53 f7 cmp -0x9(%r11), %r10d a: 4d 8d 5b f0 lea -0x10(%r11), %r11 e: 2e e8 XX XX XX XX cs call __x86_indirect_paranoid_thunk_r11 Where the paranoid_thunk looks like: 1d: <ea> (bad) __x86_indirect_paranoid_thunk_r11: 1e: 75 fd jne 1d __x86_indirect_its_thunk_r11: 20: 41 ff eb jmp *%r11 23: cc int3 [ dhansen: remove initialization to false ] Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Signed-off-by: Pawan Gupta <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Reviewed-by: Alexandre Chartre <[email protected]> [ Just a portion of the original commit, in order to fix a build issue in stable kernels due to backports ] Tested-by: Holger Hoffstätte <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent bb85c3a commit 7e78061

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

arch/x86/include/asm/alternative.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <linux/types.h>
66
#include <linux/stringify.h>
77
#include <asm/asm.h>
8+
#include <asm/bug.h>
89

910
#define ALT_FLAGS_SHIFT 16
1011

@@ -138,10 +139,17 @@ static __always_inline int x86_call_depth_emit_accounting(u8 **pprog,
138139
extern void its_init_mod(struct module *mod);
139140
extern void its_fini_mod(struct module *mod);
140141
extern void its_free_mod(struct module *mod);
142+
extern u8 *its_static_thunk(int reg);
141143
#else /* CONFIG_MITIGATION_ITS */
142144
static inline void its_init_mod(struct module *mod) { }
143145
static inline void its_fini_mod(struct module *mod) { }
144146
static inline void its_free_mod(struct module *mod) { }
147+
static inline u8 *its_static_thunk(int reg)
148+
{
149+
WARN_ONCE(1, "ITS not compiled in");
150+
151+
return NULL;
152+
}
145153
#endif
146154

147155
#if defined(CONFIG_MITIGATION_RETHUNK) && defined(CONFIG_OBJTOOL)

arch/x86/kernel/alternative.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,13 @@ static void *its_allocate_thunk(int reg)
248248
return thunk;
249249
}
250250

251+
u8 *its_static_thunk(int reg)
252+
{
253+
u8 *thunk = __x86_indirect_its_thunk_array[reg];
254+
255+
return thunk;
256+
}
257+
251258
#endif
252259

253260
/*

arch/x86/net/bpf_jit_comp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ static void emit_indirect_jump(u8 **pprog, int reg, u8 *ip)
641641

642642
if (cpu_feature_enabled(X86_FEATURE_INDIRECT_THUNK_ITS)) {
643643
OPTIMIZER_HIDE_VAR(reg);
644-
emit_jump(&prog, &__x86_indirect_its_thunk_array[reg], ip);
644+
emit_jump(&prog, its_static_thunk(reg), ip);
645645
} else if (cpu_feature_enabled(X86_FEATURE_RETPOLINE_LFENCE)) {
646646
EMIT_LFENCE();
647647
EMIT2(0xFF, 0xE0 + reg);

0 commit comments

Comments
 (0)