Modify the getting-VMAR usages in other syscalls

This commit is contained in:
Chen Chengjun 2025-03-17 10:35:31 +08:00 committed by Tate, Hongliang Tian
parent 048fd1077c
commit 135100a472
18 changed files with 52 additions and 52 deletions

View File

@ -65,9 +65,9 @@ impl Heap {
Ok(()) Ok(())
} }
pub fn brk(&self, new_heap_end: Option<Vaddr>) -> Result<Vaddr> { pub fn brk(&self, new_heap_end: Option<Vaddr>, ctx: &Context) -> Result<Vaddr> {
let current = current!(); let user_space = ctx.user_space();
let root_vmar = current.root_vmar(); let root_vmar = user_space.root_vmar();
match new_heap_end { match new_heap_end {
None => Ok(self.current_heap_end.load(Ordering::Relaxed)), None => Ok(self.current_heap_end.load(Ordering::Relaxed)),
Some(new_heap_end) => { Some(new_heap_end) => {

View File

@ -11,7 +11,7 @@ pub fn sys_brk(heap_end: u64, ctx: &Context) -> Result<SyscallReturn> {
}; };
debug!("new heap end = {:x?}", heap_end); debug!("new heap end = {:x?}", heap_end);
let user_heap = ctx.process.heap(); let user_heap = ctx.process.heap();
let new_heap_end = user_heap.brk(new_heap_end)?; let new_heap_end = user_heap.brk(new_heap_end, ctx)?;
Ok(SyscallReturn::Return(new_heap_end as _)) Ok(SyscallReturn::Return(new_heap_end as _))
} }

View File

@ -51,7 +51,8 @@ pub fn sys_madvise(
} }
fn madv_free(start: Vaddr, end: Vaddr, ctx: &Context) -> Result<()> { fn madv_free(start: Vaddr, end: Vaddr, ctx: &Context) -> Result<()> {
let root_vmar = ctx.process.root_vmar(); let user_space = ctx.user_space();
let root_vmar = user_space.root_vmar();
let advised_range = start..end; let advised_range = start..end;
let _ = root_vmar.remove_mapping(advised_range); let _ = root_vmar.remove_mapping(advised_range);

View File

@ -91,7 +91,8 @@ fn do_sys_mmap(
vm_perms vm_perms
}; };
let root_vmar = ctx.process.root_vmar(); let user_space = ctx.user_space();
let root_vmar = user_space.root_vmar();
let vm_map_options = { let vm_map_options = {
let mut options = root_vmar.new_map(len, vm_perms)?; let mut options = root_vmar.new_map(len, vm_perms)?;
let flags = option.flags; let flags = option.flags;

View File

@ -11,7 +11,8 @@ pub fn sys_mprotect(addr: Vaddr, len: usize, perms: u64, ctx: &Context) -> Resul
"addr = 0x{:x}, len = 0x{:x}, perms = {:?}", "addr = 0x{:x}, len = 0x{:x}, perms = {:?}",
addr, len, vm_perms addr, len, vm_perms
); );
let root_vmar = ctx.process.root_vmar(); let user_space = ctx.user_space();
let root_vmar = user_space.root_vmar();
// According to linux behavior, // According to linux behavior,
// <https://elixir.bootlin.com/linux/v6.0.9/source/mm/mprotect.c#L681>, // <https://elixir.bootlin.com/linux/v6.0.9/source/mm/mprotect.c#L681>,

View File

@ -18,7 +18,8 @@ pub fn sys_munmap(addr: Vaddr, len: usize, ctx: &Context) -> Result<SyscallRetur
return_errno_with_message!(Errno::ENOMEM, "munmap len align overflow"); return_errno_with_message!(Errno::ENOMEM, "munmap len align overflow");
} }
let root_vmar = ctx.process.root_vmar(); let user_space = ctx.user_space();
let root_vmar = user_space.root_vmar();
let len = len.align_up(PAGE_SIZE); let len = len.align_up(PAGE_SIZE);
let end = addr.checked_add(len).ok_or(Error::with_message( let end = addr.checked_add(len).ok_or(Error::with_message(
Errno::EINVAL, Errno::EINVAL,

View File

@ -34,11 +34,8 @@ pub fn sys_pread64(
} }
let read_len = { let read_len = {
let mut writer = ctx let user_space = ctx.user_space();
.process let mut writer = user_space.writer(user_buf_ptr, user_buf_len)?;
.root_vmar()
.vm_space()
.writer(user_buf_ptr, user_buf_len)?;
file.read_at(offset as usize, &mut writer)? file.read_at(offset as usize, &mut writer)?
}; };

View File

@ -75,7 +75,8 @@ fn do_sys_preadv(
let mut total_len: usize = 0; let mut total_len: usize = 0;
let mut cur_offset = offset as usize; let mut cur_offset = offset as usize;
let mut writer_array = VmWriterArray::from_user_io_vecs(ctx, io_vec_ptr, io_vec_count)?; let user_space = ctx.user_space();
let mut writer_array = VmWriterArray::from_user_io_vecs(&user_space, io_vec_ptr, io_vec_count)?;
for writer in writer_array.writers_mut() { for writer in writer_array.writers_mut() {
if !writer.has_avail() { if !writer.has_avail() {
continue; continue;
@ -134,7 +135,8 @@ fn do_sys_readv(
let mut total_len = 0; let mut total_len = 0;
let mut writer_array = VmWriterArray::from_user_io_vecs(ctx, io_vec_ptr, io_vec_count)?; let user_space = ctx.user_space();
let mut writer_array = VmWriterArray::from_user_io_vecs(&user_space, io_vec_ptr, io_vec_count)?;
for writer in writer_array.writers_mut() { for writer in writer_array.writers_mut() {
if !writer.has_avail() { if !writer.has_avail() {
continue; continue;

View File

@ -33,11 +33,8 @@ pub fn sys_pwrite64(
return_errno_with_message!(Errno::EINVAL, "offset + user_buf_len overflow"); return_errno_with_message!(Errno::EINVAL, "offset + user_buf_len overflow");
} }
let mut reader = ctx let user_space = ctx.user_space();
.process let mut reader = user_space.reader(user_buf_ptr, user_buf_len)?;
.root_vmar()
.vm_space()
.reader(user_buf_ptr, user_buf_len)?;
let write_len = file.write_at(offset as _, &mut reader)?; let write_len = file.write_at(offset as _, &mut reader)?;
Ok(SyscallReturn::Return(write_len as _)) Ok(SyscallReturn::Return(write_len as _))
} }

View File

@ -77,7 +77,8 @@ fn do_sys_pwritev(
let mut total_len: usize = 0; let mut total_len: usize = 0;
let mut cur_offset = offset as usize; let mut cur_offset = offset as usize;
let mut reader_array = VmReaderArray::from_user_io_vecs(ctx, io_vec_ptr, io_vec_count)?; let user_space = ctx.user_space();
let mut reader_array = VmReaderArray::from_user_io_vecs(&user_space, io_vec_ptr, io_vec_count)?;
for reader in reader_array.readers_mut() { for reader in reader_array.readers_mut() {
if !reader.has_remain() { if !reader.has_remain() {
continue; continue;
@ -127,7 +128,8 @@ fn do_sys_writev(
let mut total_len = 0; let mut total_len = 0;
let mut reader_array = VmReaderArray::from_user_io_vecs(ctx, io_vec_ptr, io_vec_count)?; let user_space = ctx.user_space();
let mut reader_array = VmReaderArray::from_user_io_vecs(&user_space, io_vec_ptr, io_vec_count)?;
for reader in reader_array.readers_mut() { for reader in reader_array.readers_mut() {
if !reader.has_remain() { if !reader.has_remain() {
continue; continue;

View File

@ -25,11 +25,8 @@ pub fn sys_read(
// the file descriptor. If no errors detected, return 0 successfully. // the file descriptor. If no errors detected, return 0 successfully.
let read_len = { let read_len = {
if buf_len != 0 { if buf_len != 0 {
let mut writer = ctx let user_space = ctx.user_space();
.process let mut writer = user_space.writer(user_buf_addr, buf_len)?;
.root_vmar()
.vm_space()
.writer(user_buf_addr, buf_len)?;
file.read(&mut writer) file.read(&mut writer)
} else { } else {
file.read_bytes(&mut []) file.read_bytes(&mut [])

View File

@ -24,10 +24,8 @@ pub fn sys_recvfrom(
let file = get_file_fast!(&mut file_table, sockfd); let file = get_file_fast!(&mut file_table, sockfd);
let socket = file.as_socket_or_err()?; let socket = file.as_socket_or_err()?;
let mut writers = { let user_space = ctx.user_space();
let vm_space = ctx.process.root_vmar().vm_space(); let mut writers = user_space.writer(buf, len)?;
vm_space.writer(buf, len)?
};
let (recv_size, message_header) = let (recv_size, message_header) =
socket socket

View File

@ -27,7 +27,8 @@ pub fn sys_recvmsg(
let socket = file.as_socket_or_err()?; let socket = file.as_socket_or_err()?;
let (total_bytes, message_header) = { let (total_bytes, message_header) = {
let mut io_vec_writer = c_user_msghdr.copy_writer_array_from_user(ctx)?; let user_space = ctx.user_space();
let mut io_vec_writer = c_user_msghdr.copy_writer_array_from_user(&user_space)?;
socket socket
.recvmsg(&mut io_vec_writer, flags) .recvmsg(&mut io_vec_writer, flags)
.map_err(|err| match err.error() { .map_err(|err| match err.error() {

View File

@ -26,9 +26,10 @@ pub fn sys_sendmsg(
let file = get_file_fast!(&mut file_table, sockfd); let file = get_file_fast!(&mut file_table, sockfd);
let socket = file.as_socket_or_err()?; let socket = file.as_socket_or_err()?;
let user_space = ctx.user_space();
let (mut io_vec_reader, message_header) = { let (mut io_vec_reader, message_header) = {
let addr = c_user_msghdr.read_socket_addr_from_user()?; let addr = c_user_msghdr.read_socket_addr_from_user()?;
let io_vec_reader = c_user_msghdr.copy_reader_array_from_user(ctx)?; let io_vec_reader = c_user_msghdr.copy_reader_array_from_user(&user_space)?;
let control_message = { let control_message = {
if c_user_msghdr.msg_control != 0 { if c_user_msghdr.msg_control != 0 {

View File

@ -32,10 +32,8 @@ pub fn sys_sendto(
let message_header = MessageHeader::new(socket_addr, None); let message_header = MessageHeader::new(socket_addr, None);
let mut reader = { let user_space = ctx.user_space();
let vm_space = ctx.process.root_vmar().vm_space(); let mut reader = user_space.reader(buf, len)?;
vm_space.reader(buf, len)?
};
let send_size = socket let send_size = socket
.sendmsg(&mut reader, message_header, flags) .sendmsg(&mut reader, message_header, flags)
.map_err(|err| match err.error() { .map_err(|err| match err.error() {

View File

@ -25,11 +25,8 @@ pub fn sys_write(
// the file descriptor. If no errors detected, return 0 successfully. // the file descriptor. If no errors detected, return 0 successfully.
let write_len = { let write_len = {
if user_buf_len != 0 { if user_buf_len != 0 {
let mut reader = ctx let user_space = ctx.user_space();
.process let mut reader = user_space.reader(user_buf_ptr, user_buf_len)?;
.root_vmar()
.vm_space()
.reader(user_buf_ptr, user_buf_len)?;
file.write(&mut reader) file.write(&mut reader)
} else { } else {
file.write_bytes(&[]) file.write_bytes(&[])

View File

@ -55,12 +55,12 @@ impl IoVec {
/// The util function for create [`VmReader`]/[`VmWriter`]s. /// The util function for create [`VmReader`]/[`VmWriter`]s.
fn copy_iovs_and_convert<'a, T: 'a>( fn copy_iovs_and_convert<'a, T: 'a>(
ctx: &'a Context, user_space: &'a CurrentUserSpace<'a>,
start_addr: Vaddr, start_addr: Vaddr,
count: usize, count: usize,
convert_iovec: impl Fn(&IoVec, &'a VmSpace) -> Result<T>, convert_iovec: impl Fn(&IoVec, &'a VmSpace) -> Result<T>,
) -> Result<Box<[T]>> { ) -> Result<Box<[T]>> {
let vm_space = ctx.process.root_vmar().vm_space(); let vm_space = user_space.root_vmar().vm_space();
let mut v = Vec::with_capacity(count); let mut v = Vec::with_capacity(count);
for idx in 0..count { for idx in 0..count {
@ -96,11 +96,11 @@ pub struct VmWriterArray<'a>(Box<[VmWriter<'a>]>);
impl<'a> VmReaderArray<'a> { impl<'a> VmReaderArray<'a> {
/// Creates a new `IoVecReader` from user-provided io vec buffer. /// Creates a new `IoVecReader` from user-provided io vec buffer.
pub fn from_user_io_vecs( pub fn from_user_io_vecs(
ctx: &'a Context<'a>, user_space: &'a CurrentUserSpace<'a>,
start_addr: Vaddr, start_addr: Vaddr,
count: usize, count: usize,
) -> Result<Self> { ) -> Result<Self> {
let readers = copy_iovs_and_convert(ctx, start_addr, count, IoVec::reader)?; let readers = copy_iovs_and_convert(user_space, start_addr, count, IoVec::reader)?;
Ok(Self(readers)) Ok(Self(readers))
} }
@ -113,11 +113,11 @@ impl<'a> VmReaderArray<'a> {
impl<'a> VmWriterArray<'a> { impl<'a> VmWriterArray<'a> {
/// Creates a new `IoVecWriter` from user-provided io vec buffer. /// Creates a new `IoVecWriter` from user-provided io vec buffer.
pub fn from_user_io_vecs( pub fn from_user_io_vecs(
ctx: &'a Context<'a>, user_space: &'a CurrentUserSpace<'a>,
start_addr: Vaddr, start_addr: Vaddr,
count: usize, count: usize,
) -> Result<Self> { ) -> Result<Self> {
let writers = copy_iovs_and_convert(ctx, start_addr, count, IoVec::writer)?; let writers = copy_iovs_and_convert(user_space, start_addr, count, IoVec::writer)?;
Ok(Self(writers)) Ok(Self(writers))
} }

View File

@ -112,11 +112,17 @@ impl CUserMsgHdr {
Ok(()) Ok(())
} }
pub fn copy_reader_array_from_user<'a>(&self, ctx: &'a Context) -> Result<VmReaderArray<'a>> { pub fn copy_reader_array_from_user<'a>(
VmReaderArray::from_user_io_vecs(ctx, self.msg_iov, self.msg_iovlen as usize) &self,
user_space: &'a CurrentUserSpace<'a>,
) -> Result<VmReaderArray<'a>> {
VmReaderArray::from_user_io_vecs(user_space, self.msg_iov, self.msg_iovlen as usize)
} }
pub fn copy_writer_array_from_user<'a>(&self, ctx: &'a Context) -> Result<VmWriterArray<'a>> { pub fn copy_writer_array_from_user<'a>(
VmWriterArray::from_user_io_vecs(ctx, self.msg_iov, self.msg_iovlen as usize) &self,
user_space: &'a CurrentUserSpace<'a>,
) -> Result<VmWriterArray<'a>> {
VmWriterArray::from_user_io_vecs(user_space, self.msg_iov, self.msg_iovlen as usize)
} }
} }