1use crate::mm::translated_byte_buffer;
3use crate::sbi::console_getchar;
4use crate::task::{current_user_token, suspend_current_and_run_next};
5
6const FD_STDIN: usize = 0;
7const FD_STDOUT: usize = 1;
8
9pub fn sys_write(fd: usize, buf: *const u8, len: usize) -> isize {
10 match fd {
11 FD_STDOUT => {
12 let buffers = translated_byte_buffer(current_user_token(), buf, len);
13 for buffer in buffers {
14 print!("{}", core::str::from_utf8(buffer).unwrap());
15 }
16 len as isize
17 }
18 _ => {
19 panic!("Unsupported fd in sys_write!");
20 }
21 }
22}
23
24pub fn sys_read(fd: usize, buf: *const u8, len: usize) -> isize {
25 match fd {
26 FD_STDIN => {
27 assert_eq!(len, 1, "Only support len = 1 in sys_read!");
28 let mut c: usize;
29 loop {
30 c = console_getchar();
31 if c == 0 {
32 suspend_current_and_run_next();
33 continue;
34 } else {
35 break;
36 }
37 }
38 let ch = c as u8;
39 let mut buffers = translated_byte_buffer(current_user_token(), buf, len);
40 unsafe {
41 buffers[0].as_mut_ptr().write_volatile(ch);
42 }
43 1
44 }
45 _ => {
46 panic!("Unsupported fd in sys_read!");
47 }
48 }
49}