Skip to content

Commit 52274b7

Browse files
committed
refactor(x86_64/mm): move create_new_root_page_table to paging module
1 parent 7f886d4 commit 52274b7

File tree

3 files changed

+49
-50
lines changed

3 files changed

+49
-50
lines changed

src/arch/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ cfg_if::cfg_if! {
4848
};
4949
pub use self::x86_64::mm::paging::{BasePageSize, PageSize};
5050
#[cfg(feature = "common-os")]
51-
pub use self::x86_64::mm::create_new_root_page_table;
51+
pub use self::x86_64::mm::paging::create_new_root_page_table;
5252
#[cfg(feature = "common-os")]
5353
pub use self::x86_64::kernel::{load_application, jump_to_user_land};
5454
} else if #[cfg(target_arch = "riscv64")] {

src/arch/x86_64/mm/mod.rs

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,6 @@ use memory_addresses::arch::x86_64::{PhysAddr, VirtAddr};
44

55
use crate::mm::{FrameAlloc, PageAlloc, PageRangeAllocator};
66

7-
#[cfg(feature = "common-os")]
8-
pub fn create_new_root_page_table() -> usize {
9-
use free_list::PageLayout;
10-
use x86_64::registers::control::Cr3;
11-
use x86_64::structures::paging::{PageSize, Size4KiB as BasePageSize};
12-
13-
use crate::arch::mm::paging::{PageTableEntryFlags, PageTableEntryFlagsExt};
14-
use crate::mm::{FrameAlloc, PageBox, PageRangeAllocator};
15-
16-
let layout = PageLayout::from_size(BasePageSize::SIZE as usize).unwrap();
17-
let frame_range = FrameAlloc::allocate(layout).unwrap();
18-
let physaddr = PhysAddr::from(frame_range.start());
19-
20-
let layout = PageLayout::from_size(2 * BasePageSize::SIZE as usize).unwrap();
21-
let page_range = PageBox::new(layout).unwrap();
22-
let virtaddr = VirtAddr::from(page_range.start());
23-
let mut flags = PageTableEntryFlags::empty();
24-
flags.normal().writable();
25-
26-
let entry: u64 = unsafe {
27-
let (frame, _flags) = Cr3::read();
28-
paging::map::<BasePageSize>(virtaddr, frame.start_address().into(), 1, flags);
29-
let entry: &u64 = &*virtaddr.as_ptr();
30-
31-
*entry
32-
};
33-
34-
let slice_addr = virtaddr + BasePageSize::SIZE;
35-
paging::map::<BasePageSize>(slice_addr, physaddr, 1, flags);
36-
37-
unsafe {
38-
let pml4 = core::slice::from_raw_parts_mut(slice_addr.as_mut_ptr(), 512);
39-
40-
// clear PML4
41-
for elem in pml4.iter_mut() {
42-
*elem = 0;
43-
}
44-
45-
// copy first element and the self reference
46-
pml4[0] = entry;
47-
// create self reference
48-
pml4[511] = physaddr.as_u64() + 0x3; // PG_PRESENT | PG_RW
49-
};
50-
51-
paging::unmap::<BasePageSize>(virtaddr, 2);
52-
53-
physaddr.as_usize()
54-
}
55-
567
pub unsafe fn init() {
578
paging::init();
589
unsafe {

src/arch/x86_64/mm/paging.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,54 @@ fn make_p4_writable() {
367367
unsafe { without_protect(make_writable) }
368368
}
369369

370+
#[cfg(feature = "common-os")]
371+
pub fn create_new_root_page_table() -> usize {
372+
use free_list::PageLayout;
373+
use x86_64::registers::control::Cr3;
374+
use x86_64::structures::paging::{PageSize, Size4KiB as BasePageSize};
375+
376+
use crate::mm::{FrameAlloc, PageBox, PageRangeAllocator};
377+
378+
let layout = PageLayout::from_size(BasePageSize::SIZE as usize).unwrap();
379+
let frame_range = FrameAlloc::allocate(layout).unwrap();
380+
let physaddr = PhysAddr::from(frame_range.start());
381+
382+
let layout = PageLayout::from_size(2 * BasePageSize::SIZE as usize).unwrap();
383+
let page_range = PageBox::new(layout).unwrap();
384+
let virtaddr = VirtAddr::from(page_range.start());
385+
let mut flags = PageTableEntryFlags::empty();
386+
flags.normal().writable();
387+
388+
let entry: u64 = unsafe {
389+
let (frame, _flags) = Cr3::read();
390+
map::<BasePageSize>(virtaddr, frame.start_address().into(), 1, flags);
391+
let entry: &u64 = &*virtaddr.as_ptr();
392+
393+
*entry
394+
};
395+
396+
let slice_addr = virtaddr + BasePageSize::SIZE;
397+
map::<BasePageSize>(slice_addr, physaddr, 1, flags);
398+
399+
unsafe {
400+
let pml4 = core::slice::from_raw_parts_mut(slice_addr.as_mut_ptr(), 512);
401+
402+
// clear PML4
403+
for elem in pml4.iter_mut() {
404+
*elem = 0;
405+
}
406+
407+
// copy first element and the self reference
408+
pml4[0] = entry;
409+
// create self reference
410+
pml4[511] = physaddr.as_u64() + 0x3; // PG_PRESENT | PG_RW
411+
};
412+
413+
unmap::<BasePageSize>(virtaddr, 2);
414+
415+
physaddr.as_usize()
416+
}
417+
370418
pub unsafe fn log_page_tables() {
371419
use log::Level;
372420

0 commit comments

Comments
 (0)