Skip to content

Commit cbe8ded

Browse files
nickdesaulniersbp3tk0v
authored andcommitted
x86/srso: Fix build breakage with the LLVM linker
The assertion added to verify the difference in bits set of the addresses of srso_untrain_ret_alias() and srso_safe_ret_alias() would fail to link in LLVM's ld.lld linker with the following error: ld.lld: error: ./arch/x86/kernel/vmlinux.lds:210: at least one side of the expression must be absolute ld.lld: error: ./arch/x86/kernel/vmlinux.lds:211: at least one side of the expression must be absolute Use ABSOLUTE to evaluate the expression referring to at least one of the symbols so that LLD can evaluate the linker script. Also, add linker version info to the comment about XOR being unsupported in either ld.bfd or ld.lld until somewhat recently. Fixes: fb3bd91 ("x86/srso: Add a Speculative RAS Overflow mitigation") Closes: https://lore.kernel.org/llvm/CA+G9fYsdUeNu-gwbs0+T6XHi4hYYk=Y9725-wFhZ7gJMspLDRA@mail.gmail.com/ Reported-by: Nathan Chancellor <nathan@kernel.org> Reported-by: Daniel Kolesa <daniel@octaforge.org> Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Suggested-by: Sven Volkinsfeld <thyrc@gmx.net> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: ClangBuiltLinux#1907 Link: https://lore.kernel.org/r/20230809-gds-v1-1-eaac90b0cbcc@google.com
1 parent 09f9f37 commit cbe8ded

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

arch/x86/kernel/vmlinux.lds.S

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,11 +529,17 @@ INIT_PER_CPU(irq_stack_backing_store);
529529

530530
#ifdef CONFIG_CPU_SRSO
531531
/*
532-
* GNU ld cannot do XOR so do: (A | B) - (A & B) in order to compute the XOR
532+
* GNU ld cannot do XOR until 2.41.
533+
* https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f6f78318fca803c4907fb8d7f6ded8295f1947b1
534+
*
535+
* LLVM lld cannot do XOR until lld-17.
536+
* https://github.com/llvm/llvm-project/commit/fae96104d4378166cbe5c875ef8ed808a356f3fb
537+
*
538+
* Instead do: (A | B) - (A & B) in order to compute the XOR
533539
* of the two function addresses:
534540
*/
535-
. = ASSERT(((srso_untrain_ret_alias | srso_safe_ret_alias) -
536-
(srso_untrain_ret_alias & srso_safe_ret_alias)) == ((1 << 2) | (1 << 8) | (1 << 14) | (1 << 20)),
541+
. = ASSERT(((ABSOLUTE(srso_untrain_ret_alias) | srso_safe_ret_alias) -
542+
(ABSOLUTE(srso_untrain_ret_alias) & srso_safe_ret_alias)) == ((1 << 2) | (1 << 8) | (1 << 14) | (1 << 20)),
537543
"SRSO function pair won't alias");
538544
#endif
539545

0 commit comments

Comments
 (0)