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, };
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(bytes_read) => bytes_read,
51 Err(_) => usize::MAX, }
53}
54
55pub fn sys_stream_write(trapframe: &mut Trapframe) -> usize {
66 let task = match mytask() {
67 Some(task) => task,
68 None => return usize::MAX,
69 };
70
71 let handle = trapframe.get_arg(0) as u32;
72 let buf_ptr = match task.vm_manager.translate_vaddr(trapframe.get_arg(1)) {
73 Some(ptr) => ptr as *const u8,
74 None => return usize::MAX, };
76 let count = trapframe.get_arg(2) as usize;
77
78 trapframe.increment_pc_next(task);
80
81 let kernel_obj = match task.handle_table.get(handle) {
83 Some(obj) => obj,
84 None => return usize::MAX, };
86
87 let stream = match kernel_obj.as_stream() {
89 Some(stream) => stream,
90 None => return usize::MAX, };
92
93 let buffer = unsafe { core::slice::from_raw_parts(buf_ptr, count) };
95 match stream.write(buffer) {
96 Ok(bytes_written) => bytes_written,
97 Err(_) => usize::MAX, }
99}