Skip to content

Commit 866984b

Browse files
authored
Merge pull request #264 from Freax13/fix-large-phys-mem-mapping-2
allow allocating more than one level 4 entry (0.9)
2 parents 3ed1e84 + 2cbf551 commit 866984b

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

Diff for: src/level4_entries.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,19 @@ impl UsedLevel4Entries {
3131
used
3232
}
3333

34-
pub fn get_free_entry(&mut self) -> PageTableIndex {
35-
let (idx, entry) = self
34+
pub fn get_free_entries(&mut self, num: u64) -> PageTableIndex {
35+
let idx = self
3636
.entry_state
37-
.iter_mut()
37+
.windows(num as usize)
3838
.enumerate()
39-
.find(|(_, &mut entry)| entry == false)
39+
.find(|(_, entries)| entries.iter().all(|&entry| entry == false))
40+
.map(|(idx, _)| idx)
4041
.expect("no usable level 4 entries found");
4142

42-
*entry = true;
43+
for i in 0..num as usize {
44+
self.entry_state[idx + i] = true;
45+
}
46+
4347
PageTableIndex::new(idx.try_into().unwrap())
4448
}
4549
}

Diff for: src/main.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ fn bootloader_main(
169169
enable_nxe_bit();
170170

171171
// Create a recursive page table entry
172-
let recursive_index = PageTableIndex::new(level4_entries.get_free_entry().try_into().unwrap());
172+
let recursive_index =
173+
PageTableIndex::new(level4_entries.get_free_entries(1).try_into().unwrap());
173174
let mut entry = PageTableEntry::new();
174175
entry.set_addr(
175176
p4_physical,
@@ -243,7 +244,7 @@ fn bootloader_main(
243244
let page: Page = match BOOT_INFO_ADDRESS {
244245
Some(addr) => Page::containing_address(VirtAddr::new(addr)),
245246
None => Page::from_page_table_indices(
246-
level4_entries.get_free_entry(),
247+
level4_entries.get_free_entries(1),
247248
PageTableIndex::new(0),
248249
PageTableIndex::new(0),
249250
PageTableIndex::new(0),
@@ -286,11 +287,10 @@ fn bootloader_main(
286287

287288
let physical_memory_offset = if cfg!(feature = "map_physical_memory") {
288289
let physical_memory_offset = PHYSICAL_MEMORY_OFFSET.unwrap_or_else(|| {
289-
// If offset not manually provided, find a free p4 entry and map memory here.
290-
// One level 4 entry spans 2^48/512 bytes (over 500gib) so this should suffice.
291-
assert!(max_phys_addr < (1 << 48) / 512);
290+
const LEVEL_4_SIZE: u64 = 4096 * 512 * 512 * 512;
291+
let level_4_entries = (max_phys_addr + (LEVEL_4_SIZE - 1)) / LEVEL_4_SIZE;
292292
Page::from_page_table_indices_1gib(
293-
level4_entries.get_free_entry(),
293+
level4_entries.get_free_entries(level_4_entries),
294294
PageTableIndex::new(0),
295295
)
296296
.start_address()

0 commit comments

Comments
 (0)