Modify the userspace read/write usage location

This commit is contained in:
Chen Chengjun
2024-06-28 09:36:43 +08:00
committed by Tate, Hongliang Tian
parent af908c29cf
commit cd2b305fa8
14 changed files with 25 additions and 19 deletions

View File

@ -195,7 +195,7 @@ pub fn handle_user_signal(
]; ];
stack_pointer -= TRAMPOLINE.len() as u64; stack_pointer -= TRAMPOLINE.len() as u64;
let trampoline_rip = stack_pointer; let trampoline_rip = stack_pointer;
write_bytes_to_user(stack_pointer as Vaddr, TRAMPOLINE)?; write_bytes_to_user(stack_pointer as Vaddr, &mut VmReader::from(TRAMPOLINE))?;
stack_pointer = write_u64_to_user_stack(stack_pointer, trampoline_rip)?; stack_pointer = write_u64_to_user_stack(stack_pointer, trampoline_rip)?;
} }

View File

@ -8,6 +8,6 @@ pub fn sys_getcwd(buf: Vaddr, len: usize) -> Result<SyscallReturn> {
let fake_cwd = CString::new("/")?; let fake_cwd = CString::new("/")?;
let bytes = fake_cwd.as_bytes_with_nul(); let bytes = fake_cwd.as_bytes_with_nul();
let write_len = len.min(bytes.len()); let write_len = len.min(bytes.len());
write_bytes_to_user(buf, &bytes[..write_len])?; write_bytes_to_user(buf, &mut VmReader::from(&bytes[..write_len]))?;
Ok(SyscallReturn::Return(write_len as _)) Ok(SyscallReturn::Return(write_len as _))
} }

View File

@ -36,7 +36,7 @@ pub fn sys_getdents(fd: FileDesc, buf_addr: Vaddr, buf_len: usize) -> Result<Sys
let mut reader = DirentBufferReader::<Dirent>::new(&mut buffer); // Use the non-64-bit reader let mut reader = DirentBufferReader::<Dirent>::new(&mut buffer); // Use the non-64-bit reader
let _ = inode_handle.readdir(&mut reader)?; let _ = inode_handle.readdir(&mut reader)?;
let read_len = reader.read_len(); let read_len = reader.read_len();
write_bytes_to_user(buf_addr, &buffer[..read_len])?; write_bytes_to_user(buf_addr, &mut VmReader::from(&buffer[..read_len]))?;
Ok(SyscallReturn::Return(read_len as _)) Ok(SyscallReturn::Return(read_len as _))
} }
@ -61,7 +61,7 @@ pub fn sys_getdents64(fd: FileDesc, buf_addr: Vaddr, buf_len: usize) -> Result<S
let mut reader = DirentBufferReader::<Dirent64>::new(&mut buffer); let mut reader = DirentBufferReader::<Dirent64>::new(&mut buffer);
let _ = inode_handle.readdir(&mut reader)?; let _ = inode_handle.readdir(&mut reader)?;
let read_len = reader.read_len(); let read_len = reader.read_len();
write_bytes_to_user(buf_addr, &buffer[..read_len])?; write_bytes_to_user(buf_addr, &mut VmReader::from(&buffer[..read_len]))?;
Ok(SyscallReturn::Return(read_len as _)) Ok(SyscallReturn::Return(read_len as _))
} }

View File

@ -17,7 +17,7 @@ pub fn sys_getrandom(buf: Vaddr, count: usize, flags: u32) -> Result<SyscallRetu
} else { } else {
device::Urandom::getrandom(&mut buffer)? device::Urandom::getrandom(&mut buffer)?
}; };
write_bytes_to_user(buf, &buffer)?; write_bytes_to_user(buf, &mut VmReader::from(buffer.as_slice()))?;
Ok(SyscallReturn::Return(read_len as isize)) Ok(SyscallReturn::Return(read_len as isize))
} }

View File

