Skip to content

Commit 88fe827

Browse files
committed
fix(x86_64/paging): don't panic when already mapped
1 parent d9730d6 commit 88fe827

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

src/arch/x86_64/paging.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use core::fmt::Debug;
22
use core::ptr;
33

44
use log::warn;
5-
use x86_64::structures::paging::mapper::CleanUp;
5+
use x86_64::structures::paging::mapper::{CleanUp, MapToError};
66
use x86_64::structures::paging::{
7-
Mapper, Page, PageSize, PageTableFlags, PhysFrame, RecursivePageTable,
7+
Mapper, Page, PageSize, PageTableFlags, PhysFrame, RecursivePageTable, Translate,
88
};
99

1010
use super::physicalmem::PhysAlloc;
@@ -41,11 +41,16 @@ where
4141
let mut table = unsafe { recursive_page_table() };
4242

4343
for (page, frame) in pages.zip(frames) {
44-
unsafe {
45-
table
46-
.map_to(page, frame, flags, &mut PhysAlloc)
47-
.unwrap()
48-
.flush();
44+
let mapper_result = unsafe { table.map_to(page, frame, flags, &mut PhysAlloc) };
45+
match mapper_result {
46+
Ok(mapper_flush) => mapper_flush.flush(),
47+
Err(MapToError::PageAlreadyMapped(current_frame)) => assert_eq!(current_frame, frame),
48+
Err(MapToError::ParentEntryHugePage) => {
49+
let current_addr = table.translate_addr(page.start_address()).unwrap();
50+
let expected_addr = frame.start_address();
51+
assert_eq!(current_addr, expected_addr);
52+
}
53+
Err(err) => panic!("could not map {frame:?}: {err:?}"),
4954
}
5055
}
5156
}
@@ -75,11 +80,16 @@ pub fn map_range<S>(
7580
let page_range = core::iter::successors(Some(first_page), |page| Some(*page + 1u64));
7681
let frame_range = PhysFrame::<S>::range(first_frame, last_frame);
7782
for (page, frame) in core::iter::zip(page_range, frame_range) {
78-
unsafe {
79-
table
80-
.map_to(page, frame, flags, &mut PhysAlloc)
81-
.unwrap()
82-
.flush();
83+
let mapper_result = unsafe { table.map_to(page, frame, flags, &mut PhysAlloc) };
84+
match mapper_result {
85+
Ok(mapper_flush) => mapper_flush.flush(),
86+
Err(MapToError::PageAlreadyMapped(current_frame)) => assert_eq!(current_frame, frame),
87+
Err(MapToError::ParentEntryHugePage) => {
88+
let current_addr = table.translate_addr(page.start_address()).unwrap();
89+
let expected_addr = frame.start_address();
90+
assert_eq!(current_addr, expected_addr);
91+
}
92+
Err(err) => panic!("could not map {frame:?}: {err:?}"),
8393
}
8494
}
8595
}

0 commit comments

Comments
 (0)