Skip to content

Commit bc8d1bd

Browse files
authored
Merge pull request #92 from vinaychandra/vinay/x86_64_update
Update x86_64 dependency
2 parents cfae706 + 52aa87e commit bc8d1bd

File tree

7 files changed

+48
-52
lines changed

7 files changed

+48
-52
lines changed

Cargo.lock

+3-26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ required-features = ["binary"]
1414

1515
[dependencies]
1616
xmas-elf = { version = "0.6.2", optional = true }
17-
x86_64 = { version = "0.7.2", optional = true }
17+
x86_64 = { version = "0.8.3", optional = true }
1818
usize_conversions = { version = "0.2.0", optional = true }
1919
fixedvec = { version = "0.2.4", optional = true }
2020
bit_field = { version = "0.10.0", optional = true }

src/bootinfo/memory_map.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub struct MemoryMap {
1515
}
1616

1717
#[doc(hidden)]
18+
#[allow(clippy::new_without_default)]
1819
impl MemoryMap {
1920
pub fn new() -> Self {
2021
MemoryMap {

src/frame_allocator.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
use super::{frame_range, phys_frame_range};
22
use bootloader::bootinfo::{MemoryMap, MemoryRegion, MemoryRegionType};
3-
use x86_64::structures::paging::{frame::PhysFrameRange, PhysFrame};
3+
use x86_64::structures::paging::{frame::PhysFrameRange, PhysFrame, UnusedPhysFrame};
44

55
pub(crate) struct FrameAllocator<'a> {
66
pub memory_map: &'a mut MemoryMap,
77
}
88

99
impl<'a> FrameAllocator<'a> {
10-
pub(crate) fn allocate_frame(&mut self, region_type: MemoryRegionType) -> Option<PhysFrame> {
10+
pub(crate) fn allocate_frame(
11+
&mut self,
12+
region_type: MemoryRegionType,
13+
) -> Option<UnusedPhysFrame> {
1114
// try to find an existing region of same type that can be enlarged
1215
let mut iter = self.memory_map.iter_mut().peekable();
1316
while let Some(region) = iter.next() {
@@ -17,7 +20,8 @@ impl<'a> FrameAllocator<'a> {
1720
&& next.region_type == MemoryRegionType::Usable
1821
&& !next.range.is_empty()
1922
{
20-
let frame = phys_frame_range(region.range).end;
23+
let frame =
24+
unsafe { UnusedPhysFrame::new(phys_frame_range(region.range).end) };
2125
region.range.end_frame_number += 1;
2226
iter.next().unwrap().range.start_frame_number += 1;
2327
return Some(frame);
@@ -26,7 +30,7 @@ impl<'a> FrameAllocator<'a> {
2630
}
2731
}
2832

29-
fn split_usable_region<'a, I>(iter: &mut I) -> Option<(PhysFrame, PhysFrameRange)>
33+
fn split_usable_region<'a, I>(iter: &mut I) -> Option<(UnusedPhysFrame, PhysFrameRange)>
3034
where
3135
I: Iterator<Item = &'a mut MemoryRegion>,
3236
{
@@ -38,9 +42,10 @@ impl<'a> FrameAllocator<'a> {
3842
continue;
3943
}
4044

41-
let frame = phys_frame_range(region.range).start;
45+
let physframe = phys_frame_range(region.range).start;
46+
let unused_frame = unsafe { UnusedPhysFrame::new(physframe) };
4247
region.range.start_frame_number += 1;
43-
return Some((frame, PhysFrame::range(frame, frame + 1)));
48+
return Some((unused_frame, PhysFrame::range(physframe, physframe + 1)));
4449
}
4550
None
4651
}

src/level4_entries.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use core::convert::TryInto;
22
use fixedvec::FixedVec;
3-
use x86_64::ux;
4-
use x86_64::{structures::paging::Page, VirtAddr};
3+
use x86_64::{
4+
structures::paging::{Page, PageTableIndex},
5+
VirtAddr,
6+
};
57
use xmas_elf::program::ProgramHeader64;
68

79
pub struct UsedLevel4Entries {
@@ -29,7 +31,7 @@ impl UsedLevel4Entries {
2931
used
3032
}
3133

32-
pub fn get_free_entry(&mut self) -> ux::u9 {
34+
pub fn get_free_entry(&mut self) -> PageTableIndex {
3335
let (idx, entry) = self
3436
.entry_state
3537
.iter_mut()
@@ -38,6 +40,6 @@ impl UsedLevel4Entries {
3840
.expect("no usable level 4 entries found");
3941

4042
*entry = true;
41-
ux::u9::new(idx.try_into().unwrap())
43+
PageTableIndex::new(idx.try_into().unwrap())
4244
}
4345
}

src/main.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ use usize_conversions::usize_from;
1919
use x86_64::instructions::tlb;
2020
use x86_64::structures::paging::{
2121
frame::PhysFrameRange, page_table::PageTableEntry, Mapper, Page, PageTable, PageTableFlags,
22-
PhysFrame, RecursivePageTable, Size2MiB, Size4KiB,
22+
PageTableIndex, PhysFrame, RecursivePageTable, Size2MiB, Size4KiB, UnusedPhysFrame,
2323
};
24-
use x86_64::ux::u9;
2524
use x86_64::{PhysAddr, VirtAddr};
2625

2726
// The bootloader_config.rs file contains some configuration constants set by the build script:
@@ -170,7 +169,7 @@ fn bootloader_main(
170169
enable_nxe_bit();
171170

172171
// Create a recursive page table entry
173-
let recursive_index = u9::new(level4_entries.get_free_entry().try_into().unwrap());
172+
let recursive_index = PageTableIndex::new(level4_entries.get_free_entry().try_into().unwrap());
174173
let mut entry = PageTableEntry::new();
175174
entry.set_addr(
176175
p4_physical,
@@ -243,9 +242,9 @@ fn bootloader_main(
243242
let boot_info_page = {
244243
let page: Page = Page::from_page_table_indices(
245244
level4_entries.get_free_entry(),
246-
u9::new(0),
247-
u9::new(0),
248-
u9::new(0),
245+
PageTableIndex::new(0),
246+
PageTableIndex::new(0),
247+
PageTableIndex::new(0),
249248
);
250249
let frame = frame_allocator
251250
.allocate_frame(MemoryRegionType::BootInfo)
@@ -287,9 +286,12 @@ fn bootloader_main(
287286
// If offset not manually provided, find a free p4 entry and map memory here.
288287
// One level 4 entry spans 2^48/512 bytes (over 500gib) so this should suffice.
289288
assert!(max_phys_addr < (1 << 48) / 512);
290-
Page::from_page_table_indices_1gib(level4_entries.get_free_entry(), u9::new(0))
291-
.start_address()
292-
.as_u64()
289+
Page::from_page_table_indices_1gib(
290+
level4_entries.get_free_entry(),
291+
PageTableIndex::new(0),
292+
)
293+
.start_address()
294+
.as_u64()
293295
});
294296

295297
let virt_for_phys =
@@ -304,7 +306,7 @@ fn bootloader_main(
304306
unsafe {
305307
page_table::map_page(
306308
page,
307-
frame,
309+
UnusedPhysFrame::new(frame),
308310
flags,
309311
&mut rec_page_table,
310312
&mut frame_allocator,

src/page_table.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use fixedvec::FixedVec;
44
use x86_64::structures::paging::mapper::{MapToError, MapperFlush, UnmapError};
55
use x86_64::structures::paging::{
66
self, Mapper, Page, PageSize, PageTableFlags, PhysFrame, RecursivePageTable, Size4KiB,
7+
UnusedPhysFrame,
78
};
89
use x86_64::{align_up, PhysAddr, VirtAddr};
910
use xmas_elf::program::{self, ProgramHeader64};
@@ -68,8 +69,16 @@ pub(crate) fn map_segment(
6869
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
6970
let offset = frame - start_frame;
7071
let page = start_page + offset;
71-
unsafe { map_page(page, frame, page_table_flags, page_table, frame_allocator)? }
72-
.flush();
72+
unsafe {
73+
map_page(
74+
page,
75+
UnusedPhysFrame::new(frame),
76+
page_table_flags,
77+
page_table,
78+
frame_allocator,
79+
)?
80+
}
81+
.flush();
7382
}
7483

7584
if mem_size > file_size {
@@ -89,7 +98,7 @@ pub(crate) fn map_segment(
8998
unsafe {
9099
map_page(
91100
temp_page.clone(),
92-
new_frame.clone(),
101+
UnusedPhysFrame::new(new_frame.clone()),
93102
page_table_flags,
94103
page_table,
95104
frame_allocator,
@@ -159,7 +168,7 @@ pub(crate) fn map_segment(
159168

160169
pub(crate) unsafe fn map_page<'a, S>(
161170
page: Page<S>,
162-
phys_frame: PhysFrame<S>,
171+
phys_frame: UnusedPhysFrame<S>,
163172
flags: PageTableFlags,
164173
page_table: &mut RecursivePageTable<'a>,
165174
frame_allocator: &mut FrameAllocator,
@@ -171,7 +180,7 @@ where
171180
struct PageTableAllocator<'a, 'b: 'a>(&'a mut FrameAllocator<'b>);
172181

173182
unsafe impl<'a, 'b> paging::FrameAllocator<Size4KiB> for PageTableAllocator<'a, 'b> {
174-
fn allocate_frame(&mut self) -> Option<PhysFrame<Size4KiB>> {
183+
fn allocate_frame(&mut self) -> Option<UnusedPhysFrame<Size4KiB>> {
175184
self.0.allocate_frame(MemoryRegionType::PageTable)
176185
}
177186
}

0 commit comments

Comments
 (0)