Skip to content

Commit 3531dfb

Browse files
authored
Merge pull request #423 from rust-osdev/update-flags
[v0.9] Fix: unify flags if multiple segments are mapped to same frame with different flags
2 parents 5186c62 + a9a4787 commit 3531dfb

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

Changelog.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Unreleased
22

3-
# 0.9.26 – 2024-02-16
3+
- [Fix: unify flags if multiple segments are mapped to same frame with different flags](https://github.com/rust-osdev/bootloader/pull/423)
44

5+
# 0.9.26 – 2024-02-16
56

67
- [Fix map errors during kernel loading](https://github.com/rust-osdev/bootloader/pull/422)
78
- Don't error if a kernel page is already mapped to the correct frame

src/page_table.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use crate::frame_allocator::FrameAllocator;
22
use bootloader::bootinfo::MemoryRegionType;
33
use bootloader::bootinfo::TlsTemplate;
44
use fixedvec::FixedVec;
5-
use x86_64::structures::paging::mapper::{MapToError, MapperFlush, UnmapError};
5+
use x86_64::structures::paging::mapper::{MapToError, MapperFlush, TranslateResult, UnmapError};
66
use x86_64::structures::paging::{
77
self, Mapper, Page, PageSize, PageTableFlags, PhysFrame, RecursivePageTable, Size4KiB,
8+
Translate,
89
};
910
use x86_64::{align_up, PhysAddr, VirtAddr};
1011
use xmas_elf::program::{self, ProgramHeader64};
@@ -101,6 +102,18 @@ pub(crate) fn map_segment(
101102
} {
102103
Ok(flusher) => flusher.flush(),
103104
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+
}
104117
// nothing to do, page is already mapped to the correct frame
105118
}
106119
Err(err) => return Err(err),

0 commit comments

Comments
 (0)