1#!/bin/sh 2set -exuo pipefail 3 4function build { 5 CRATE=enclave 6 7 mkdir -p $WORK_DIR 8 pushd $WORK_DIR 9 rm -rf $CRATE 10 cp -a $TEST_DIR/enclave . 11 pushd $CRATE 12 echo ${WORK_DIR} 13 # HACK(eddyb) sets `RUSTC_BOOTSTRAP=1` so Cargo can accept nightly features. 14 # These come from the top-level Rust workspace, that this crate is not a 15 # member of, but Cargo tries to load the workspace `Cargo.toml` anyway. 16 env RUSTC_BOOTSTRAP=1 17 cargo -v run --target $TARGET 18 popd 19 popd 20} 21 22function check { 23 local func_re="$1" 24 local checks="${TEST_DIR}/$2" 25 local asm=$(mktemp) 26 local objdump="${LLVM_BIN_DIR}/llvm-objdump" 27 local filecheck="${LLVM_BIN_DIR}/FileCheck" 28 local enclave=${WORK_DIR}/enclave/target/x86_64-fortanix-unknown-sgx/debug/enclave 29 30 func="$(${objdump} --syms --demangle ${enclave} | \ 31 grep --only-matching -E "[[:blank:]]+${func_re}\$" | \ 32 sed -e 's/^[[:space:]]*//' )" 33 ${objdump} --disassemble-symbols="${func}" --demangle \ 34 ${enclave} > ${asm} 35 ${filecheck} --input-file ${asm} ${checks} 36 37 if [ "${func_re}" != "rust_plus_one_global_asm" && 38 "${func_re}" != "cmake_plus_one_c_global_asm" ]; then 39 # The assembler cannot avoid explicit `ret` instructions. Sequences 40 # of `shlq $0x0, (%rsp); lfence; retq` are used instead. 41 # https://www.intel.com/content/www/us/en/developer/articles/technical/ 42 # software-security-guidance/technical-documentation/load-value-injection.html 43 ${filecheck} --implicit-check-not ret --input-file ${asm} ${checks} 44 fi 45} 46 47build 48 49check "unw_getcontext" unw_getcontext.checks 50check "__libunwind_Registers_x86_64_jumpto" jumpto.checks 51check 'std::io::stdio::_print::[[:alnum:]]+' print.checks 52check rust_plus_one_global_asm rust_plus_one_global_asm.checks 53 54check cc_plus_one_c cc_plus_one_c.checks 55check cc_plus_one_c_asm cc_plus_one_c_asm.checks 56check cc_plus_one_cxx cc_plus_one_cxx.checks 57check cc_plus_one_cxx_asm cc_plus_one_cxx_asm.checks 58check cc_plus_one_asm cc_plus_one_asm.checks 59 60check cmake_plus_one_c cmake_plus_one_c.checks 61check cmake_plus_one_c_asm cmake_plus_one_c_asm.checks 62check cmake_plus_one_c_global_asm cmake_plus_one_c_global_asm.checks 63check cmake_plus_one_cxx cmake_plus_one_cxx.checks 64check cmake_plus_one_cxx_asm cmake_plus_one_cxx_asm.checks 65check cmake_plus_one_cxx_global_asm cmake_plus_one_cxx_global_asm.checks 66check cmake_plus_one_asm cmake_plus_one_asm.checks 67