x86/callthunks: Add call patching for call depth tracking
authorThomas Gleixner <tglx@linutronix.de>
Thu, 15 Sep 2022 11:11:23 +0000 (13:11 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 17 Oct 2022 14:41:13 +0000 (16:41 +0200)
commite81dc127ef69887c72735a3e3868930e2bf313ed
treeab2f1fd791dba8e3d3db75b441b962ab2dc2cb5a
parent239f2e248ef12840178a3ed1a217f19b5fbfde26
x86/callthunks: Add call patching for call depth tracking

Mitigating the Intel SKL RSB underflow issue in software requires to
track the call depth. That is every CALL and every RET need to be
intercepted and additional code injected.

The existing retbleed mitigations already include means of redirecting
RET to __x86_return_thunk; this can be re-purposed and RET can be
redirected to another function doing RET accounting.

CALL accounting will use the function padding introduced in prior
patches. For each CALL instruction, the destination symbol's padding
is rewritten to do the accounting and the CALL instruction is adjusted
to call into the padding.

This ensures only affected CPUs pay the overhead of this accounting.
Unaffected CPUs will leave the padding unused and have their 'JMP
__x86_return_thunk' replaced with an actual 'RET' instruction.

Objtool has been modified to supply a .call_sites section that lists
all the 'CALL' instructions. Additionally the paravirt instruction
sites are iterated since they will have been patched from an indirect
call to direct calls (or direct instructions in which case it'll be
ignored).

Module handling and the actual thunk code for SKL will be added in
subsequent steps.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111147.470877038@infradead.org
arch/x86/Kconfig
arch/x86/include/asm/alternative.h
arch/x86/kernel/Makefile
arch/x86/kernel/alternative.c
arch/x86/kernel/callthunks.c [new file with mode: 0644]
arch/x86/kernel/head_64.S
arch/x86/kernel/relocate_kernel_64.S
arch/x86/kernel/vmlinux.lds.S