diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs index ee2c8c8cf90947d58c961f79d5b19589b6c712fe..45060f54da086c02dfba44925dbf153760048ac9 100644 --- a/src/platform/redox/clone.rs +++ b/src/platform/redox/clone.rs @@ -81,7 +81,7 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> { let cur_addr_space_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"addrspace")?); let new_addr_space_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-addrspace")?); - let buf = create_set_addr_space_buf(*cur_addr_space_fd, pte_clone_ret as usize, stack as usize); + let buf = create_set_addr_space_buf(*cur_addr_space_fd, __relibc_internal_pte_clone_ret as usize, stack as usize); let _ = syscall::write(*new_addr_space_sel_fd, &buf)?; } @@ -106,6 +106,7 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> { // Unblock context. syscall::kill(new_pid, SIGCONT)?; + let _ = syscall::waitpid(new_pid, &mut 0, syscall::WUNTRACED | syscall::WCONTINUED); Ok(0) } @@ -114,7 +115,7 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> { /// descriptors are reobtained through `fmap`. Other mappings are kept but duplicated using CoW. pub fn fork_impl() -> Result<usize> { unsafe { - Error::demux(fork_wrapper()) + Error::demux(__relibc_internal_fork_wrapper()) } } @@ -209,7 +210,7 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { } let new_addr_space_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-addrspace")?); - let buf = create_set_addr_space_buf(*new_addr_space_fd, fork_ret as usize, initial_rsp as usize); + let buf = create_set_addr_space_buf(*new_addr_space_fd, __relibc_internal_fork_ret as usize, initial_rsp as usize); let _ = syscall::write(*new_addr_space_sel_fd, &buf)?; } copy_env_regs(*cur_pid_fd, *new_pid_fd)?; @@ -249,9 +250,9 @@ unsafe extern "sysv64" fn __relibc_internal_fork_hook(cur_filetable_fd: usize, n #[no_mangle] core::arch::global_asm!(" .p2align 6 - .globl fork_wrapper - .type fork_wrapper, @function -fork_wrapper: + .globl __relibc_internal_fork_wrapper + .type __relibc_internal_fork_wrapper, @function +__relibc_internal_fork_wrapper: push rbp mov rbp, rsp @@ -271,7 +272,11 @@ fork_wrapper: call __relibc_internal_fork_impl jmp 2f -fork_ret: + .size __relibc_internal_fork_wrapper, . - __relibc_internal_fork_wrapper + + .p2align 6 + .type __relibc_internal_fork_ret, @function +__relibc_internal_fork_ret: mov rdi, [rsp] mov rsi, [rsp + 8] call __relibc_internal_fork_hook @@ -280,6 +285,8 @@ fork_ret: fldcw [rsp+24] xor rax, rax + + .p2align 4 2: add rsp, 32 pop r15 @@ -291,11 +298,13 @@ fork_ret: pop rbp ret - .size fork_wrapper, . - fork_wrapper - .globl pte_clone_ret - .type pte_clone_ret, @function -pte_clone_ret: + .size __relibc_internal_fork_ret, . - __relibc_internal_fork_ret + + .globl __relibc_internal_pte_clone_ret + .type __relibc_internal_pte_clone_ret, @function + .p2align 6 +__relibc_internal_pte_clone_ret: # Load registers pop rax pop rdi @@ -318,11 +327,11 @@ pte_clone_ret: call rax ret - .size pte_clone_ret, . - pte_clone_ret + .size __relibc_internal_pte_clone_ret, . - __relibc_internal_pte_clone_ret "); extern "sysv64" { - fn fork_wrapper() -> usize; - fn fork_ret(); - fn pte_clone_ret(); + fn __relibc_internal_fork_wrapper() -> usize; + fn __relibc_internal_fork_ret(); + fn __relibc_internal_pte_clone_ret(); }