From ad4da2a7e4edd257c88ea163949e65540e395772 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 14 Jun 2024 21:15:08 +0800 Subject: [PATCH] feat: riscv: vspace: implement `copy_kernel_pagetable` and drop `KERNEL_PAGETABLE_SIZE` --- kernel/src/arch/riscv/vspace/kmem.rs | 25 ++++++++++++++++++++----- kernel/src/root.rs | 15 +++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/kernel/src/arch/riscv/vspace/kmem.rs b/kernel/src/arch/riscv/vspace/kmem.rs index e9d3a9f..27a8856 100644 --- a/kernel/src/arch/riscv/vspace/kmem.rs +++ b/kernel/src/arch/riscv/vspace/kmem.rs @@ -1,5 +1,5 @@ use super::{alloc_page, install_pagetable, map_range, RAM_ALLOCATOR}; -use crate::{arch::layout::*, vspace::*}; +use crate::{arch::layout::*, objects::*, vspace::*}; use log::{debug, info, trace}; use spin::Mutex; use utils::{addr::*, size::*}; @@ -10,8 +10,6 @@ use super::ALLOC_COUNT; #[thread_local] static KERNEL_PAGETABLE: Mutex>> = Mutex::new(None); -pub const KERNEL_PAGETABLE_SIZE: usize = 3; - pub unsafe fn setup_memory(fdt_addr: usize) { info!("Setting up memory"); let fdt = unsafe { fdt::Fdt::from_ptr(fdt_addr as *const u8).unwrap() }; @@ -101,7 +99,7 @@ pub unsafe fn setup_memory(fdt_addr: usize) { } } - trace!("Memory setup complete, memory info:\n{:#x?}", mem); + trace!("Memory setup complete, memory info:\n{:X?}", mem); } pub unsafe fn setup_kernel_paging() { @@ -143,7 +141,6 @@ pub unsafe fn setup_kernel_paging() { { let count = ALLOC_COUNT.load(core::sync::atomic::Ordering::Acquire); trace!("Kernel page table size: {:?}", count); - assert!(KERNEL_PAGETABLE_SIZE == count, "Kernel page table size mismatch"); } *KERNEL_PAGETABLE.lock() = Some(kernel_pt); @@ -168,3 +165,21 @@ unsafe fn map_kernel(from: VirtAddr, to: PhysAddr, size: usize, attr: MapAttr) { let pt = guard.as_mut().unwrap(); map_range(pt, from, to, size, attr); } + +pub fn copy_kernel_pagetable(root: &CapEntry) { + let kernel_pt = KERNEL_PAGETABLE.lock(); + let from = kernel_pt.as_ref().expect("No kernel pagetable found"); + + let mut root = TableCap::try_from(root).expect("Invalid vspace cap"); + let to: Table = root.as_object_mut(); + + for (i, (from, to)) in from.entries.iter().zip(to.entries.iter_mut()).enumerate() { + if !from.is_valid() { + to.clear(); + continue; + } + + to.set_attr(from.attr()); + to.set_paddr(from.paddr()); + } +} diff --git a/kernel/src/root.rs b/kernel/src/root.rs index 1a5795b..279d52e 100644 --- a/kernel/src/root.rs +++ b/kernel/src/root.rs @@ -1,5 +1,5 @@ use crate::arch::layout::{mmap_phys_to_virt, mmap_virt_to_phys, PAGE_SIZE}; -use crate::arch::vspace::{KERNEL_PAGETABLE_SIZE, RAM_ALLOCATOR}; +use crate::arch::vspace::{copy_kernel_pagetable, RAM_ALLOCATOR}; use crate::objects::*; use crate::vspace::*; use core::ops::Range; @@ -186,7 +186,7 @@ fn create_objects(cnode_obj: &mut CNodeObject, end_idx: usize) -> usize { panic!("init: untyped memory is exhausted"); } - let mut free_idx = end_idx; + let free_idx = end_idx; // tcb { @@ -204,14 +204,9 @@ fn create_objects(cnode_obj: &mut CNodeObject, end_idx: usize) -> usize { let vspace_idx = CNodeSlot::VSpaceCap as usize; alloc::(cnode_obj, end_idx, pagetable_bits, vspace_idx..vspace_idx + 1); - if KERNEL_PAGETABLE_SIZE > 1 { - // remaining pagetables - let range = free_idx..(free_idx + KERNEL_PAGETABLE_SIZE - 1); - alloc::(cnode_obj, end_idx, pagetable_bits, range); - free_idx += KERNEL_PAGETABLE_SIZE - 1; - } - - todo!("copy pagetables"); + // copy pagetable + let root = &cnode_obj[vspace_idx]; + copy_kernel_pagetable(root); } // bootinfo?