mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
feat: riscv: vspace: implement copy_kernel_pagetable
and drop KERNEL_PAGETABLE_SIZE
This commit is contained in:
parent
97392a5788
commit
ad4da2a7e4
@ -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<Option<Table<Level0>>> = 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<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());
|
||||
}
|
||||
}
|
||||
|
@ -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::<TableObject>(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::<TableObject>(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?
|
||||
|
Loading…
Reference in New Issue
Block a user