mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[x86][seses] Add clang flag; Use lvi-cfi with seses
This patch creates a clang flag to enable SESES. This flag also ensures that lvi-cfi is on when using seses via clang. SESES should use lvi-cfi to mitigate returns and indirect branches. The flag to enable the SESES functionality only without lvi-cfi is now -x86-seses-enable-without-lvi-cfi to warn users part of the mitigation is not enabled if they use this flag. This is useful in case folks want to see the cost of SESES separate from the LVI-CFI. Reviewed By: sconstab Differential Revision: https://reviews.llvm.org/D79910
This commit is contained in:
parent
9451d2b35e
commit
19419c1abe
@ -455,6 +455,15 @@ def FeatureLVIControlFlowIntegrity
|
||||
"LFENCE instruction to serialize control flow. Also decompose RET "
|
||||
"instructions into a POP+LFENCE+JMP sequence.">;
|
||||
|
||||
// Enable SESES to mitigate speculative execution attacks
|
||||
def FeatureSpeculativeExecutionSideEffectSuppression
|
||||
: SubtargetFeature<
|
||||
"seses", "UseSpeculativeExecutionSideEffectSuppression", "true",
|
||||
"Prevent speculative execution side channel timing attacks by "
|
||||
"inserting a speculation barrier before memory reads, memory writes, "
|
||||
"and conditional branches. Implies LVI Control Flow integrity.",
|
||||
[FeatureLVIControlFlowIntegrity]>;
|
||||
|
||||
// Mitigate LVI attacks against data loads
|
||||
def FeatureLVILoadHardening
|
||||
: SubtargetFeature<
|
||||
|
@ -30,7 +30,7 @@ using namespace llvm;
|
||||
STATISTIC(NumLFENCEsInserted, "Number of lfence instructions inserted");
|
||||
|
||||
static cl::opt<bool> EnableSpeculativeExecutionSideEffectSuppression(
|
||||
"x86-seses-enable",
|
||||
"x86-seses-enable-without-lvi-cfi",
|
||||
cl::desc("Force enable speculative execution side effect suppression. "
|
||||
"(Note: User must pass -mlvi-cfi in order to mitigate indirect "
|
||||
"branches and returns.)"),
|
||||
@ -91,10 +91,12 @@ bool X86SpeculativeExecutionSideEffectSuppression::runOnMachineFunction(
|
||||
const auto &OptLevel = MF.getTarget().getOptLevel();
|
||||
const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>();
|
||||
|
||||
// Check whether SESES needs to run as the fallback for LVI at O0 or if the
|
||||
// user explicitly passed the SESES flag.
|
||||
// Check whether SESES needs to run as the fallback for LVI at O0, whether the
|
||||
// user explicitly passed an SESES flag, or whether the SESES target feature
|
||||
// was set.
|
||||
if (!EnableSpeculativeExecutionSideEffectSuppression &&
|
||||
!(Subtarget.useLVILoadHardening() && OptLevel == CodeGenOpt::None))
|
||||
!(Subtarget.useLVILoadHardening() && OptLevel == CodeGenOpt::None) &&
|
||||
!Subtarget.useSpeculativeExecutionSideEffectSuppression())
|
||||
return false;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "********** " << getPassName() << " : " << MF.getName()
|
||||
|
@ -442,6 +442,9 @@ protected:
|
||||
/// POP+LFENCE+JMP sequence.
|
||||
bool UseLVIControlFlowIntegrity = false;
|
||||
|
||||
/// Enable Speculative Execution Side Effect Suppression
|
||||
bool UseSpeculativeExecutionSideEffectSuppression = false;
|
||||
|
||||
/// Insert LFENCE instructions to prevent data speculatively injected into
|
||||
/// loads from being used maliciously.
|
||||
bool UseLVILoadHardening = false;
|
||||
@ -759,6 +762,9 @@ public:
|
||||
bool useGLMDivSqrtCosts() const { return UseGLMDivSqrtCosts; }
|
||||
bool useLVIControlFlowIntegrity() const { return UseLVIControlFlowIntegrity; }
|
||||
bool useLVILoadHardening() const { return UseLVILoadHardening; }
|
||||
bool useSpeculativeExecutionSideEffectSuppression() const {
|
||||
return UseSpeculativeExecutionSideEffectSuppression;
|
||||
}
|
||||
|
||||
unsigned getPreferVectorWidth() const { return PreferVectorWidth; }
|
||||
unsigned getRequiredVectorWidth() const { return RequiredVectorWidth; }
|
||||
|
@ -1,8 +1,8 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable -x86-seses-one-lfence-per-bb %s -o - | FileCheck %s --check-prefix=X86-ONE-LFENCE
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable -x86-seses-omit-branch-lfences %s -o - | FileCheck %s --check-prefix=X86-OMIT-BR
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable -x86-seses-only-lfence-non-const %s -o - | FileCheck %s --check-prefix=X86-NON-CONST
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable-without-lvi-cfi %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable-without-lvi-cfi -x86-seses-one-lfence-per-bb %s -o - | FileCheck %s --check-prefix=X86-ONE-LFENCE
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable-without-lvi-cfi -x86-seses-omit-branch-lfences %s -o - | FileCheck %s --check-prefix=X86-OMIT-BR
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable-without-lvi-cfi -x86-seses-only-lfence-non-const %s -o - | FileCheck %s --check-prefix=X86-NON-CONST
|
||||
|
||||
define void @_Z4buzzv() {
|
||||
; CHECK-LABEL: _Z4buzzv:
|
||||
|
Loading…
x
Reference in New Issue
Block a user