diff --git a/src/libos/Enclave_config.xml b/src/libos/Enclave_config.xml index 054bf805..f18079c4 100644 --- a/src/libos/Enclave_config.xml +++ b/src/libos/Enclave_config.xml @@ -3,7 +3,7 @@ 0 0 0x80000 - 0x6000000 + 0x1000000 8 1 0 diff --git a/src/libos/src/process/spawn/init_vm.rs b/src/libos/src/process/spawn/init_vm.rs index 10384d47..2e61d972 100644 --- a/src/libos/src/process/spawn/init_vm.rs +++ b/src/libos/src/process/spawn/init_vm.rs @@ -41,9 +41,6 @@ pub fn do_init(elf_file: &ElfFile, elf_buf: &[u8]) -> Result { reloc_symbols(process_base_addr, elf_file)?; link_syscalls(process_base_addr, elf_file)?; - // Make code executable - code_seg.mprotect(PERM_R | PERM_W | PERM_X); - Ok(process_vm) } diff --git a/src/libos/src/process/spawn/segment.rs b/src/libos/src/process/spawn/segment.rs index 8ceabe15..f82866bd 100644 --- a/src/libos/src/process/spawn/segment.rs +++ b/src/libos/src/process/spawn/segment.rs @@ -77,10 +77,13 @@ impl Segment { } pub fn mprotect(&mut self, perm: u32) { + panic!("Not implemented yet!"); + /* unsafe { trts_mprotect(self.start_addr, self.end_addr - self.start_addr, perm as u64); } + */ } } @@ -98,5 +101,10 @@ pub fn get_data_segment(elf_file: &ElfFile) -> Result { #[link(name = "sgx_trts")] extern { + // XXX: trts_mprotect is a private SGX function that is not supposed to be + // used by external users. At least, this is the case for SGX v2.2. To use + // this function, we need to modify Intel SGX SDK slightly. I suppose + // this functionality will be exposed to external users as an SGX API in + // the future. pub fn trts_mprotect(start: size_t, size: size_t, perms: uint64_t) -> sgx_status_t; } diff --git a/src/libos/src/vm/process_vm.rs b/src/libos/src/vm/process_vm.rs index 34aa8b8c..8e7bf7ce 100644 --- a/src/libos/src/vm/process_vm.rs +++ b/src/libos/src/vm/process_vm.rs @@ -1,17 +1,14 @@ use super::*; -const DATA_SPACE_SIZE : usize = 12 * 1024 * 1024; // 16MB - lazy_static! { static ref DATA_SPACE: SgxMutex = { - let size = DATA_SPACE_SIZE; - let addr = { - let ptr = unsafe { aligned_malloc(size, PAGE_SIZE) }; - if ptr == (0 as *mut c_void) { - panic!("Out of memory"); - }; - ptr as usize + let (addr, size) = { + let mut addr : usize = 0; + let mut size : usize = 0; + unsafe { vm_get_prealloced_data_space(&mut addr, &mut size) }; + (addr, size) }; + println!("addr = {:X?}, size = {}", addr, size); let vm_space = unsafe { match VMSpace::new(addr, size, VMGuardAreaType::None) { Ok(vm_space) => vm_space, @@ -22,14 +19,8 @@ lazy_static! { }; } -unsafe fn aligned_malloc(mem_size: usize, mem_align: usize) -> *mut c_void { - let mut mem_ptr = ::core::ptr::null_mut(); - let ret = libc::posix_memalign(&mut mem_ptr, mem_align, mem_size); - if ret == 0 { - mem_ptr - } else { - 0 as *mut c_void - } +extern { + pub fn vm_get_prealloced_data_space(addr: &mut usize, size: &mut usize); } #[derive(Debug)] diff --git a/src/libos/src/vm/vm_space_prealloced.c b/src/libos/src/vm/vm_space_prealloced.c new file mode 100644 index 00000000..1aefde86 --- /dev/null +++ b/src/libos/src/vm/vm_space_prealloced.c @@ -0,0 +1,13 @@ +#include + +#define DATA_SPACE_SIZE (16*1024*1024) + +static char __prealloced_data_space[DATA_SPACE_SIZE] + __attribute__ (( + section(".exectuable_data,\"awx\",@nobits#"), + aligned(4096))) = {0}; + +void vm_get_prealloced_data_space(void** paddr, size_t* psize) { + *paddr = __prealloced_data_space; + *psize = DATA_SPACE_SIZE; +}