diff --git a/README.md b/README.md index 1aea44f1..4d633045 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,11 @@ Occlum LibOS has several *explicit* and *implicit* dependencies: the former ones Explicit dependencies are listed below: - 1. [Occlum's fork of Intel SGX SDK](https://github.com/occlum/linux-sgx/tree/for_occlum). See [README.md](https://github.com/occlum/linux-sgx/blob/for_occlum/README.md) for how to compile and install. + 1. [enable_rdfsbase kernel module](https://github.com/occlum/enable_rdfsbase), which enables rdfsbase instruction and its friends. See [README.md](https://github.com/occlum/enable_rdfsbase/blob/master/README.md) for how to compile and install. + 1. [Occlum's fork of Intel SGX SDK](https://github.com/occlum/linux-sgx/tree/sgx_2.4_for_occlum). See [README.md](https://github.com/occlum/linux-sgx/blob/sgx_2.4_for_occlum/README.md) for how to compile and install. 1. [Occlum's fork of LLVM toolchain](https://github.com/occlum/llvm/tree/for_occlum). See [README.occlum.md](https://github.com/occlum/llvm/blob/for_occlum/README.occlum.md) for how to compile and install. 1. [Occlum's fork of musl libc](https://github.com/occlum/musl/tree/for_occlum). See [INSTALL](https://github.com/occlum/musl/blob/for_occlum/INSTALL) for how to compile and install. - 1. [enable_rdfsbase kernel module](https://github.com/occlum/enable_rdfsbase), which enables rdfsbase instruction and its friends. See [README.md](https://github.com/occlum/enable_rdfsbase/blob/master/README.md) for how to compile and install. - 1. [Rust programming language](https://www.rust-lang.org/). We have tested with Rust nightly-2018-10-01. Other versions of Rust may or may not work. + 1. [Rust programming language](https://www.rust-lang.org/). We have tested with Rust nightly-2019-01-28. Other versions of Rust may or may not work. Implicit dependencies are managed by Git with [.gitmodules](https://github.com/occlum/libos/blob/master/.gitmodules) and compiled with Makefile. The most important implicit dependency is [Rust SGX SDK](https://github.com/baidu/rust-sgx-sdk). After downloading Occlum LibOS project, run the following command to set up the implicit dependecies: diff --git a/deps/rust-sgx-sdk b/deps/rust-sgx-sdk index 4d999470..a824416a 160000 --- a/deps/rust-sgx-sdk +++ b/deps/rust-sgx-sdk @@ -1 +1 @@ -Subproject commit 4d999470c8c12a6e6f70d302c09114957114bb05 +Subproject commit a824416aba3840a2d76753b6da94130526b60893 diff --git a/deps/sgx_protect_file b/deps/sgx_protect_file index 3c9a9f06..5f2e64ef 160000 --- a/deps/sgx_protect_file +++ b/deps/sgx_protect_file @@ -1 +1 @@ -Subproject commit 3c9a9f063dacf5ef98971e64338d315e107a9083 +Subproject commit 5f2e64efd27714e90b4a22f4a3ce46ef6598d32a diff --git a/src/libos/Cargo.lock b/src/libos/Cargo.lock index 774cb1b4..311da8b6 100644 --- a/src/libos/Cargo.lock +++ b/src/libos/Cargo.lock @@ -1,11 +1,13 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "Occlum" version = "0.0.1" dependencies = [ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sgx_trts 1.0.4", - "sgx_tstd 1.0.4", - "sgx_types 1.0.4", + "sgx_trts 1.0.6", + "sgx_tstd 1.0.6", + "sgx_types 1.0.6", "xmas-elf 0.6.2", ] @@ -20,9 +22,9 @@ dependencies = [ [[package]] name = "sgx_alloc" -version = "1.0.4" +version = "1.0.6" dependencies = [ - "sgx_trts 1.0.4", + "sgx_trts 1.0.6", ] [[package]] @@ -30,41 +32,50 @@ name = "sgx_build_helper" version = "0.1.0" [[package]] -name = "sgx_tprotected_fs" -version = "1.0.4" +name = "sgx_libc" +version = "1.0.6" dependencies = [ - "sgx_trts 1.0.4", - "sgx_types 1.0.4", + "sgx_types 1.0.6", +] + +[[package]] +name = "sgx_tprotected_fs" +version = "1.0.6" +dependencies = [ + "sgx_trts 1.0.6", + "sgx_types 1.0.6", ] [[package]] name = "sgx_trts" -version = "1.0.4" +version = "1.0.6" dependencies = [ - "sgx_types 1.0.4", + "sgx_libc 1.0.6", + "sgx_types 1.0.6", ] [[package]] name = "sgx_tstd" -version = "1.0.4" +version = "1.0.6" dependencies = [ - "sgx_alloc 1.0.4", + "sgx_alloc 1.0.6", "sgx_build_helper 0.1.0", - "sgx_tprotected_fs 1.0.4", - "sgx_trts 1.0.4", - "sgx_types 1.0.4", + "sgx_libc 1.0.6", + "sgx_tprotected_fs 1.0.6", + "sgx_trts 1.0.6", + "sgx_types 1.0.6", "sgx_unwind 0.0.1", ] [[package]] name = "sgx_types" -version = "1.0.4" +version = "1.0.6" [[package]] name = "sgx_unwind" version = "0.0.1" dependencies = [ - "sgx_trts 1.0.4", + "sgx_trts 1.0.6", ] [[package]] diff --git a/src/libos/Makefile b/src/libos/Makefile index 0abbf47b..3192a4a1 100644 --- a/src/libos/Makefile +++ b/src/libos/Makefile @@ -17,7 +17,7 @@ ENCLAVE_CONFIG := Enclave_config.xml ENCLAVE_KEY := Enclave_private.pem C_FLAGS := $(SGX_CFLAGS_T) -fno-stack-protector -I./include/ -_Other_Link_Flags := -L../../deps/rust-sgx-sdk/compiler-rt/ -L. +_Other_Link_Flags := -L$(RUST_SGX_SDK_DIR)/compiler-rt/ -L. _Other_Enclave_Libs := -lcompiler-rt-patch -locclum_rs -lsgx_tprotected_fs LINK_FLAGS := $(SGX_LFLAGS_T) @@ -42,11 +42,11 @@ $(S_OBJS): %.o: %.S @echo "CC <= $@" $(EDL_C_SRCS): $(SGX_EDGER8R) ../Enclave.edl - @cd src/ && $(SGX_EDGER8R) --trusted ../../Enclave.edl --search-path $(SGX_SDK)/include --search-path ../../../deps/rust-sgx-sdk/edl/ + @cd src/ && $(SGX_EDGER8R) --trusted ../../Enclave.edl --search-path $(SGX_SDK)/include --search-path $(RUST_SGX_SDK_DIR)/edl/ @echo "GEN <= $(EDL_C_SRCS)" compiler-rt: - @$(MAKE) --no-print-directory -C ../../deps/rust-sgx-sdk/compiler-rt/ > /dev/null + @$(MAKE) --no-print-directory -C $(RUST_SGX_SDK_DIR)/compiler-rt/ > /dev/null ifeq ($(DEBUG), 1) $(LIBOS_A): $(RUST_SRCS) diff --git a/src/libos/src/lib.rs b/src/libos/src/lib.rs index cdc849b7..cfcc7770 100644 --- a/src/libos/src/lib.rs +++ b/src/libos/src/lib.rs @@ -3,10 +3,12 @@ #![crate_type = "staticlib"] #![cfg_attr(not(target_env = "sgx"), no_std)] #![cfg_attr(target_env = "sgx", feature(rustc_private))] +#![feature(alloc)] #![feature(allocator_api)] -#![feature(integer_atomics)] #![feature(range_contains)] +#[macro_use] +extern crate alloc; extern crate sgx_types; #[cfg(not(target_env = "sgx"))] #[macro_use] diff --git a/src/libos/src/process/task.rs b/src/libos/src/process/task.rs index 5619e881..805939bc 100644 --- a/src/libos/src/process/task.rs +++ b/src/libos/src/process/task.rs @@ -14,12 +14,12 @@ pub struct Task { } lazy_static! { - static ref new_process_queue: SgxMutex> = + static ref NEW_PROCESS_QUEUE: SgxMutex> = { SgxMutex::new(VecDeque::new()) }; } pub fn enqueue_task(new_process: ProcessRef) { - new_process_queue.lock().unwrap().push_back(new_process); + NEW_PROCESS_QUEUE.lock().unwrap().push_back(new_process); let mut ret = 0; let ocall_status = unsafe { ocall_run_new_task(&mut ret) }; @@ -29,7 +29,7 @@ pub fn enqueue_task(new_process: ProcessRef) { } fn dequeue_task() -> Option { - new_process_queue.lock().unwrap().pop_front() + NEW_PROCESS_QUEUE.lock().unwrap().pop_front() } pub fn run_task() -> Result { diff --git a/src/libos/src/util/ring_buf.rs b/src/libos/src/util/ring_buf.rs index 92876901..92d07ed1 100644 --- a/src/libos/src/util/ring_buf.rs +++ b/src/libos/src/util/ring_buf.rs @@ -3,6 +3,7 @@ use std::cmp::{max, min}; use std::ptr; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; +use alloc::alloc::{Layout, alloc, dealloc}; #[derive(Debug)] pub struct RingBuf { @@ -43,15 +44,17 @@ struct RingBufInner { closed: AtomicBool, // if reader has been dropped } +const RING_BUF_ALIGN : usize = 16; + impl RingBufInner { fn new(capacity: usize) -> RingBufInner { - let capacity = max(capacity, 16).next_power_of_two(); + let capacity = max(capacity, RING_BUF_ALIGN).next_power_of_two(); RingBufInner { buf: unsafe { - let mut buf_ptr = ptr::null_mut(); - libc::posix_memalign(&mut buf_ptr, 16, capacity); + let buf_layout = Layout::from_size_align_unchecked(capacity, RING_BUF_ALIGN); + let buf_ptr = alloc(buf_layout); assert!(buf_ptr != ptr::null_mut()); - buf_ptr as *mut u8 + buf_ptr }, capacity: capacity, head: AtomicUsize::new(0), @@ -109,7 +112,10 @@ impl RingBufInner { impl Drop for RingBufInner { fn drop(&mut self) { - unsafe { libc::free(self.buf as *mut c_void) } + unsafe { + let buf_layout = Layout::from_size_align_unchecked(self.capacity, RING_BUF_ALIGN); + dealloc(self.buf, buf_layout); + } } } diff --git a/src/pal/Makefile b/src/pal/Makefile index 0eb29021..0f33f8f4 100644 --- a/src/pal/Makefile +++ b/src/pal/Makefile @@ -8,7 +8,7 @@ Bin := pal C_Flags := $(SGX_CFLAGS_U) Link_Flags := $(SGX_LFLAGS_U) -Link_Flags += -L../../deps/rust-sgx-sdk/sgx_ustdc/ -lsgx_ustdc -lsgx_uprotected_fs +Link_Flags += -L$(RUST_SGX_SDK_DIR)/sgx_ustdc/ -lsgx_ustdc -lsgx_uprotected_fs .PHONY: all @@ -19,7 +19,7 @@ $(Bin): $(EDL_Gen_Files) $(Objs) sgx_ustdc @echo "LINK => $@" $(EDL_Gen_Files): $(SGX_EDGER8R) ../Enclave.edl - @$(SGX_EDGER8R) --untrusted ../Enclave.edl --search-path $(SGX_SDK)/include --search-path ../../deps/rust-sgx-sdk/edl/ + @$(SGX_EDGER8R) --untrusted ../Enclave.edl --search-path $(SGX_SDK)/include --search-path $(RUST_SGX_SDK_DIR)/edl/ @echo "GEN => $(EDL_Gen_Files)" $(Objs): %.o: %.c @@ -31,7 +31,7 @@ $(Objs): %.o: %.c # .PHONY: sgx_ustdc sgx_ustdc: - @$(MAKE) --no-print-directory -C ../../deps/rust-sgx-sdk/sgx_ustdc/ > /dev/null + @$(MAKE) --no-print-directory -C $(RUST_SGX_SDK_DIR)/sgx_ustdc/ > /dev/null .PHONY: clean clean: diff --git a/src/sgxenv.mk b/src/sgxenv.mk index 4bd5981d..f03cf685 100644 --- a/src/sgxenv.mk +++ b/src/sgxenv.mk @@ -1,3 +1,8 @@ +MAIN_MAKEFILE := $(firstword $(MAKEFILE_LIST)) +INCLUDE_MAKEFILE := $(lastword $(MAKEFILE_LIST)) +CUR_DIR := $(shell dirname $(realpath $(MAIN_MAKEFILE))) +PROJECT_DIR := $(realpath $(CUR_DIR)/../../) + SGX_SDK ?= /opt/intel/sgxsdk SGX_MODE ?= HW SGX_ARCH ?= x64 @@ -32,6 +37,9 @@ else SGX_COMMON_CFLAGS += -O2 endif +RUST_SGX_SDK_DIR := $(PROJECT_DIR)/deps/rust-sgx-sdk +SGX_COMMON_CFLAGS += -I$(RUST_SGX_SDK_DIR)/common/ -I$(RUST_SGX_SDK_DIR)/edl/ + ifneq ($(SGX_MODE), HW) Urts_Library_Name := sgx_urts_sim else