Skip to content

Commit 40db4fa

Browse files
committed
Update CI badge and use latest version of x86_64 crate
1 parent b2e6eff commit 40db4fa

File tree

6 files changed

+100
-56
lines changed

6 files changed

+100
-56
lines changed

Diff for: Cargo.lock

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

Diff for: Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ build = "build.rs"
1010

1111
[dependencies]
1212
xmas-elf = "0.6.2"
13-
x86_64 = "0.3.5"
13+
x86_64 = "0.7.2"
1414
usize_conversions = "0.2.0"
1515
fixedvec = "0.2.3"
1616

Diff for: README.md

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

3-
[![Build Status](https://travis-ci.org/rust-osdev/bootloader.svg?branch=master)](https://travis-ci.org/rust-osdev/bootloader) [![Join the chat at https://gitter.im/rust-osdev/bootloader](https://badges.gitter.im/rust-osdev/bootloader.svg)](https://gitter.im/rust-osdev/bootloader?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3+
[![Build Status](https://dev.azure.com/rust-osdev/bootloader/_apis/build/status/rust-osdev.bootloader?branchName=master)](https://dev.azure.com/rust-osdev/bootloader/_build/latest?definitionId=1&branchName=master) [![Join the chat at https://gitter.im/rust-osdev/bootloader](https://badges.gitter.im/rust-osdev/bootloader.svg)](https://gitter.im/rust-osdev/bootloader?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
44

55
An experimental x86 bootloader written in Rust and inline assembly.
66

Diff for: src/frame_allocator.rs

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

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

Diff for: src/main.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ use core::panic::PanicInfo;
1515
use core::{mem, slice};
1616
use fixedvec::alloc_stack;
1717
use usize_conversions::usize_from;
18-
use x86_64::structures::paging::{Mapper, RecursivePageTable};
1918
use x86_64::structures::paging::{
20-
Page, PageTableFlags, PhysFrame, PhysFrameRange, Size2MiB, Size4KiB,
19+
Page, PageTableFlags, Size2MiB, Size4KiB, PhysFrame, frame::PhysFrameRange, Mapper, RecursivePageTable
2120
};
2221
use x86_64::ux::u9;
2322
use x86_64::{PhysAddr, VirtAddr};
@@ -227,14 +226,15 @@ fn load_elf(
227226
.allocate_frame(MemoryRegionType::BootInfo)
228227
.expect("frame allocation failed");
229228
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
230-
page_table::map_page(
231-
page,
232-
frame,
233-
flags,
234-
&mut rec_page_table,
235-
&mut frame_allocator,
236-
)
237-
.expect("Mapping of bootinfo page failed")
229+
unsafe {
230+
page_table::map_page(
231+
page,
232+
frame,
233+
flags,
234+
&mut rec_page_table,
235+
&mut frame_allocator,
236+
)
237+
}.expect("Mapping of bootinfo page failed")
238238
.flush();
239239
page
240240
};
@@ -249,14 +249,15 @@ fn load_elf(
249249
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
250250
let page = Page::containing_address(virt_for_phys(frame.start_address()));
251251
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
252-
page_table::map_page(
253-
page,
254-
frame,
255-
flags,
256-
&mut rec_page_table,
257-
&mut frame_allocator,
258-
)
259-
.expect("Mapping of bootinfo page failed")
252+
unsafe {
253+
page_table::map_page(
254+
page,
255+
frame,
256+
flags,
257+
&mut rec_page_table,
258+
&mut frame_allocator,
259+
)
260+
}.expect("Mapping of bootinfo page failed")
260261
.flush();
261262
}
262263
}

Diff for: src/page_table.rs

+26-24
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use crate::frame_allocator::FrameAllocator;
22
use bootloader::bootinfo::MemoryRegionType;
33
use fixedvec::FixedVec;
4-
use x86_64::structures::paging::{self, MapToError, RecursivePageTable, UnmapError};
54
use x86_64::structures::paging::{
6-
Mapper, MapperFlush, Page, PageSize, PageTableFlags, PhysFrame, Size4KiB,
5+
Mapper, Page, PageSize, PageTableFlags, PhysFrame, Size4KiB, self, RecursivePageTable,
76
};
7+
use x86_64::structures::paging::mapper::{UnmapError, MapToError, MapperFlush};
88
use x86_64::{align_up, PhysAddr, VirtAddr};
99
use xmas_elf::program::{self, ProgramHeader64};
1010

@@ -31,7 +31,7 @@ pub(crate) fn map_kernel(
3131
let frame = frame_allocator
3232
.allocate_frame(region_type)
3333
.ok_or(MapToError::FrameAllocationFailed)?;
34-
map_page(page, frame, flags, page_table, frame_allocator)?.flush();
34+
unsafe { map_page(page, frame, flags, page_table, frame_allocator)? }.flush();
3535
}
3636

3737
Ok(stack_end.start_address())
@@ -68,7 +68,7 @@ pub(crate) fn map_segment(
6868
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
6969
let offset = frame - start_frame;
7070
let page = start_page + offset;
71-
map_page(page, frame, page_table_flags, page_table, frame_allocator)?.flush();
71+
unsafe { map_page(page, frame, page_table_flags, page_table, frame_allocator)? }.flush();
7272
}
7373

7474
if mem_size > file_size {
@@ -85,14 +85,15 @@ pub(crate) fn map_segment(
8585
let new_frame = frame_allocator
8686
.allocate_frame(MemoryRegionType::Kernel)
8787
.ok_or(MapToError::FrameAllocationFailed)?;
88-
map_page(
89-
temp_page.clone(),
90-
new_frame.clone(),
91-
page_table_flags,
92-
page_table,
93-
frame_allocator,
94-
)?
95-
.flush();
88+
unsafe {
89+
map_page(
90+
temp_page.clone(),
91+
new_frame.clone(),
92+
page_table_flags,
93+
page_table,
94+
frame_allocator,
95+
)?
96+
}.flush();
9697

9798
type PageArray = [u64; Size4KiB::SIZE as usize / 8];
9899

@@ -114,14 +115,15 @@ pub(crate) fn map_segment(
114115
});
115116
}
116117

117-
map_page(
118-
last_page,
119-
new_frame,
120-
page_table_flags,
121-
page_table,
122-
frame_allocator,
123-
)?
124-
.flush();
118+
unsafe {
119+
map_page(
120+
last_page,
121+
new_frame,
122+
page_table_flags,
123+
page_table,
124+
frame_allocator,
125+
)?
126+
}.flush();
125127
}
126128

127129
// Map additional frames.
@@ -134,7 +136,7 @@ pub(crate) fn map_segment(
134136
let frame = frame_allocator
135137
.allocate_frame(MemoryRegionType::Kernel)
136138
.ok_or(MapToError::FrameAllocationFailed)?;
137-
map_page(page, frame, page_table_flags, page_table, frame_allocator)?.flush();
139+
unsafe { map_page(page, frame, page_table_flags, page_table, frame_allocator)? }.flush();
138140
}
139141

140142
// zero
@@ -149,7 +151,7 @@ pub(crate) fn map_segment(
149151
Ok(())
150152
}
151153

152-
pub(crate) fn map_page<'a, S>(
154+
pub(crate) unsafe fn map_page<'a, S>(
153155
page: Page<S>,
154156
phys_frame: PhysFrame<S>,
155157
flags: PageTableFlags,
@@ -162,8 +164,8 @@ where
162164
{
163165
struct PageTableAllocator<'a, 'b: 'a>(&'a mut FrameAllocator<'b>);
164166

165-
impl<'a, 'b> paging::FrameAllocator<Size4KiB> for PageTableAllocator<'a, 'b> {
166-
fn alloc(&mut self) -> Option<PhysFrame<Size4KiB>> {
167+
unsafe impl<'a, 'b> paging::FrameAllocator<Size4KiB> for PageTableAllocator<'a, 'b> {
168+
fn allocate_frame(&mut self) -> Option<PhysFrame<Size4KiB>> {
167169
self.0.allocate_frame(MemoryRegionType::PageTable)
168170
}
169171
}

0 commit comments

Comments
 (0)