|
2 | 2 |
|
3 | 3 | ## 简单移植了Starry-Old的实现 |
4 | 4 |
|
| 5 | +```rust |
| 6 | +#[apply(syscall_instrument)] |
| 7 | +pub fn sys_clone3(clone_args: UserConstPtr<usize>, size: u64) -> LinuxResult<isize> { |
| 8 | + // warn!("sys_clone3 not implemented"); |
| 9 | + if size < size_of::<CloneArgs>() { |
| 10 | + return Err(LinuxError::EINVAL); |
| 11 | + } |
| 12 | + let curr_process = current(); |
| 13 | + // check if the pointer is valid |
| 14 | + if clone_args.address().as_ptr() as usize == 0 { |
| 15 | + return Err(LinuxError::EFAULT); |
| 16 | + } |
| 17 | + // get the clone_args |
| 18 | + let clone_args = unsafe { &*(clone_args.address().as_ptr() as *const CloneArgs) }; |
| 19 | + |
| 20 | + let clone_flag = CloneFlags::from_bits(clone_args.flags).unwrap(); |
| 21 | + if (clone_flag.contains(CloneFlags::CLONE_THREAD) || clone_flag.contains(CloneFlags::CLONE_PARENT)) |
| 22 | + && clone_args.exit_signal != 0 |
| 23 | + { |
| 24 | + return Err(LinuxError::EINVAL); |
| 25 | + |
| 26 | + } |
| 27 | + if clone_flags.contains(CloneFlags::CLONE_SIGHAND) |
| 28 | + && !clone_flags.contains(CloneFlags::CLONE_VM) |
| 29 | + { |
| 30 | + // Error when CLONE_SIGHAND was specified in the flags mask, but CLONE_VM was not. |
| 31 | + return Err(LinuxError::EINVAL); |
| 32 | + } |
| 33 | + let stack = if clone_args.stack == 0 { |
| 34 | + None |
| 35 | + } else { |
| 36 | + Some((clone_args.stack + clone_args.stack_size) as usize) |
| 37 | + }; |
| 38 | + // let sig_child = if clone_args.exit_signal != 0 { |
| 39 | + // Some(SignalNo::from(clone_args.exit_signal as usize)) |
| 40 | + // } else { |
| 41 | + // None |
| 42 | + // }; |
| 43 | + let sig_child = None; |
| 44 | + |
| 45 | + if clone_args.stack != 0 && (clone_args.stack % 16 != 0 || clone_args.stack_size == 0) { |
| 46 | + return Err(LinuxError::EINVAL); |
| 47 | + } |
| 48 | + if let Ok(new_task_id) = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, clone_args.tls, sig_child){ |
| 49 | + // let new_task_id = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, sig_child); |
| 50 | + // let new_task_id = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, sig_child); |
| 51 | + return Ok(new_task_id as isize); |
| 52 | + } else { |
| 53 | + return Err(LinuxError::ENOMEM); |
| 54 | + } |
| 55 | + |
| 56 | + Ok(0); |
| 57 | +} |
| 58 | +``` |
| 59 | + |
5 | 60 | 希望进一步通过测例来观察和调整 |
6 | 61 |
|
7 | 62 | ## 编写简单测例 |
|
0 commit comments