diff --git a/src/libos/Enclave_config.xml b/src/libos/Enclave_config.xml index f18079c4..054bf805 100644 --- a/src/libos/Enclave_config.xml +++ b/src/libos/Enclave_config.xml @@ -3,7 +3,7 @@ 0 0 0x80000 - 0x1000000 + 0x6000000 8 1 0 diff --git a/src/libos/src/process.rs b/src/libos/src/process.rs index 8a98039e..36d895a4 100644 --- a/src/libos/src/process.rs +++ b/src/libos/src/process.rs @@ -152,7 +152,7 @@ pub fn run_task() -> Result<(), &'static str> { let process : &Process = &guard; pid = process.pid; //println!("Run process: {:#x?}", process); - println!("Run process (pid = {})", process.pid); + //println!("Run process (pid = {})", process.pid); new_task = &process.task as *const Task }; @@ -221,7 +221,7 @@ impl Process { self.code_vma = Vma::from_program_header(&code_ph)?; self.data_vma = Vma::from_program_header(&data_ph)?; - self.stack_vma = Vma::new(8 * 1024, 4096, + self.stack_vma = Vma::new(32 * 1024 * 1024, 4096, vma::Perms(vma::PERM_R | vma::PERM_W))?; self.program_base_addr = self.alloc_mem_for_vmas(elf_file)?; diff --git a/src/libos/src/vma.rs b/src/libos/src/vma.rs index 684c0c86..74b87474 100644 --- a/src/libos/src/vma.rs +++ b/src/libos/src/vma.rs @@ -90,8 +90,8 @@ pub fn malloc_batch(vma_list: &mut [&mut Vma], mapped_data: &[u8]) let mut max_align = VMA_MIN_MEM_ALIGN; let mut total_size = 0; for vma in vma_list.into_iter() { - let mem_begin = round_up(total_size, vma.mem_align); - let mem_end = mem_begin + round_up(vma.mem_size, vma.mem_align); + let mem_begin = align_up(total_size, vma.mem_align); + let mem_end = mem_begin + align_up(vma.mem_size, vma.mem_align); if vma.file_is_mapped { if vma.mem_addr < mem_begin || @@ -114,8 +114,8 @@ pub fn malloc_batch(vma_list: &mut [&mut Vma], mapped_data: &[u8]) let program_base_addr = memobj.get_addr(); let mut mem_cur = program_base_addr; for vma in vma_list.into_iter() { - vma.mem_begin = round_up(mem_cur, vma.mem_align); - vma.mem_end = vma.mem_begin + round_up(vma.mem_size, vma.mem_align); + vma.mem_begin = align_up(mem_cur, vma.mem_align); + vma.mem_end = vma.mem_begin + align_up(vma.mem_size, vma.mem_align); vma.mem_addr += program_base_addr; vma.underlying = memobj.clone(); @@ -137,13 +137,19 @@ pub fn mprotect_batch(vma_list: &[&Vma]) -> Result<(), &'static str> { for vma in vma_list.into_iter() { - let start = vma.mem_begin as size_t; - let size = (vma.mem_end - vma.mem_begin) as size_t; + // If don't need to change memory permissions + if vma.mem_flags == Perms(PERM_R | PERM_W) { + continue; + } + + let start = align_down(vma.mem_addr, 4096); + let size = align_up(vma.mem_size, 4096); let perms = vma.mem_flags.0 as uint64_t; let status = unsafe { //TODO: use proper permissions //TODO: reset the permissions when drop VMA //trts_mprotect(start, size, perms) + //println!("trts_mprotect: start = {}, size = {}", start, size); trts_mprotect(start, size, (PERM_R | PERM_W | PERM_X) as uint64_t) }; if (status != sgx_status_t::SGX_SUCCESS) { @@ -185,10 +191,14 @@ impl<'a> From<&'a program::Flags> for Perms { } } -fn round_up(addr: usize, align: usize) -> usize { +fn align_up(addr: usize, align: usize) -> usize { (addr + (align - 1)) / align * align } +fn align_down(addr: usize, align: usize) -> usize { + addr & !(align - 1) +} + #[link(name = "sgx_trts")] extern { pub fn trts_mprotect(start: size_t, size: size_t, perms: uint64_t) -> sgx_status_t; diff --git a/test/hello_world_raw/main.c b/test/hello_world_raw/main.c index 127d511c..1ad27131 100644 --- a/test/hello_world_raw/main.c +++ b/test/hello_world_raw/main.c @@ -4,6 +4,6 @@ char str_buf[] = "Hello World!\n"; unsigned long str_size = sizeof(str_buf); void _start(void) { - __rusgx_write(1, str_buf, str_size); + //__rusgx_write(1, str_buf, str_size); __rusgx_exit(0); } diff --git a/test/spawn_and_wait4_raw/main.c b/test/spawn_and_wait4_raw/main.c index 92ff5417..793730fa 100644 --- a/test/spawn_and_wait4_raw/main.c +++ b/test/spawn_and_wait4_raw/main.c @@ -7,7 +7,7 @@ static void print_ok(void) { __rusgx_write(1, success_str_buf, success_str_size); } -#define NUM_CHILDREN 100 +#define NUM_CHILDREN 10 void _start(void) { for (int ci = 0; ci < NUM_CHILDREN; ci++) { @@ -16,7 +16,6 @@ void _start(void) { ret = __rusgx_spawn(&pid, "hello_world_raw/bin.encrypted", NULL, NULL); if (ret < 0) { __rusgx_exit(0); } - print_ok(); int status; ret = __rusgx_wait4(pid, &status, 0);