From b66fef047978dd04b26df60d34e710f8bee78029 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Mon, 15 Apr 2019 20:47:27 -0600 Subject: [PATCH] Copy TCB if it was not initialized using kernel-allocated TLS --- src/syscall/process.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/syscall/process.rs b/src/syscall/process.rs index e09df7fa..0772e974 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -516,7 +516,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { // Set up TCB let tcb_addr = ::USER_TCB_OFFSET + context.id.into() * PAGE_SIZE; - let mut tcb_mem = context::memory::Memory::new( + let mut tcb = context::memory::Memory::new( VirtualAddress::new(tcb_addr), PAGE_SIZE, EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, @@ -525,17 +525,22 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { // Setup user TLS if let Some(mut tls) = tls_option { + tls.mem.move_to(VirtualAddress::new(::USER_TLS_OFFSET), &mut new_table, &mut temporary_page); unsafe { - *(tcb_addr as *mut usize) = ::USER_TLS_OFFSET + tls.mem.size(); + *(tcb_addr as *mut usize) = tls.mem.start_address().get() + tls.mem.size(); } - - tls.mem.move_to(VirtualAddress::new(::USER_TLS_OFFSET), &mut new_table, &mut temporary_page); context.tls = Some(tls); + } else { + let parent_tcb_addr = ::USER_TCB_OFFSET + ppid.into() * PAGE_SIZE; + unsafe { + intrinsics::copy(parent_tcb_addr as *const u8, + tcb_addr as *mut u8, + tcb.size()); + } } - - tcb_mem.move_to(VirtualAddress::new(tcb_addr), &mut new_table, &mut temporary_page); - context.image.push(tcb_mem.to_shared()); + tcb.move_to(VirtualAddress::new(tcb_addr), &mut new_table, &mut temporary_page); + context.image.push(tcb.to_shared()); context.name = name; -- GitLab