kernel/object/capability/stream/
syscall.rs

1//! System calls for StreamOps capability
2//! 
3//! This module implements system calls that operate on KernelObjects
4//! with StreamOps capability (read/write operations).
5
6use crate::arch::Trapframe;
7use crate::task::mytask;
8
9/// System call for reading from a KernelObject with StreamOps capability
10/// 
11/// # Arguments
12/// - handle: Handle to the KernelObject
13/// - buffer_ptr: Pointer to the buffer to read into
14/// - count: Number of bytes to read
15/// 
16/// # Returns
17/// - On success: number of bytes read
18/// - On error: usize::MAX
19pub 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, // Invalid buffer pointer
29    };
30    let count = trapframe.get_arg(2) as usize;
31
32    // Increment PC to avoid infinite loop if read fails
33    trapframe.increment_pc_next(task);
34
35    // Get KernelObject from handle table
36    let kernel_obj = match task.handle_table.get(handle) {
37        Some(obj) => obj,
38        None => return usize::MAX, // Invalid handle
39    };
40
41    // Check if object supports StreamOps
42    let stream = match kernel_obj.as_stream() {
43        Some(stream) => stream,
44        None => return usize::MAX, // Object doesn't support stream operations
45    };
46
47    // Perform read operation
48    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, // Read error
52    }
53}
54
55/// System call for writing to a KernelObject with StreamOps capability
56/// 
57/// # Arguments
58/// - handle: Handle to the KernelObject
59/// - buffer_ptr: Pointer to the buffer to write from
60/// - count: Number of bytes to write
61/// 
62/// # Returns
63/// - On success: number of bytes written
64/// - On error: usize::MAX
65pub 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, // Invalid buffer pointer
75    };
76    let count = trapframe.get_arg(2) as usize;
77
78    // Increment PC to avoid infinite loop if write fails
79    trapframe.increment_pc_next(task);
80
81    // Get KernelObject from handle table
82    let kernel_obj = match task.handle_table.get(handle) {
83        Some(obj) => obj,
84        None => return usize::MAX, // Invalid handle
85    };
86
87    // Check if object supports StreamOps
88    let stream = match kernel_obj.as_stream() {
89        Some(stream) => stream,
90        None => return usize::MAX, // Object doesn't support stream operations
91    };
92
93    // Perform write operation
94    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, // Write error
98    }
99}