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 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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?
|
||||||
|
Loading…
Reference in New Issue
Block a user