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::{log_syscall_entry, prelude::*};
use crate::syscall::SYS_WRITEV; use crate::syscall::SYS_WRITEV;
@ -14,34 +15,41 @@ pub struct IoVec {
len: usize, 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); 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 _)) 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!( debug!(
"fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}", "fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}",
fd, io_vec_ptr, io_vec_count 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 { for i in 0..io_vec_count {
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * 16)?; 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 base = io_vec.base;
let len = io_vec.len; let len = io_vec.len;
let mut buffer = vec![0u8; len]; let mut buffer = vec![0u8; len];
read_bytes_from_user(base, &mut buffer)?; read_bytes_from_user(base, &mut buffer)?;
let content = alloc::str::from_utf8(&buffer).unwrap(); buffer
write_len += len; };
if fd == 1 { let write_len = file.write(&buffer)?;
print!("{}", content); total_len += write_len;
} else if fd == 2 {
print!("{}", content);
} else {
info!("content = {}", content);
panic!("Unsupported fd {}", fd);
} }
} Ok(total_len)
Ok(write_len)
} }