Skip to content

Commit b56fa0f

Browse files
authored
Update to new x86_64 and os_bootinfo versions (rust-osdev#11)
1 parent fbb28fe commit b56fa0f

File tree

5 files changed

+36
-36
lines changed

5 files changed

+36
-36
lines changed

Cargo.lock

Lines changed: 7 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ 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 = { git = "https://github.com/rust-osdev/x86_64" }
1111
usize_conversions = "0.2.0"
12-
os_bootinfo = "0.2.0-alpha"
12+
os_bootinfo = { git = "https://github.com/rust-osdev/os_bootinfo" }
1313
fixedvec = "0.2.3"
1414

1515
[profile.dev]

src/boot_info.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ pub(crate) fn create_from(memory_map_addr: VirtAddr, entry_count: u64) -> Memory
1919
let mut iter = memory_map.iter_mut().peekable();
2020
while let Some(region) = iter.next() {
2121
if let Some(next) = iter.peek() {
22-
if region.range.end > next.range.start {
22+
if region.range.end_frame_number > next.range.start_frame_number {
2323
if region.region_type == MemoryRegionType::Usable {
24-
region.range.end = next.range.start;
24+
region.range.end_frame_number = next.range.start_frame_number;
2525
} else {
2626
panic!("two non-usable regions overlap: {:?} {:?}", region, next);
2727
}

src/frame_allocator.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ impl<'a> FrameAllocator<'a> {
1212
while let Some(region) = iter.next() {
1313
if region.region_type == region_type {
1414
if let Some(next) = iter.peek() {
15-
if next.range.start == region.range.end
15+
if next.range.start_frame_number == region.range.end_frame_number
1616
&& next.region_type == MemoryRegionType::Usable
1717
&& !next.range.is_empty()
1818
{
19-
let frame = region.range.end;
20-
region.range.end += 1;
21-
iter.next().unwrap().range.start += 1;
19+
let frame = PhysFrameRange::from(region.range).end;
20+
region.range.end_frame_number += 1;
21+
iter.next().unwrap().range.start_frame_number += 1;
2222
return Some(frame);
2323
}
2424
}
@@ -37,8 +37,8 @@ impl<'a> FrameAllocator<'a> {
3737
continue;
3838
}
3939

40-
let frame = region.range.start;
41-
region.range.start += 1;
40+
let frame = PhysFrameRange::from(region.range).start;
41+
region.range.start_frame_number += 1;
4242
return Some((frame, PhysFrame::range(frame, frame + 1)));
4343
}
4444
None
@@ -53,7 +53,7 @@ impl<'a> FrameAllocator<'a> {
5353

5454
if let Some((frame, range)) = result {
5555
self.memory_map
56-
.add_region(MemoryRegion { range, region_type });
56+
.add_region(MemoryRegion { range: range.into(), region_type });
5757
Some(frame)
5858
} else {
5959
None
@@ -65,10 +65,10 @@ impl<'a> FrameAllocator<'a> {
6565
/// Panics if a non-usable region (e.g. a reserved region) overlaps with the passed region.
6666
pub(crate) fn mark_allocated_region(&mut self, region: MemoryRegion) {
6767
for r in self.memory_map.iter_mut() {
68-
if region.range.start >= r.range.end {
68+
if region.range.start_frame_number >= r.range.end_frame_number {
6969
continue;
7070
}
71-
if region.range.end <= r.range.start {
71+
if region.range.end_frame_number <= r.range.start_frame_number {
7272
continue;
7373
}
7474

@@ -79,42 +79,42 @@ impl<'a> FrameAllocator<'a> {
7979
);
8080
}
8181

82-
if region.range.start == r.range.start {
83-
if region.range.end < r.range.end {
82+
if region.range.start_frame_number == r.range.start_frame_number {
83+
if region.range.end_frame_number < r.range.end_frame_number {
8484
// Case: (r = `r`, R = `region`)
8585
// ----rrrrrrrrrrr----
8686
// ----RRRR-----------
87-
r.range.start = region.range.end;
87+
r.range.start_frame_number = region.range.end_frame_number;
8888
self.memory_map.add_region(region);
8989
} else {
9090
// Case: (r = `r`, R = `region`)
9191
// ----rrrrrrrrrrr----
9292
// ----RRRRRRRRRRRRRR-
9393
*r = region;
9494
}
95-
} else if region.range.start > r.range.start {
96-
if region.range.end < r.range.end {
95+
} else if region.range.start_frame_number > r.range.start_frame_number {
96+
if region.range.end_frame_number < r.range.end_frame_number {
9797
// Case: (r = `r`, R = `region`)
9898
// ----rrrrrrrrrrr----
9999
// ------RRRR---------
100100
let mut behind_r = r.clone();
101-
behind_r.range.start = region.range.end;
102-
r.range.end = region.range.start;
101+
behind_r.range.start_frame_number = region.range.end_frame_number;
102+
r.range.end_frame_number = region.range.start_frame_number;
103103
self.memory_map.add_region(behind_r);
104104
self.memory_map.add_region(region);
105105
} else {
106106
// Case: (r = `r`, R = `region`)
107107
// ----rrrrrrrrrrr----
108108
// -----------RRRR---- or
109109
// -------------RRRR--
110-
r.range.end = region.range.start;
110+
r.range.end_frame_number = region.range.start_frame_number;
111111
self.memory_map.add_region(region);
112112
}
113113
} else {
114114
// Case: (r = `r`, R = `region`)
115115
// ----rrrrrrrrrrr----
116116
// --RRRR-------------
117-
r.range.start = region.range.end;
117+
r.range.start_frame_number = region.range.end_frame_number;
118118
self.memory_map.add_region(region);
119119
}
120120
return;

src/main.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,39 +118,41 @@ pub extern "C" fn load_elf(
118118
memory_map: &mut memory_map,
119119
};
120120

121+
121122
// Mark already used memory areas in frame allocator.
122123
{
123124
let zero_frame: PhysFrame = PhysFrame::from_start_address(PhysAddr::new(0)).unwrap();
124125
frame_allocator.mark_allocated_region(MemoryRegion {
125-
range: PhysFrame::range(zero_frame, zero_frame + 1),
126+
range: PhysFrame::range(zero_frame, zero_frame + 1).into(),
126127
region_type: MemoryRegionType::FrameZero,
127128
});
128129
let bootloader_start_frame = PhysFrame::containing_address(bootloader_start);
129130
let bootloader_end_frame = PhysFrame::containing_address(bootloader_end - 1u64);
130131
let bootloader_memory_area =
131132
PhysFrame::range(bootloader_start_frame, bootloader_end_frame + 1);
132133
frame_allocator.mark_allocated_region(MemoryRegion {
133-
range: bootloader_memory_area,
134+
range: bootloader_memory_area.into(),
134135
region_type: MemoryRegionType::Bootloader,
135136
});
136137
let kernel_start_frame = PhysFrame::containing_address(kernel_start.phys());
137138
let kernel_end_frame =
138139
PhysFrame::containing_address(kernel_start.phys() + kernel_size - 1u64);
139140
let kernel_memory_area = PhysFrame::range(kernel_start_frame, kernel_end_frame + 1);
140141
frame_allocator.mark_allocated_region(MemoryRegion {
141-
range: kernel_memory_area,
142+
range: kernel_memory_area.into(),
142143
region_type: MemoryRegionType::Kernel,
143144
});
144145
let page_table_start_frame = PhysFrame::containing_address(page_table_start);
145146
let page_table_end_frame = PhysFrame::containing_address(page_table_end - 1u64);
146147
let page_table_memory_area =
147148
PhysFrame::range(page_table_start_frame, page_table_end_frame + 1);
148149
frame_allocator.mark_allocated_region(MemoryRegion {
149-
range: page_table_memory_area,
150+
range: page_table_memory_area.into(),
150151
region_type: MemoryRegionType::PageTable,
151152
});
152153
}
153154

155+
154156
// Unmap the ELF file.
155157
let kernel_start_page: Page<Size2MB> = Page::containing_address(kernel_start.virt());
156158
let kernel_end_page: Page<Size2MB> =
@@ -187,7 +189,7 @@ pub extern "C" fn load_elf(
187189
};
188190

189191
// Construct boot info structure.
190-
let mut boot_info = BootInfo::new(page_table, memory_map);
192+
let mut boot_info = BootInfo::new(recursive_page_table_addr.start_address().as_u64(), memory_map);
191193
boot_info.memory_map.sort();
192194

193195
// Write boot info to boot info page.

0 commit comments

Comments
 (0)