]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
x86/sev: Disable jump tables in SEV startup code
authorArd Biesheuvel <ardb@kernel.org>
Mon, 27 Jan 2025 11:43:37 +0000 (12:43 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 28 Jan 2025 22:10:29 +0000 (23:10 +0100)
When retpolines and IBT are both disabled, the compiler is free to use
jump tables to optimize switch instructions. However, these are emitted
by Clang as absolute references into .rodata:

        jmp    *-0x7dfffe90(,%r9,8)
                        R_X86_64_32S    .rodata+0x170

Given that this code will execute before that address in .rodata has even
been mapped, it is guaranteed to crash a SEV-SNP guest in a way that is
difficult to diagnose.

So disable jump tables when building this code. It would be better if we
could attach this annotation to the __head macro but this appears to be
impossible.

Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Tested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20250127114334.1045857-6-ardb+git@google.com
arch/x86/coco/sev/Makefile

index 08de375593074611896fbb22f5419dfdfc863c03..dcb06dc8b5aeaeb6878f33a37da0dc97fdb2a2f8 100644 (file)
@@ -2,6 +2,10 @@
 
 obj-y += core.o
 
+# jump tables are emitted using absolute references in non-PIC code
+# so they cannot be used in the early SEV startup code
+CFLAGS_core.o += -fno-jump-tables
+
 ifdef CONFIG_FUNCTION_TRACER
 CFLAGS_REMOVE_core.o = -pg
 endif