kernel/object/capability/stream/
syscall.rs1use crate::arch::Trapframe;
7use crate::task::mytask;
8
9pub fn sys_stream_read(trapframe: &mut Trapframe) -> usize {
20 let task = match mytask() {
21 Some(task) => task,
22 None => return usize::MAX,
23 };
24
25 let handle = trapframe.get_arg(0) as u32;
26 let buf_ptr = match task.vm_manager.translate_vaddr(trapframe.get_arg(1)) {
27 Some(ptr) => ptr as *mut u8,
28 None => return usize::MAX, };
30 let count = trapframe.get_arg(2) as usize;
31
32 trapframe.increment_pc_next(task);
34
35 let kernel_obj = match task.handle_table.get(handle) {
37 Some(obj) => obj,
38 None => return usize::MAX,
39 };
40
41 let stream = match kernel_obj.as_stream() {
43 Some(stream) => stream,
44 None => return usize::MAX, };
46
47 let buffer = unsafe { core::slice::from_raw_parts_mut(buf_ptr, count) };
49 match stream.read(buffer) {
50 Ok(n) => n,
51 Err(super::StreamError::WouldBlock) => {
52 (-(11i32)) as usize
54 }
55 Err(_) => usize::MAX,
56 }
57}
58
59pub fn sys_stream_write(trapframe: &mut Trapframe) -> usize {
70 let task = match mytask() {
71 Some(task) => task,
72 None => return usize::MAX,
73 };
74
75 let handle = trapframe.get_arg(0) as u32;
76 let buf_ptr = match task.vm_manager.translate_vaddr(trapframe.get_arg(1)) {
77 Some(ptr) => ptr as *const u8,
78 None => return usize::MAX, };
80 let count = trapframe.get_arg(2) as usize;
81
82 trapframe.increment_pc_next(task);
84
85 let kernel_obj = match task.handle_table.get(handle) {
87 Some(obj) => obj,
88 None => return usize::MAX, };
90
91 let stream = match kernel_obj.as_stream() {
93 Some(stream) => stream,
94 None => return usize::MAX, };
96
97 let buffer = unsafe { core::slice::from_raw_parts(buf_ptr, count) };
99 match stream.write(buffer) {
100 Ok(bytes_written) => bytes_written,
101 Err(_) => usize::MAX, }
103}