@ -15,7 +15,7 @@ pub fn sys_madvise(start: Vaddr, len: usize, behavior: i32) -> Result<SyscallRet
| MadviseBehavior::MADV_WILLNEED => { | MadviseBehavior::MADV_WILLNEED => {
// perform a read at first // perform a read at first
let mut buffer = vec![0u8; len]; let mut buffer = vec![0u8; len];
read_bytes_from_user(start, &mut buffer)?; read_bytes_from_user(start, &mut VmWriter::from(buffer.as_mut_slice()))?;
} }
MadviseBehavior::MADV_DONTNEED => madv_dontneed(start, len)?, MadviseBehavior::MADV_DONTNEED => madv_dontneed(start, len)?,
_ => todo!(), _ => todo!(),

View File

@ -39,7 +39,10 @@ pub fn sys_prctl(option: i32, arg2: u64, arg3: u64, arg4: u64, arg5: u64) -> Res
let thread_name = posix_thread.thread_name().lock(); let thread_name = posix_thread.thread_name().lock();
if let Some(thread_name) = &*thread_name { if let Some(thread_name) = &*thread_name {
if let Some(thread_name) = thread_name.name()? { if let Some(thread_name) = thread_name.name()? {
write_bytes_to_user(write_to_addr, thread_name.to_bytes_with_nul())?; write_bytes_to_user(
write_to_addr,
&mut VmReader::from(thread_name.to_bytes_with_nul()),
)?;
} }
} }
} }

View File

@ -33,7 +33,7 @@ pub fn sys_pread64(
let read_len = { let read_len = {
let mut buffer = vec![0u8; user_buf_len]; let mut buffer = vec![0u8; user_buf_len];
let read_len = file.read_at(offset as usize, &mut buffer)?; let read_len = file.read_at(offset as usize, &mut buffer)?;
write_bytes_to_user(user_buf_ptr, &buffer)?; write_bytes_to_user(user_buf_ptr, &mut VmReader::from(buffer.as_slice()))?;
read_len read_len
}; };

View File

@ -30,7 +30,7 @@ pub fn sys_pwrite64(
} }
let mut buffer = vec![0u8; user_buf_len]; let mut buffer = vec![0u8; user_buf_len];
read_bytes_from_user(user_buf_ptr, &mut buffer)?; read_bytes_from_user(user_buf_ptr, &mut VmWriter::from(buffer.as_mut_slice()))?;
let write_len = file.write_at(offset as _, &buffer)?; let write_len = file.write_at(offset as _, &buffer)?;
Ok(SyscallReturn::Return(write_len as _)) Ok(SyscallReturn::Return(write_len as _))
} }

View File

@ -17,6 +17,6 @@ pub fn sys_read(fd: FileDesc, user_buf_addr: Vaddr, buf_len: usize) -> Result<Sy
let mut read_buf = vec![0u8; buf_len]; let mut read_buf = vec![0u8; buf_len];
let read_len = file.read(&mut read_buf)?; let read_len = file.read(&mut read_buf)?;
write_bytes_to_user(user_buf_addr, &read_buf)?; write_bytes_to_user(user_buf_addr, &mut VmReader::from(read_buf.as_slice()))?;
Ok(SyscallReturn::Return(read_len as _)) Ok(SyscallReturn::Return(read_len as _))
} }

View File

@ -35,7 +35,7 @@ pub fn sys_readlinkat(
let linkpath = dentry.inode().read_link()?; let linkpath = dentry.inode().read_link()?;
let bytes = linkpath.as_bytes(); let bytes = linkpath.as_bytes();
let write_len = bytes.len().min(usr_buf_len); let write_len = bytes.len().min(usr_buf_len);
write_bytes_to_user(usr_buf_addr, &bytes[..write_len])?; write_bytes_to_user(usr_buf_addr, &mut VmReader::from(&bytes[..write_len]))?;
Ok(SyscallReturn::Return(write_len as _)) Ok(SyscallReturn::Return(write_len as _))
} }

View File

