Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/srso: Fix unret validation dependencies

CONFIG_CPU_SRSO isn't dependent on CONFIG_CPU_UNRET_ENTRY (AMD
Retbleed), so the two features are independently configurable. Fix
several issues for the (presumably rare) case where CONFIG_CPU_SRSO is
enabled but CONFIG_CPU_UNRET_ENTRY isn't.

Fixes: fb3bd914b3ec ("x86/srso: Add a Speculative RAS Overflow mitigation")
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Acked-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/299fb7740174d0f2335e91c58af0e9c242b4bac1.1693889988.git.jpoimboe@kernel.org

authored by

Josh Poimboeuf and committed by
Borislav Petkov (AMD)
eeb9f34d dc6306ad

+6 -4
+2 -2
arch/x86/include/asm/nospec-branch.h
··· 271 271 .Lskip_rsb_\@: 272 272 .endm 273 273 274 - #ifdef CONFIG_CPU_UNRET_ENTRY 274 + #if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_SRSO) 275 275 #define CALL_UNTRAIN_RET "call entry_untrain_ret" 276 276 #else 277 277 #define CALL_UNTRAIN_RET "" ··· 312 312 313 313 .macro UNTRAIN_RET_FROM_CALL 314 314 #if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_IBPB_ENTRY) || \ 315 - defined(CONFIG_CALL_DEPTH_TRACKING) 315 + defined(CONFIG_CALL_DEPTH_TRACKING) || defined(CONFIG_CPU_SRSO) 316 316 VALIDATE_UNRET_END 317 317 ALTERNATIVE_3 "", \ 318 318 CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \
+2 -1
include/linux/objtool.h
··· 130 130 * it will be ignored. 131 131 */ 132 132 .macro VALIDATE_UNRET_BEGIN 133 - #if defined(CONFIG_NOINSTR_VALIDATION) && defined(CONFIG_CPU_UNRET_ENTRY) 133 + #if defined(CONFIG_NOINSTR_VALIDATION) && \ 134 + (defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_SRSO)) 134 135 .Lhere_\@: 135 136 .pushsection .discard.validate_unret 136 137 .long .Lhere_\@ - .
+2 -1
scripts/Makefile.vmlinux_o
··· 37 37 38 38 vmlinux-objtool-args-$(delay-objtool) += $(objtool-args-y) 39 39 vmlinux-objtool-args-$(CONFIG_GCOV_KERNEL) += --no-unreachable 40 - vmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION) += --noinstr $(if $(CONFIG_CPU_UNRET_ENTRY), --unret) 40 + vmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION) += --noinstr \ 41 + $(if $(or $(CONFIG_CPU_UNRET_ENTRY),$(CONFIG_CPU_SRSO)), --unret) 41 42 42 43 objtool-args = $(vmlinux-objtool-args-y) --link 43 44