Reimplement writev

This commit is contained in:
Jianfeng Jiang
2023-06-14 16:47:17 +08:00
committed by Tate, Hongliang Tian
parent 0018ac4d63
commit 809e477bdf

View File

@ -1,3 +1,4 @@
use crate::fs::file_table::FileDescripter;
use crate::{log_syscall_entry, prelude::*};
use crate::syscall::SYS_WRITEV;
@ -14,34 +15,41 @@ pub struct IoVec {
len: usize,
}
pub fn sys_writev(fd: u64, io_vec_ptr: u64, io_vec_count: u64) -> Result<SyscallReturn> {
pub fn sys_writev(
fd: FileDescripter,
io_vec_ptr: Vaddr,
io_vec_count: usize,
) -> Result<SyscallReturn> {
log_syscall_entry!(SYS_WRITEV);
let res = do_sys_writev(fd, io_vec_ptr as Vaddr, io_vec_count as usize)?;
let res = do_sys_writev(fd, io_vec_ptr, io_vec_count)?;
Ok(SyscallReturn::Return(res as _))
}
pub fn do_sys_writev(fd: u64, io_vec_ptr: Vaddr, io_vec_count: usize) -> Result<usize> {
fn do_sys_writev(fd: FileDescripter, io_vec_ptr: Vaddr, io_vec_count: usize) -> Result<usize> {
debug!(
"fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}",
fd, io_vec_ptr, io_vec_count
);
let mut write_len = 0;
let file = {
let current = current!();
let filetable = current.file_table().lock();
filetable.get_file(fd)?.clone()
};
let mut total_len = 0;
for i in 0..io_vec_count {
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * 16)?;
let base = io_vec.base;
let len = io_vec.len;
let mut buffer = vec![0u8; len];
read_bytes_from_user(base, &mut buffer)?;
let content = alloc::str::from_utf8(&buffer).unwrap();
write_len += len;
if fd == 1 {
print!("{}", content);
} else if fd == 2 {
print!("{}", content);
} else {
info!("content = {}", content);
panic!("Unsupported fd {}", fd);
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * core::mem::size_of::<IoVec>())?;
if io_vec.base == 0 {
continue;
}
let buffer = {
let base = io_vec.base;
let len = io_vec.len;
let mut buffer = vec![0u8; len];
read_bytes_from_user(base, &mut buffer)?;
buffer
};
let write_len = file.write(&buffer)?;
total_len += write_len;
}
Ok(write_len)
Ok(total_len)
}