10000 Update to x86_64 version 0.2.7 · rust-osdev/bootloader@83ae580 · GitHub
[go: up one dir, main page]

Skip to content

Commit 83ae580

Browse files
committed
Update to x86_64 version 0.2.7
1 parent ddcc507 commit 83ae580

File tree

3 files changed

+22
-18
lines changed

3 files changed

+22
-18
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ description = "An experimental pure-Rust x86 bootloader."
77

88
[dependencies]
99
xmas-elf = "0.6.2"
10-
x86_64 = "0.2.0-alpha"
10+
x86_64 = "0.2.7"
1111
usize_conversions = "0.2.0"
1212
os_bootinfo = "0.2.0"
1313
fixedvec = "0.2.3"

src/main.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use core::panic::PanicInfo;
2424
use os_bootinfo::BootInfo;
2525
use usize_conversions::usize_from;
2626
use x86_64::structures::paging::{Mapper, RecursivePageTable};
27-
use x86_64::structures::paging::{Page, PageTableFlags, PhysFrame, Size2MB};
27+
use x86_64::structures::paging::{Page, PageTableFlags, PhysFrame, Size2MiB};
2828
use x86_64::ux::u9;
2929
pub use x86_64::PhysAddr;
3030
use x86_64::VirtAddr;
@@ -156,13 +156,11 @@ pub extern "C" fn load_elf(
156156

157157

158158
// Unmap the ELF file.
159-
let kernel_start_page: Page<Size2MB> = Page::containing_address(kernel_start.virt());
160-
let kernel_end_page: Page<Size2MB> =
159+
let kernel_start_page: Page<Size2MiB> = Page::containing_address(kernel_start.virt());
160+
let kernel_end_page: Page<Size2MiB> =
161161
Page::containing_address(kernel_start.virt() + kernel_size - 1u64);
162162
for page in Page::range_inclusive(kernel_start_page, kernel_end_page) {
163-
rec_page_table
164-
.unmap(page, &mut |_| {})
165-
.expect("dealloc error").flush();
163+
rec_page_table.unmap(page).expect("dealloc error").1.flush();
166164
}
167165

168166
// Map kernel segments.

src/page_table.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use fixedvec::FixedVec;
22
use frame_allocator::FrameAllocator;
33
use os_bootinfo::MemoryRegionType;
4-
use x86_64::structures::paging::{MapToError, RecursivePageTable, UnmapError};
5-
use x86_64::structures::paging::{Mapper, MapperFlush, Page, PageSize, PageTableFlags, PhysFrame, Size4KB};
4+
use x86_64::structures::paging::{self, MapToError, RecursivePageTable, UnmapError};
5+
use x86_64::structures::paging::{Mapper, MapperFlush, Page, PageSize, PageTableFlags, PhysFrame, Size4KiB};
66
use x86_64::{align_up, PhysAddr, VirtAddr};
77
use xmas_elf::program::{self, ProgramHeader64};
88

@@ -91,7 +91,7 @@ pub(crate) fn map_segment(
9191
frame_allocator,
9292
)?.flush();
9393

94-
type PageArray = [u64; Size4KB::SIZE as usize / 8];
94+
type PageArray = [u64; Size4KiB::SIZE as usize / 8];
9595

9696
let last_page = Page::containing_address(virt_start_addr + file_size - 1u64);
9797
let last_page_ptr = last_page.start_address().as_ptr::<PageArray>();
@@ -103,13 +103,13 @@ pub(crate) fn map_segment(
103103
}
104104

105105
// remap last page
106-
if let Err(e) = page_table.unmap(last_page.clone(), &mut |_| {}) {
106+
if let Err(e) = page_table.unmap(last_page.clone()) {
107107
return Err(match e {
108-
UnmapError::EntryWithInvalidFlagsPresent(_) => {
109-
MapToError::EntryWithInvalidFlagsPresent
108+
UnmapError::ParentEntryHugePage => {
109+
MapToError::ParentEntryHugePage
110110
}
111111
UnmapError::PageNotMapped => unreachable!(),
112-
UnmapError::InvalidFrameAddressInPageTable => unreachable!(),
112+
UnmapError::InvalidFrameAddress(_) => unreachable!(),
113113
});
114114
}
115115

@@ -125,7 +125,7 @@ pub(crate) fn map_segment(
125125
// Map additional frames.
126126
let start_page: Page = Page::containing_address(VirtAddr::new(align_up(
127127
zero_start.as_u64(),
128-
Size4KB::SIZE,
128+
Size4KiB::SIZE,
129129
)));
130130
let end_page = Page::containing_address(zero_end);
131131
for page in Page::range_inclusive(start_page, end_page) {
@@ -158,7 +158,13 @@ where
158158
S: PageSize,
159159
RecursivePageTable<'a>: Mapper<S>,
160160
{
161-
page_table.map_to(page, phys_frame, flags, &mut || {
162-
frame_allocator.allocate_frame(MemoryRegionType::PageTable)
163-
})
161+
struct PageTableAllocator<'a, 'b: 'a>(&'a mut FrameAllocator<'b>);
162+
163+
impl<'a, 'b> paging::FrameAllocator<Size4KiB> for PageTableAllocator<'a, 'b> {
164+
fn alloc(&mut self) -> Option<PhysFrame<Size4KiB>> {
165+
self.0.allocate_frame(MemoryRegionType::PageTable)
166+
}
167+
}
168+
169+
page_table.map_to(page, phys_frame, flags, &mut PageTableAllocator(frame_allocator))
164170
}

0 commit comments

Comments
 (0)
0