Merge tag 'x86_core_for_v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 core updates from Borislav Petkov:
- Add the call depth tracking mitigation for Retbleed which has been
long in the making. It is a lighterweight software-only fix for
Skylake-based cores where enabling IBRS is a big hammer and causes a
significant performance impact.
What it basically does is, it aligns all kernel functions to 16 bytes
boundary and adds a 16-byte padding before the function, objtool
collects all functions' locations and when the mitigation gets
applied, it patches a call accounting thunk which is used to track
the call depth of the stack at any time.
When that call depth reaches a magical, microarchitecture-specific
value for the Return Stack Buffer, the code stuffs that RSB and
avoids its underflow which could otherwise lead to the Intel variant
of Retbleed.
This software-only solution brings a lot of the lost performance
back, as benchmarks suggest:
https://lore.kernel.org/all/20220915111039.092790446@infradead.org/
That page above also contains a lot more detailed explanation of the
whole mechanism
- Implement a new control flow integrity scheme called FineIBT which is
based on the software kCFI implementation and uses hardware IBT
support where present to annotate and track indirect branches using a
hash to validate them
- Other misc fixes and cleanups
* tag 'x86_core_for_v6.2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (80 commits)
x86/paravirt: Use common macro for creating simple asm paravirt functions
x86/paravirt: Remove clobber bitmask from .parainstructions
x86/debug: Include percpu.h in debugreg.h to get DECLARE_PER_CPU() et al
x86/cpufeatures: Move X86_FEATURE_CALL_DEPTH from bit 18 to bit 19 of word 11, to leave space for WIP X86_FEATURE_SGX_EDECCSSA bit
x86/Kconfig: Enable kernel IBT by default
x86,pm: Force out-of-line memcpy()
objtool: Fix weak hole vs prefix symbol
objtool: Optimize elf_dirty_reloc_sym()
x86/cfi: Add boot time hash randomization
x86/cfi: Boot time selection of CFI scheme
x86/ibt: Implement FineIBT
objtool: Add --cfi to generate the .cfi_sites section
x86: Add prefix symbols for function padding
objtool: Add option to generate prefix symbols
objtool: Avoid O(bloody terrible) behaviour -- an ode to libelf
objtool: Slice up elf_create_section_symbol()
kallsyms: Revert "Take callthunks into account"
x86: Unconfuse CONFIG_ and X86_FEATURE_ namespaces
x86/retpoline: Fix crash printing warning
x86/paravirt: Fix a !PARAVIRT build warning
...
This commit is contained in:
@@ -15,7 +15,18 @@ extern struct static_call_site __start_static_call_sites[],
|
||||
extern struct static_call_tramp_key __start_static_call_tramp_key[],
|
||||
__stop_static_call_tramp_key[];
|
||||
|
||||
static bool static_call_initialized;
|
||||
static int static_call_initialized;
|
||||
|
||||
/*
|
||||
* Must be called before early_initcall() to be effective.
|
||||
*/
|
||||
void static_call_force_reinit(void)
|
||||
{
|
||||
if (WARN_ON_ONCE(!static_call_initialized))
|
||||
return;
|
||||
|
||||
static_call_initialized++;
|
||||
}
|
||||
|
||||
/* mutex to protect key modules/sites */
|
||||
static DEFINE_MUTEX(static_call_mutex);
|
||||
@@ -475,7 +486,8 @@ int __init static_call_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (static_call_initialized)
|
||||
/* See static_call_force_reinit(). */
|
||||
if (static_call_initialized == 1)
|
||||
return 0;
|
||||
|
||||
cpus_read_lock();
|
||||
@@ -490,11 +502,12 @@ int __init static_call_init(void)
|
||||
BUG();
|
||||
}
|
||||
|
||||
static_call_initialized = true;
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
register_module_notifier(&static_call_module_nb);
|
||||
if (!static_call_initialized)
|
||||
register_module_notifier(&static_call_module_nb);
|
||||
#endif
|
||||
|
||||
static_call_initialized = 1;
|
||||
return 0;
|
||||
}
|
||||
early_initcall(static_call_init);
|
||||
|
||||
@@ -785,7 +785,14 @@ static struct fgraph_ops fgraph_ops __initdata = {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
|
||||
noinline __noclone static void trace_direct_tramp(void) { }
|
||||
#ifndef CALL_DEPTH_ACCOUNT
|
||||
#define CALL_DEPTH_ACCOUNT ""
|
||||
#endif
|
||||
|
||||
noinline __noclone static void trace_direct_tramp(void)
|
||||
{
|
||||
asm(CALL_DEPTH_ACCOUNT);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user