mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: guard against straight-line speculation past RET
Under certain conditions CPUs can speculate into the instruction stream
past a RET instruction. Guard against this just like 3b7dab93f2
("x86/spec-ctrl: Protect against CALL/JMP straight-line speculation")
did - by inserting an "INT $3" insn. It's merely the mechanics of how to
achieve this that differ: A set of macros gets introduced to post-
process RET insns issued by the compiler (or living in assembly files).
Unfortunately for clang this requires further features their built-in
assembler doesn't support: We need to be able to override insn mnemonics
produced by the compiler (which may be impossible, if internally
assembly mnemonics never get generated).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
0a87e677f4
commit
71b0b475d8
2 files changed
+20
-1
No files matched your search
+4
-1
@@ -145,7 +145,10 @@ t2 = $(call as-insn,$(CC) -I$(BASEDIR)/include,".include \"asm-x86/asm-defns.h\"
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=36110
|
||||
t3 = $(call as-insn,$(CC),".macro FOO;.endm"$(close); asm volatile $(open)".macro FOO;.endm",-no-integrated-as)
|
||||
|
||||
CLANG_FLAGS += $(call or,$(t1),$(t2),$(t3))
|
||||
# Check whether macros can override insn mnemonics in inline assembly.
|
||||
t4 = $(call as-insn,$(CC),".macro ret; .error; .endm; .macro retq; .error; .endm",-no-integrated-as)
|
||||
|
||||
CLANG_FLAGS += $(call or,$(t1),$(t2),$(t3),$(t4))
|
||||
endif
|
||||
|
||||
CLANG_FLAGS += -Werror=unknown-warning-option
|
||||
|
||||
@@ -57,6 +57,22 @@
|
||||
INDIRECT_BRANCH jmp \arg
|
||||
.endm
|
||||
|
||||
/*
|
||||
* To guard against speculation past RET, insert a breakpoint insn
|
||||
* immediately after them.
|
||||
*/
|
||||
.macro ret operand:vararg
|
||||
retq \operand
|
||||
.endm
|
||||
.macro retq operand:vararg
|
||||
.ifb \operand
|
||||
.byte 0xc3
|
||||
.else
|
||||
.byte 0xc2
|
||||
.word \operand
|
||||
.endif
|
||||
.endm
|
||||
|
||||
.macro guest_access_mask_ptr ptr:req, scratch1:req, scratch2:req
|
||||
#if defined(CONFIG_SPECULATIVE_HARDEN_GUEST_ACCESS)
|
||||
/*
|
||||
|
||||