about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRaoul Strackx <raoul.strackx@fortanix.com>2020-03-26 15:05:43 +0100
committerRaoul Strackx <raoul.strackx@fortanix.com>2020-09-25 15:02:15 +0200
commitbdf81f508d0b79751063b93f4d151ec6a90d2a09 (patch)
treebc9680919dbd89f92f56a17ca2a0275544a9a3b9
parent0526e750cd4e88fbb24ea92e809dfb6eefbf8fa0 (diff)
downloadrust-bdf81f508d0b79751063b93f4d151ec6a90d2a09.tar.gz
rust-bdf81f508d0b79751063b93f4d151ec6a90d2a09.zip
test hardening C inline assembly code (cc crate)
-rw-r--r--src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/cc_plus_one_c_asm.checks15
-rw-r--r--src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs2
-rw-r--r--src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c14
-rw-r--r--src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs2
-rw-r--r--src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/script.sh1
5 files changed, 33 insertions, 1 deletions
diff --git a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/cc_plus_one_c_asm.checks b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/cc_plus_one_c_asm.checks
new file mode 100644
index 00000000000..d1fae3d495f
--- /dev/null
+++ b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/cc_plus_one_c_asm.checks
@@ -0,0 +1,15 @@
+CHECK: cc_plus_one_c_asm
+CHECK:      lfence
+CHECK:      lfence
+CHECK:      lfence
+CHECK:      lfence
+CHECK:      lfence
+CHECK-NEXT: incl
+CHECK-NEXT: jmp
+CHECK-NEXT: shlq    $0, (%rsp)
+CHECK-NEXT: lfence
+CHECK-NEXT: retq
+CHECK:      popq
+CHECK-NEXT: popq [[REGISTER:%[a-z]+]]
+CHECK-NEXT: lfence
+CHECK-NEXT: jmpq *[[REGISTER]]
diff --git a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs
index 3ccb4100ceb..b0d0b42a30d 100644
--- a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs
+++ b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/build.rs
@@ -1,5 +1,5 @@
 fn main() {
     cc::Build::new()
         .file("foo.c")
-        .compile("foo");
+        .compile("foo_c");
 }
diff --git a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c
index bfe7757e4c1..971dfa9d171 100644
--- a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c
+++ b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/foo.c
@@ -2,3 +2,17 @@
 int cc_plus_one_c(int *arg) {
     return *arg + 1;
 }
+
+int cc_plus_one_c_asm(int *arg) {
+    int value = 0;
+
+    asm volatile ( "    movl (%1), %0\n"
+                   "    inc %0\n"
+                   "    jmp 1f\n"
+                   "    retq\n"  // never executed, but a shortcut to determine how the assembler deals with `ret` instructions
+                   "1:\n"
+                   : "=r"(value)
+                   : "r"(arg) );
+
+    return value;
+}
diff --git a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs
index 25adef5f917..f8a27255ed0 100644
--- a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs
+++ b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/enclave/src/main.rs
@@ -1,5 +1,6 @@
 extern {
     fn cc_plus_one_c(arg : &u32) -> u32;
+    fn cc_plus_one_c_asm(arg : &u32) -> u32;
 }
 
 fn main() {
@@ -7,5 +8,6 @@ fn main() {
     
     unsafe{
         println!("Answer to the Ultimate Question of Life, the Universe, and Everything: {}!", cc_plus_one_c(&value));
+        println!("Answer to the Ultimate Question of Life, the Universe, and Everything: {}!", cc_plus_one_c_asm(&value));
     }
 }
diff --git a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/script.sh b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/script.sh
index ae95dd9dac0..91f7ee45b54 100644
--- a/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/script.sh
+++ b/src/test/run-make/x86_64-fortanix-unknown-sgx-lvi/script.sh
@@ -39,3 +39,4 @@ build
 
 check "std::io::stdio::_print::h87f0c238421c45bc" print.checks
 check cc_plus_one_c cc_plus_one_c.checks
+check cc_plus_one_c_asm cc_plus_one_c_asm.checks