feat: riscv: vspace: implement copy_kernel_pagetable and drop KERNEL_PAGETABLE_SIZE

This commit is contained in:
Paul Pan 2024-06-14 21:15:08 +08:00
parent 97392a5788
commit ad4da2a7e4
2 changed files with 25 additions and 15 deletions

View File

@ -1,5 +1,5 @@
use super::{alloc_page, install_pagetable, map_range, RAM_ALLOCATOR}; 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 log::{debug, info, trace};
use spin::Mutex; use spin::Mutex;
use utils::{addr::*, size::*}; use utils::{addr::*, size::*};
@ -10,8 +10,6 @@ use super::ALLOC_COUNT;
#[thread_local] #[thread_local]
static KERNEL_PAGETABLE: Mutex<Option<Table<Level0>>> = Mutex::new(None); static KERNEL_PAGETABLE: Mutex<Option<Table<Level0>>> = Mutex::new(None);
pub const KERNEL_PAGETABLE_SIZE: usize = 3;
pub unsafe fn setup_memory(fdt_addr: usize) { pub unsafe fn setup_memory(fdt_addr: usize) {
info!("Setting up memory"); info!("Setting up memory");
let fdt = unsafe { fdt::Fdt::from_ptr(fdt_addr as *const u8).unwrap() }; 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() { 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); let count = ALLOC_COUNT.load(core::sync::atomic::Ordering::Acquire);
trace!("Kernel page table size: {:?}", count); trace!("Kernel page table size: {:?}", count);
assert!(KERNEL_PAGETABLE_SIZE == count, "Kernel page table size mismatch");
} }
*KERNEL_PAGETABLE.lock() = Some(kernel_pt); *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(); let pt = guard.as_mut().unwrap();
map_range(pt, from, to, size, attr); 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<Level0> = 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());
}
}

View File

@ -1,5 +1,5 @@
use crate::arch::layout::{mmap_phys_to_virt, mmap_virt_to_phys, PAGE_SIZE}; 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::objects::*;
use crate::vspace::*; use crate::vspace::*;
use core::ops::Range; 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"); panic!("init: untyped memory is exhausted");
} }
let mut free_idx = end_idx; let free_idx = end_idx;
// tcb // tcb
{ {
@ -204,14 +204,9 @@ fn create_objects(cnode_obj: &mut CNodeObject, end_idx: usize) -> usize {
let vspace_idx = CNodeSlot::VSpaceCap as usize; let vspace_idx = CNodeSlot::VSpaceCap as usize;
alloc::<TableObject>(cnode_obj, end_idx, pagetable_bits, vspace_idx..vspace_idx + 1); alloc::<TableObject>(cnode_obj, end_idx, pagetable_bits, vspace_idx..vspace_idx + 1);
if KERNEL_PAGETABLE_SIZE > 1 { // copy pagetable
// remaining pagetables let root = &cnode_obj[vspace_idx];
let range = free_idx..(free_idx + KERNEL_PAGETABLE_SIZE - 1); copy_kernel_pagetable(root);
alloc::<TableObject>(cnode_obj, end_idx, pagetable_bits, range);
free_idx += KERNEL_PAGETABLE_SIZE - 1;
}
todo!("copy pagetables");
} }
// bootinfo? // bootinfo?