diff --git a/kernel/src/arch/riscv/vspace/kmem.rs b/kernel/src/arch/riscv/vspace/kmem.rs index 496538d..de19125 100644 --- a/kernel/src/arch/riscv/vspace/kmem.rs +++ b/kernel/src/arch/riscv/vspace/kmem.rs @@ -150,9 +150,7 @@ pub unsafe fn setup_kernel_paging() { pub unsafe fn install_kernel_pagetable() { info!("Setting up new kernel pagetable"); - let vaddr = KERNEL_PAGETABLE.lock().as_ref().expect("No kernel pagetable found").vaddr(); - let paddr = mmap_virt_to_phys(vaddr); - + let paddr = KERNEL_PAGETABLE.lock().as_ref().expect("No kernel pagetable found").paddr(); install_pagetable(paddr) } diff --git a/kernel/src/arch/riscv/vspace/table.rs b/kernel/src/arch/riscv/vspace/table.rs index 19ea09d..fad9457 100644 --- a/kernel/src/arch/riscv/vspace/table.rs +++ b/kernel/src/arch/riscv/vspace/table.rs @@ -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::*; 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()) } + fn paddr(&self) -> PhysAddr { + unsafe { mmap_virt_to_phys(self.vaddr()) } + } + fn map(&mut self, from: VirtAddr, to: PhysAddr, attr: MapAttr) -> PageResult { if !from.is_aligned(T::LEVEL_SIZE) || !to.is_aligned(PAGE_SIZE) { return Err(PageError::NotAligned); diff --git a/kernel/src/vspace/table.rs b/kernel/src/vspace/table.rs index 0832e7f..e002a14 100644 --- a/kernel/src/vspace/table.rs +++ b/kernel/src/vspace/table.rs @@ -6,6 +6,7 @@ pub trait TableOps<'a, T: TableLevel> { /// `location` must be a page-aligned virtual address and will not be dropped. unsafe fn new(location: VirtAddr) -> Self; fn vaddr(&self) -> VirtAddr; + fn paddr(&self) -> PhysAddr; // following methods only works at current level