feat: vspace: table: add paddr()

This commit is contained in:
Paul Pan 2024-06-15 19:17:39 +08:00
parent 3e13d1ce52
commit 00b7c7d7df
3 changed files with 10 additions and 4 deletions

View File

@ -150,9 +150,7 @@ pub unsafe fn setup_kernel_paging() {
pub unsafe fn install_kernel_pagetable() { pub unsafe fn install_kernel_pagetable() {
info!("Setting up new kernel pagetable"); info!("Setting up new kernel pagetable");
let vaddr = KERNEL_PAGETABLE.lock().as_ref().expect("No kernel pagetable found").vaddr(); let paddr = KERNEL_PAGETABLE.lock().as_ref().expect("No kernel pagetable found").paddr();
let paddr = mmap_virt_to_phys(vaddr);
install_pagetable(paddr) install_pagetable(paddr)
} }

View File

@ -1,4 +1,7 @@
use crate::{arch::layout::PAGE_SIZE, vspace::*}; use crate::{
arch::layout::{mmap_virt_to_phys, PAGE_SIZE},
vspace::*,
};
use utils::addr::*; use utils::addr::*;
impl<'a, T: TableLevel> TableOps<'a, T> for Table<'a, T> { impl<'a, T: TableLevel> TableOps<'a, T> for Table<'a, T> {
@ -15,6 +18,10 @@ impl<'a, T: TableLevel> TableOps<'a, T> for Table<'a, T> {
VirtAddr::from(self.entries.as_ptr()) VirtAddr::from(self.entries.as_ptr())
} }
fn paddr(&self) -> PhysAddr {
unsafe { mmap_virt_to_phys(self.vaddr()) }
}
fn map(&mut self, from: VirtAddr, to: PhysAddr, attr: MapAttr) -> PageResult { fn map(&mut self, from: VirtAddr, to: PhysAddr, attr: MapAttr) -> PageResult {
if !from.is_aligned(T::LEVEL_SIZE) || !to.is_aligned(PAGE_SIZE) { if !from.is_aligned(T::LEVEL_SIZE) || !to.is_aligned(PAGE_SIZE) {
return Err(PageError::NotAligned); return Err(PageError::NotAligned);

View File

@ -6,6 +6,7 @@ pub trait TableOps<'a, T: TableLevel> {
/// `location` must be a page-aligned virtual address and will not be dropped. /// `location` must be a page-aligned virtual address and will not be dropped.
unsafe fn new(location: VirtAddr) -> Self; unsafe fn new(location: VirtAddr) -> Self;
fn vaddr(&self) -> VirtAddr; fn vaddr(&self) -> VirtAddr;
fn paddr(&self) -> PhysAddr;
// following methods only works at current level // following methods only works at current level