@ -25,7 +25,7 @@ pub fn sys_write(fd: FileDesc, user_buf_ptr: Vaddr, user_buf_len: usize) -> Resu
} }
let mut buffer = vec![0u8; user_buf_len]; let mut buffer = vec![0u8; user_buf_len];
read_bytes_from_user(user_buf_ptr, &mut buffer)?; read_bytes_from_user(user_buf_ptr, &mut VmWriter::from(buffer.as_mut_slice()))?;
debug!("write content = {:?}", buffer); debug!("write content = {:?}", buffer);
let write_len = file.write(&buffer)?; let write_len = file.write(&buffer)?;
Ok(SyscallReturn::Return(write_len as _)) Ok(SyscallReturn::Return(write_len as _))

View File

@ -75,7 +75,7 @@ impl IoVec {
assert_eq!(dst.len(), self.len); assert_eq!(dst.len(), self.len);
assert!(!self.is_empty()); assert!(!self.is_empty());
read_bytes_from_user(self.base, dst) read_bytes_from_user(self.base, &mut VmWriter::from(dst))
} }
/// Writes bytes from the `src` buffer /// Writes bytes from the `src` buffer
@ -92,7 +92,7 @@ impl IoVec {
assert_eq!(src.len(), self.len); assert_eq!(src.len(), self.len);
assert!(!self.is_empty()); assert!(!self.is_empty());
write_bytes_to_user(self.base, src) write_bytes_to_user(self.base, &mut VmReader::from(src))
} }
/// Reads bytes to the `dst` buffer /// Reads bytes to the `dst` buffer
@ -101,7 +101,7 @@ impl IoVec {
/// If successful, returns the length of actually read bytes. /// If successful, returns the length of actually read bytes.
pub fn read_from_user(&self, dst: &mut [u8]) -> Result<usize> { pub fn read_from_user(&self, dst: &mut [u8]) -> Result<usize> {
let len = self.len.min(dst.len()); let len = self.len.min(dst.len());
read_bytes_from_user(self.base, &mut dst[..len])?; read_bytes_from_user(self.base, &mut VmWriter::from(&mut dst[..len]))?;
Ok(len) Ok(len)
} }
@ -111,7 +111,7 @@ impl IoVec {
/// If successful, returns the length of actually written bytes. /// If successful, returns the length of actually written bytes.
pub fn write_to_user(&self, src: &[u8]) -> Result<usize> { pub fn write_to_user(&self, src: &[u8]) -> Result<usize> {
let len = self.len.min(src.len()); let len = self.len.min(src.len());
write_bytes_to_user(self.base, &src[..len])?; write_bytes_to_user(self.base, &mut VmReader::from(&src[..len]))?;
Ok(len) Ok(len)
} }
} }

View File

@ -27,7 +27,10 @@ pub fn read_socket_addr_from_user(addr: Vaddr, addr_len: usize) -> Result<Socket
let bytes = { let bytes = {
let bytes_len = addr_len - core::mem::size_of::<u16>(); let bytes_len = addr_len - core::mem::size_of::<u16>();
let mut bytes = vec![0u8; bytes_len]; let mut bytes = vec![0u8; bytes_len];
read_bytes_from_user(addr + core::mem::size_of::<u16>(), &mut bytes)?; read_bytes_from_user(
addr + core::mem::size_of::<u16>(),
&mut VmWriter::from(bytes.as_mut_slice()),
)?;
bytes bytes
}; };

View File

@ -178,7 +178,7 @@ impl PreemptInfo {
} }
} }
fn incease_num_locks(&self) { fn increase_num_locks(&self) {
self.num_locks.fetch_add(1, Relaxed); self.num_locks.fetch_add(1, Relaxed);
} }
@ -205,7 +205,7 @@ impl !Send for DisablePreemptGuard {}
impl DisablePreemptGuard { impl DisablePreemptGuard {
fn new() -> Self { fn new() -> Self {
PREEMPT_COUNT.incease_num_locks(); PREEMPT_COUNT.increase_num_locks();
Self { private: () } Self { private: () }
} }