feat: arch: riscv: vspace: map_range: pass alloc_page as closure

This commit is contained in:
Paul Pan 2024-06-15 17:46:02 +08:00
parent eb70cd7b73
commit fe30d8d28c
2 changed files with 12 additions and 4 deletions

View File

@ -115,7 +115,7 @@ pub unsafe fn setup_kernel_paging() {
let start = concat_idents!($section, _START).as_virt_addr().align_down(PAGE_SIZE);
let end = concat_idents!($section, _END).as_virt_addr().align_up(PAGE_SIZE);
debug!("Mapping section {}:\t[{:?}, {:?}]", stringify!($section), start, end);
map_range(&mut kernel_pt, start, kernel_virt_to_phys(start), (end - start).as_usize(), $attr);
map_range(alloc_page, &mut kernel_pt, start, kernel_virt_to_phys(start), (end - start).as_usize(), $attr);
)+
};
}
@ -130,6 +130,7 @@ pub unsafe fn setup_kernel_paging() {
// map 4 GiB physical memory
// TODO: walk fdt to get all memory region? put it in driver init
map_range(
alloc_page,
&mut kernel_pt,
mmap_phys_to_virt(PhysAddr(0)),
PhysAddr(0),
@ -163,7 +164,7 @@ pub fn is_kernel_pagetable_allocated() -> bool {
unsafe fn map_kernel(from: VirtAddr, to: PhysAddr, size: usize, attr: MapAttr) {
let mut guard = KERNEL_PAGETABLE.lock();
let pt = guard.as_mut().unwrap();
map_range(pt, from, to, size, attr);
map_range(alloc_page, pt, from, to, size, attr);
}
pub fn copy_kernel_pagetable(root: &CapEntry) {

View File

@ -28,7 +28,14 @@ pub fn alloc_page() -> PhysAddr {
addr
}
pub fn map_range(pt: &mut Table<Level0>, from: VirtAddr, to: PhysAddr, size: usize, attr: MapAttr) {
pub fn map_range(
mut alloc: impl FnMut() -> PhysAddr,
pt: &mut Table<Level0>,
from: VirtAddr,
to: PhysAddr,
size: usize,
attr: MapAttr,
) {
let mut virt_start = from;
let mut phys_start = to;
let virt_end = from + size;
@ -56,7 +63,7 @@ pub fn map_range(pt: &mut Table<Level0>, from: VirtAddr, to: PhysAddr, size: usi
unsafe {
Table::<$level>::new(mmap_phys_to_virt(
$pt.lookup_mut($addr).map(|e| e.paddr()).unwrap_or_else(|| {
let page = alloc_page();
let page = alloc();
let addr = $addr.align_down(<$level as TableLevel>::PREVIOUS::LEVEL_SIZE);
debug!("Creating new pagetable:\t{:?} -> {:?}", addr, page);
$pt.map(addr, page, MapAttr::PAGE_TABLE).unwrap();