summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/lvi-hardening-ret.ll
diff options
context:
space:
mode:
authorScott Constable <scott.d.constable@intel.com>2020-04-03 10:58:38 -0700
committerTom Stellard <tstellar@redhat.com>2020-06-24 09:31:04 -0700
commit6a4589599d74cae8c4ac7b0ff7ae14aeeb2f988b (patch)
treeaf0c7ad23b9a891eee478e9bb7fede130259fe75 /llvm/test/CodeGen/X86/lvi-hardening-ret.ll
parent071acfdd4694bb2b94efe6122128c5e7f840ce46 (diff)
downloadbcm5719-llvm-6a4589599d74cae8c4ac7b0ff7ae14aeeb2f988b.tar.gz
bcm5719-llvm-6a4589599d74cae8c4ac7b0ff7ae14aeeb2f988b.zip
[X86] Add RET-hardening Support to mitigate Load Value Injection (LVI)
Adding a pass that replaces every ret instruction with the sequence: pop <scratch-reg> lfence jmp *<scratch-reg> where <scratch-reg> is some available scratch register, according to the calling convention of the function being mitigated. Differential Revision: https://reviews.llvm.org/D75935
Diffstat (limited to 'llvm/test/CodeGen/X86/lvi-hardening-ret.ll')
-rw-r--r--llvm/test/CodeGen/X86/lvi-hardening-ret.ll72
1 files changed, 72 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/lvi-hardening-ret.ll b/llvm/test/CodeGen/X86/lvi-hardening-ret.ll
new file mode 100644
index 00000000000..9f2b028b303
--- /dev/null
+++ b/llvm/test/CodeGen/X86/lvi-hardening-ret.ll
@@ -0,0 +1,72 @@
+; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown < %s | FileCheck %s
+
+define dso_local void @one_instruction() #0 {
+; CHECK-LABEL: one_instruction:
+entry:
+ ret void
+; CHECK-NOT: retq
+; CHECK: popq %[[x:[^ ]*]]
+; CHECK-NEXT: lfence
+; CHECK-NEXT: jmpq *%[[x]]
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @ordinary_function(i32 %x, i32 %y) #0 {
+; CHECK-LABEL: ordinary_function:
+entry:
+ %x.addr = alloca i32, align 4
+ %y.addr = alloca i32, align 4
+ store i32 %x, i32* %x.addr, align 4
+ store i32 %y, i32* %y.addr, align 4
+ %0 = load i32, i32* %x.addr, align 4
+ %1 = load i32, i32* %y.addr, align 4
+ %add = add nsw i32 %0, %1
+ ret i32 %add
+; CHECK-NOT: retq
+; CHECK: popq %[[x:[^ ]*]]
+; CHECK-NEXT: lfence
+; CHECK-NEXT: jmpq *%[[x]]
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @no_caller_saved_registers_function(i32 %x, i32 %y) #1 {
+; CHECK-LABEL: no_caller_saved_registers_function:
+entry:
+ %x.addr = alloca i32, align 4
+ %y.addr = alloca i32, align 4
+ store i32 %x, i32* %x.addr, align 4
+ store i32 %y, i32* %y.addr, align 4
+ %0 = load i32, i32* %x.addr, align 4
+ %1 = load i32, i32* %y.addr, align 4
+ %add = add nsw i32 %0, %1
+ ret i32 %add
+; CHECK-NOT: retq
+; CHECK: shlq $0, (%{{[^ ]*}})
+; CHECK-NEXT: lfence
+; CHECK-NEXT: retq
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local preserve_mostcc void @preserve_most() #0 {
+; CHECK-LABEL: preserve_most:
+entry:
+ ret void
+; CHECK-NOT: retq
+; CHECK: popq %r11
+; CHECK-NEXT: lfence
+; CHECK-NEXT: jmpq *%r11
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local preserve_allcc void @preserve_all() #0 {
+; CHECK-LABEL: preserve_all:
+entry:
+ ret void
+; CHECK-NOT: retq
+; CHECK: popq %r11
+; CHECK-NEXT: lfence
+; CHECK-NEXT: jmpq *%r11
+}
+
+attributes #0 = { "target-features"="+lvi-cfi" }
+attributes #1 = { "no_caller_saved_registers" "target-features"="+lvi-cfi" }
OpenPOWER on IntegriCloud