• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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