diff --git a/Cargo.lock b/Cargo.lock index 27c3298c..034bf3d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,7 +33,7 @@ dependencies = [ "spin", "uart_16550", "volatile", - "x86_64", + "x86_64 0.11.0", ] [[package]] @@ -188,7 +188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d44b0f30cb82b0fbc15b78ade1064226529ad52028bc8cb8accb98ff6f3d7131" dependencies = [ "bitflags", - "x86_64", + "x86_64 0.9.6", ] [[package]] @@ -206,3 +206,13 @@ dependencies = [ "bit_field", "bitflags", ] + +[[package]] +name = "x86_64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "365de37eb7c6da582cbb510dd0f3f1235d24ff6309a8a96e8a9909cc9bfd608f" +dependencies = [ + "bit_field", + "bitflags", +] diff --git a/Cargo.toml b/Cargo.toml index 08d6ab3c..f895256a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ harness = false bootloader = { version = "0.9.3", features = ["map_physical_memory"]} volatile = "0.2.6" spin = "0.5.2" -x86_64 = "0.9.6" +x86_64 = "0.11.0" uart_16550 = "0.2.0" pic8259_simple = "0.1.1" pc-keyboard = "0.5.0" diff --git a/src/allocator.rs b/src/allocator.rs index dce05a62..60444675 100644 --- a/src/allocator.rs +++ b/src/allocator.rs @@ -35,7 +35,7 @@ pub fn init_heap( .allocate_frame() .ok_or(MapToError::FrameAllocationFailed)?; let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE; - mapper.map_to(page, frame, flags, frame_allocator)?.flush(); + unsafe { mapper.map_to(page, frame, flags, frame_allocator)?.flush() }; } unsafe { diff --git a/src/memory.rs b/src/memory.rs index e9380203..c64b72d4 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -2,7 +2,6 @@ use bootloader::bootinfo::{MemoryMap, MemoryRegionType}; use x86_64::{ structures::paging::{ FrameAllocator, Mapper, OffsetPageTable, Page, PageTable, PhysFrame, Size4KiB, - UnusedPhysFrame, }, PhysAddr, VirtAddr, }; @@ -45,11 +44,12 @@ pub fn create_example_mapping( use x86_64::structures::paging::PageTableFlags as Flags; let frame = PhysFrame::containing_address(PhysAddr::new(0xb8000)); - // FIXME: ONLY FOR TEMPORARY TESTING - let unused_frame = unsafe { UnusedPhysFrame::new(frame) }; let flags = Flags::PRESENT | Flags::WRITABLE; - let map_to_result = mapper.map_to(page, unused_frame, flags, frame_allocator); + let map_to_result = unsafe { + // FIXME: this is not safe, we do it only for testing + mapper.map_to(page, frame, flags, frame_allocator) + }; map_to_result.expect("map_to failed").flush(); } @@ -57,7 +57,7 @@ pub fn create_example_mapping( pub struct EmptyFrameAllocator; unsafe impl FrameAllocator for EmptyFrameAllocator { - fn allocate_frame(&mut self) -> Option { + fn allocate_frame(&mut self) -> Option { None } } @@ -82,7 +82,7 @@ impl BootInfoFrameAllocator { } /// Returns an iterator over the usable frames specified in the memory map. - fn usable_frames(&self) -> impl Iterator { + fn usable_frames(&self) -> impl Iterator { // get usable regions from memory map let regions = self.memory_map.iter(); let usable_regions = regions.filter(|r| r.region_type == MemoryRegionType::Usable); @@ -91,14 +91,12 @@ impl BootInfoFrameAllocator { // transform to an iterator of frame start addresses let frame_addresses = addr_ranges.flat_map(|r| r.step_by(4096)); // create `PhysFrame` types from the start addresses - let frames = frame_addresses.map(|addr| PhysFrame::containing_address(PhysAddr::new(addr))); - // we know that the frames are really unused - frames.map(|f| unsafe { UnusedPhysFrame::new(f) }) + frame_addresses.map(|addr| PhysFrame::containing_address(PhysAddr::new(addr))) } } unsafe impl FrameAllocator for BootInfoFrameAllocator { - fn allocate_frame(&mut self) -> Option { + fn allocate_frame(&mut self) -> Option { let frame = self.usable_frames().nth(self.next); self.next += 1; frame