Skip to content

Commit 419bbdf

Browse files
authored
Merge pull request #424 from rust-osdev/v0.9-fixes
Fix invalid mapping to zero page caused by off-by-one bug
2 parents 3531dfb + 14e926e commit 419bbdf

File tree

2 files changed

+10
-23
lines changed

2 files changed

+10
-23
lines changed

Changelog.md

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

3-
- [Fix: unify flags if multiple segments are mapped to same frame with different flags](https://github.com/rust-osdev/bootloader/pull/423)
3+
- [Fix invalid mapping to zero page caused by off-by-one bug](https://github.com/rust-osdev/bootloader/pull/424)
44

55
# 0.9.26 – 2024-02-16
66

src/page_table.rs

+9-22
Original file line numberDiff line numberDiff line change
@@ -97,27 +97,14 @@ pub(crate) fn map_segment(
9797
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
9898
let offset = frame - start_frame;
9999
let page = start_page + offset;
100-
match unsafe {
101-
map_page(page, frame, page_table_flags, page_table, frame_allocator)
102-
} {
103-
Ok(flusher) => flusher.flush(),
104-
Err(MapToError::PageAlreadyMapped(to)) if to == frame => {
105-
let flags = match page_table.translate(page.start_address()) {
106-
TranslateResult::Mapped { flags, .. } => flags,
107-
_ => unreachable!(),
108-
};
109-
if flags != page_table_flags {
110-
unsafe {
111-
page_table
112-
.update_flags(page, flags | page_table_flags)
113-
.unwrap()
114-
.flush()
115-
};
116-
}
117-
// nothing to do, page is already mapped to the correct frame
118-
}
119-
Err(err) => return Err(err),
120-
}
100+
unsafe { map_page(page, frame, page_table_flags, page_table, frame_allocator) }
101+
.unwrap_or_else(|err| {
102+
panic!(
103+
"failed to map segment starting at {:?}: failed to map page {:?} to frame {:?}: {:?}",
104+
start_page, page, frame, err
105+
)
106+
})
107+
.flush();
121108
}
122109

123110
if mem_size > file_size {
@@ -187,7 +174,7 @@ pub(crate) fn map_segment(
187174
zero_start.as_u64(),
188175
Size4KiB::SIZE,
189176
)));
190-
let end_page = Page::containing_address(zero_end);
177+
let end_page = Page::containing_address(zero_end - 1usize);
191178
for page in Page::range_inclusive(start_page, end_page) {
192179
let frame = frame_allocator
193180
.allocate_frame(MemoryRegionType::Kernel)

0 commit comments

Comments
 (0)