Skip to content
Snippets Groups Projects
Verified Commit 20284eb2 authored by Jacob Lorentzon's avatar Jacob Lorentzon :speech_balloon:
Browse files

Fix rlct_clone.

parent 42c24dd7
No related branches found
No related tags found
No related merge requests found
...@@ -106,7 +106,7 @@ asmfunction!(__relibc_internal_fork_ret: [" ...@@ -106,7 +106,7 @@ asmfunction!(__relibc_internal_fork_ret: ["
pop rbp pop rbp
ret ret
"] <= []); "] <= []);
asmfunction!(__relibc_internal_rlct_clone_ret -> usize: [" asmfunction!(__relibc_internal_rlct_clone_ret: ["
# Load registers # Load registers
pop rax pop rax
pop rdi pop rdi
......
...@@ -19,13 +19,13 @@ pub unsafe fn rlct_clone_impl(stack: *mut usize) -> Result<usize> { ...@@ -19,13 +19,13 @@ pub unsafe fn rlct_clone_impl(stack: *mut usize) -> Result<usize> {
let buf = create_set_addr_space_buf( let buf = create_set_addr_space_buf(
*cur_addr_space_fd, *cur_addr_space_fd,
__relibc_internal_rlct_clone_ret() as usize, __relibc_internal_rlct_clone_ret as usize,
stack as usize, stack as usize,
); );
let _ = syscall::write(*new_addr_space_sel_fd, &buf)?; let _ = syscall::write(*new_addr_space_sel_fd, &buf)?;
} }
// Inherit file table // Inherit reference to file table
{ {
let cur_filetable_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"filetable")?); let cur_filetable_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"filetable")?);
let new_filetable_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-filetable")?); let new_filetable_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-filetable")?);
...@@ -36,34 +36,10 @@ pub unsafe fn rlct_clone_impl(stack: *mut usize) -> Result<usize> { ...@@ -36,34 +36,10 @@ pub unsafe fn rlct_clone_impl(stack: *mut usize) -> Result<usize> {
)?; )?;
} }
// Inherit sigactions (on Linux, CLONE_THREAD requires CLONE_SIGHAND which implies the sigactions // Since the signal handler is not yet initialized, signals specifically targeting the thread
// table is reused). // (relibc is only required to implement thread-specific signals that already originate from
{ // the same process) will be discarded. Process-specific signals will ignore this new thread,
let cur_sigaction_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"sigactions")?); // until it has initialized its own signal handler.
let new_sigaction_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-sigactions")?);
let _ = syscall::write(
*new_sigaction_sel_fd,
&usize::to_ne_bytes(*cur_sigaction_fd),
)?;
}
// Inherit sighandler, but not the sigaltstack.
{
let new_sighandler_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"sighandler")?);
let data = SetSighandlerData {
user_handler: sighandler_function(),
excp_handler: 0,
thread_control_addr: 0, // TODO
proc_control_addr: 0, // TODO
};
let _ = syscall::write(*new_sighandler_fd, &data)?;
}
// Sigprocmask starts as "block all", and is initialized when the thread has actually returned
// from clone_ret.
// TODO: Should some of these registers be inherited?
//copy_env_regs(*cur_pid_fd, *new_pid_fd)?;
// Unblock context. // Unblock context.
let start_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"start")?); let start_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"start")?);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment