feat: riscv: vspace: always use virtual address with page table

This commit is contained in:
Paul Pan 2024-06-14 21:13:11 +08:00
parent 8824345b17
commit 97392a5788
2 changed files with 6 additions and 8 deletions

View File

@ -109,7 +109,7 @@ pub unsafe fn setup_kernel_paging() {
assert!(!is_kernel_pagetable_allocated(), "Kernel pagetable already allocated"); assert!(!is_kernel_pagetable_allocated(), "Kernel pagetable already allocated");
let root_pt = alloc_page(); let root_pt = alloc_page();
let mut kernel_pt = Table::<Level0>::new(root_pt.as_usize().into()); let mut kernel_pt = Table::<Level0>::new(mmap_phys_to_virt(root_pt));
macro_rules! map_section { macro_rules! map_section {
(($($section:ident),+),$attr:expr) => { (($($section:ident),+),$attr:expr) => {
@ -152,10 +152,10 @@ 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 kernel_pt = KERNEL_PAGETABLE.lock(); let vaddr = KERNEL_PAGETABLE.lock().as_ref().expect("No kernel pagetable found").vaddr();
let kernel_pt = kernel_pt.as_ref().expect("No kernel pagetable found"); let paddr = mmap_virt_to_phys(vaddr);
install_pagetable(kernel_pt) install_pagetable(paddr)
} }
#[inline] #[inline]

View File

@ -89,9 +89,7 @@ fn page_table_mode() -> riscv::register::satp::Mode {
return riscv::register::satp::Mode::Sv57; return riscv::register::satp::Mode::Sv57;
} }
pub unsafe fn install_pagetable(pt: &Table<Level0>) { pub unsafe fn install_pagetable(addr: PhysAddr) {
let root_pt = PhysAddr::from(pt.entries.as_ptr()); riscv::register::satp::set(page_table_mode(), 0, addr.extract_ppn());
riscv::register::satp::set(page_table_mode(), 0, root_pt.extract_ppn());
riscv::asm::sfence_vma_all(); riscv::asm::sfence_vma_all();
} }