mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-27 03:13:23 +00:00
Remove the VmIO
implementation of VmSpace
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
141fbeaf0c
commit
39aa31a69d
@ -2,13 +2,11 @@
|
|||||||
|
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
|
|
||||||
use align_ext::AlignExt;
|
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
is_page_aligned,
|
is_page_aligned,
|
||||||
kspace::KERNEL_PAGE_TABLE,
|
kspace::KERNEL_PAGE_TABLE,
|
||||||
page_table::{PageTable, PageTableMode, UserMode},
|
page_table::{PageTable, PageTableMode, UserMode},
|
||||||
CachePolicy, PageFlags, PageProperty, PagingConstsTrait, PrivilegedPageFlags, VmFrameVec, VmIo,
|
CachePolicy, PageFlags, PageProperty, PagingConstsTrait, PrivilegedPageFlags, VmFrameVec,
|
||||||
PAGE_SIZE,
|
PAGE_SIZE,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -216,42 +214,6 @@ impl Default for VmSpace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VmIo for VmSpace {
|
|
||||||
fn read_bytes(&self, vaddr: usize, buf: &mut [u8]) -> Result<()> {
|
|
||||||
let range_end = vaddr.checked_add(buf.len()).ok_or(Error::Overflow)?;
|
|
||||||
let vaddr = vaddr.align_down(PAGE_SIZE);
|
|
||||||
let range_end = range_end.align_up(PAGE_SIZE);
|
|
||||||
for qr in self.query_range(&(vaddr..range_end))? {
|
|
||||||
if matches!(qr, VmQueryResult::NotMapped { .. }) {
|
|
||||||
return Err(Error::AccessDenied);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.activate();
|
|
||||||
buf.clone_from_slice(unsafe { core::slice::from_raw_parts(vaddr as *const u8, buf.len()) });
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_bytes(&self, vaddr: usize, buf: &[u8]) -> Result<()> {
|
|
||||||
let range_end = vaddr.checked_add(buf.len()).ok_or(Error::Overflow)?;
|
|
||||||
let vaddr = vaddr.align_down(PAGE_SIZE);
|
|
||||||
let range_end = range_end.align_up(PAGE_SIZE);
|
|
||||||
for qr in self.query_range(&(vaddr..vaddr + range_end))? {
|
|
||||||
match qr {
|
|
||||||
VmQueryResult::NotMapped { .. } => return Err(Error::AccessDenied),
|
|
||||||
VmQueryResult::Mapped { prop, .. } => {
|
|
||||||
if !prop.flags.contains(PageFlags::W) {
|
|
||||||
return Err(Error::AccessDenied);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.activate();
|
|
||||||
unsafe { core::slice::from_raw_parts_mut(vaddr as *mut u8, buf.len()) }
|
|
||||||
.clone_from_slice(buf);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Options for mapping physical memory pages into a VM address space.
|
/// Options for mapping physical memory pages into a VM address space.
|
||||||
/// See `VmSpace::map`.
|
/// See `VmSpace::map`.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use aster_frame::{cpu::*, vm::VmIo};
|
use aster_frame::cpu::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
prelude::*, process::signal::signals::fault::FaultSignal,
|
prelude::*, process::signal::signals::fault::FaultSignal,
|
||||||
@ -45,11 +45,6 @@ fn handle_page_fault(trap_info: &CpuExceptionInfo) {
|
|||||||
page_fault_addr, e
|
page_fault_addr, e
|
||||||
);
|
);
|
||||||
generate_fault_signal(trap_info);
|
generate_fault_signal(trap_info);
|
||||||
} else {
|
|
||||||
// ensure page fault is successfully handled
|
|
||||||
// FIXME: this check can be removed
|
|
||||||
let vm_space = root_vmar.vm_space();
|
|
||||||
let _: u8 = vm_space.read_val(page_fault_addr).unwrap();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, the page fault cannot be handled
|
// Otherwise, the page fault cannot be handled
|
||||||
|
Reference in New Issue
Block a user