| // Test LVI load hardening on SGX inline assembly code |
| |
| // assembly-output: emit-asm |
| // compile-flags: --crate-type staticlib |
| // only-x86_64-fortanix-unknown-sgx |
| |
| #![feature(asm)] |
| |
| #[no_mangle] |
| pub extern fn get(ptr: *const u64) -> u64 { |
| let value : u64; |
| unsafe { |
| asm!(".start_inline_asm:", |
| "mov {}, [{}]", |
| ".end_inline_asm:", |
| out(reg) value, |
| in(reg) ptr); |
| } |
| value |
| } |
| |
| // CHECK: get |
| // CHECK: .start_inline_asm |
| // CHECK-NEXT: movq |
| // CHECK-NEXT: lfence |
| // CHECK-NEXT: .end_inline_asm |
| |
| #[no_mangle] |
| pub extern fn myret() { |
| unsafe { |
| asm!(".start_myret_inline_asm: |
| ret |
| .end_myret_inline_asm:"); |
| } |
| } |
| |
| // CHECK: myret |
| // CHECK: .start_myret_inline_asm |
| // CHECK-NEXT: shlq $0, (%rsp) |
| // CHECK-NEXT: lfence |
| // CHECK-NEXT: retq |