Skip to content

Commit 6f97714

Browse files
authored
Merge pull request #422 from rust-osdev/v0.9-fixes
[v0.9] Fix map errors during kernel loading
2 parents 9a915f1 + 9209b0c commit 6f97714

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

Changelog.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Unreleased
22

3+
4+
- [Fix map errors during kernel loading](https://github.com/rust-osdev/bootloader/pull/422)
5+
- Don't error if a kernel page is already mapped to the correct frame
6+
- Fix: unmap temp page again to enable multiple bss-like sections
7+
38
# 0.9.25 – 2024-02-16
49

510
- [Fix data layout for custom targets for LLVM 18](https://github.com/rust-osdev/bootloader/pull/421)

src/page_table.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,15 @@ pub(crate) fn map_segment(
9696
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
9797
let offset = frame - start_frame;
9898
let page = start_page + offset;
99-
unsafe { map_page(page, frame, page_table_flags, page_table, frame_allocator)? }
100-
.flush();
99+
match unsafe {
100+
map_page(page, frame, page_table_flags, page_table, frame_allocator)
101+
} {
102+
Ok(flusher) => flusher.flush(),
103+
Err(MapToError::PageAlreadyMapped(to)) if to == frame => {
104+
// nothing to do, page is already mapped to the correct frame
105+
}
106+
Err(err) => return Err(err),
107+
}
101108
}
102109

103110
if mem_size > file_size {
@@ -117,7 +124,7 @@ pub(crate) fn map_segment(
117124
unsafe {
118125
map_page(
119126
temp_page.clone(),
120-
new_frame.clone(),
127+
new_frame,
121128
page_table_flags,
122129
page_table,
123130
frame_allocator,
@@ -145,6 +152,11 @@ pub(crate) fn map_segment(
145152
});
146153
}
147154

155+
// unmap temp page again
156+
let (new_frame, flusher) = page_table.unmap(temp_page).unwrap();
157+
flusher.flush();
158+
159+
// map last page to new frame
148160
unsafe {
149161
map_page(
150162
last_page,

0 commit comments

Comments
 (0)