kernel/abi/xv6/riscv64/
pipe.rs1use crate::{arch::Trapframe, ipc::UnidirectionalPipe, task::mytask};
2
3pub fn sys_pipe(abi: &mut crate::abi::xv6::riscv64::Xv6Riscv64Abi, trapframe: &mut Trapframe) -> usize {
4 let task = mytask().unwrap();
5 trapframe.increment_pc_next(task);
6
7 let pipefd_ptr = task.vm_manager.translate_vaddr(trapframe.get_arg(0))
8 .expect("Invalid pipefd pointer");
9 let pipefd = unsafe { &mut *(pipefd_ptr as *mut [u32; 2]) };
10
11 let (read_end, write_end) = UnidirectionalPipe::create_pair(4096);
12
13 let read_handle = task.handle_table.insert(read_end).expect("Failed to insert read end");
14 let write_handle = task.handle_table.insert(write_end).expect("Failed to insert write end");
15
16 let read_fd = match abi.allocate_fd(read_handle as u32) {
18 Ok(fd) => fd,
19 Err(_) => return usize::MAX, };
21 let write_fd = match abi.allocate_fd(write_handle as u32) {
22 Ok(fd) => fd,
23 Err(_) => {
24 abi.remove_fd(read_fd);
26 task.handle_table.remove(read_handle);
27 return usize::MAX; }
29 };
30
31 pipefd[0] = read_fd as u32;
32 pipefd[1] = write_fd as u32;
33
34 0
35}