Skip to content

Commit aeb9cd9

Browse files
committed
fix(x86_64/paging): use identity-mapped page tables
1 parent 630f1fe commit aeb9cd9

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/arch/x86_64/paging.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use core::fmt::Debug;
2+
use core::ptr;
23

34
use log::warn;
5+
use x86_64::registers::control::Cr3;
46
use x86_64::structures::paging::mapper::CleanUp;
57
use x86_64::structures::paging::{
6-
Mapper, Page, PageSize, PageTableFlags, PhysFrame, RecursivePageTable,
8+
Mapper, OffsetPageTable, Page, PageSize, PageTable, PageTableFlags, PhysFrame,
79
};
810

911
use super::physicalmem::PhysAlloc;
1012

1113
pub fn map<S>(virtual_address: usize, physical_address: usize, count: usize, flags: PageTableFlags)
1214
where
1315
S: PageSize + Debug,
14-
RecursivePageTable<'static>: Mapper<S>,
16+
for<'a> OffsetPageTable<'a>: Mapper<S>,
1517
{
1618
let pages = {
1719
let start = Page::<S>::containing_address(x86_64::VirtAddr::new(virtual_address as u64));
@@ -37,7 +39,7 @@ where
3739
);
3840

3941
let flags = flags | PageTableFlags::PRESENT;
40-
let mut table = unsafe { recursive_page_table() };
42+
let mut table = unsafe { identity_mapped_page_table() };
4143

4244
for (page, frame) in pages.zip(frames) {
4345
unsafe {
@@ -57,7 +59,7 @@ pub fn map_range<S>(
5759
mut flags: PageTableFlags,
5860
) where
5961
S: PageSize + Debug,
60-
RecursivePageTable<'static>: Mapper<S>,
62+
for<'a> OffsetPageTable<'a>: Mapper<S>,
6163
{
6264
let first_page = Page::<S>::containing_address(x86_64::VirtAddr::new(virtual_start as u64));
6365
let first_frame = PhysFrame::containing_address(x86_64::PhysAddr::new(phys_start as u64));
@@ -70,7 +72,7 @@ pub fn map_range<S>(
7072
to_end = last_frame.start_address()
7173
);
7274
flags |= PageTableFlags::PRESENT;
73-
let mut table = unsafe { recursive_page_table() };
75+
let mut table = unsafe { identity_mapped_page_table() };
7476
let page_range = core::iter::successors(Some(first_page), |page| Some(*page + 1u64));
7577
let frame_range = PhysFrame::<S>::range(first_frame, last_frame);
7678
for (page, frame) in core::iter::zip(page_range, frame_range) {
@@ -84,16 +86,17 @@ pub fn map_range<S>(
8486
}
8587

8688
pub fn clean_up() {
87-
let mut table = unsafe { recursive_page_table() };
89+
let mut table = unsafe { identity_mapped_page_table() };
8890

8991
unsafe { table.clean_up(&mut PhysAlloc) }
9092
}
9193

92-
unsafe fn recursive_page_table() -> RecursivePageTable<'static> {
93-
let level_4_table_addr = 0xFFFF_FFFF_FFFF_F000_usize;
94-
let level_4_table_ptr = sptr::from_exposed_addr_mut(level_4_table_addr);
94+
pub unsafe fn identity_mapped_page_table() -> OffsetPageTable<'static> {
95+
let level_4_table_addr = Cr3::read().0.start_address().as_u64();
96+
let level_4_table_ptr =
97+
ptr::with_exposed_provenance_mut::<PageTable>(level_4_table_addr.try_into().unwrap());
9598
unsafe {
96-
let level_4_table = &mut *(level_4_table_ptr);
97-
RecursivePageTable::new(level_4_table).unwrap()
99+
let level_4_table = level_4_table_ptr.as_mut().unwrap();
100+
OffsetPageTable::new(level_4_table, x86_64::addr::VirtAddr::new(0x0))
98101
}
99102
}

0 commit comments

Comments
 (0)