Nothing to see here, move along
at main 76 lines 2.8 kB view raw
1use x86_64::VirtAddr; 2use x86_64::structures::paging::{Mapper, Page, PageTableFlags, Size4KiB}; 3 4use crate::mem::phys::BitmapFrameAllocator; 5 6crate::kernel_test!( 7 fn map_write_read_unmap() { 8 let hhdm = crate::mem::addr::hhdm_offset(); 9 let mut mapper = unsafe { crate::arch::paging::init(hhdm) }; 10 let mut alloc = BitmapFrameAllocator; 11 12 let test_va = VirtAddr::new(0xFFFF_FFFF_E000_0000); 13 let page: Page<Size4KiB> = Page::containing_address(test_va); 14 let frame = alloc.allocate().expect("alloc frame for map test"); 15 let phys_frame = frame.inner(); 16 let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE; 17 18 unsafe { 19 mapper 20 .map_to(page, phys_frame, flags, &mut alloc) 21 .expect("map_to failed") 22 .flush(); 23 } 24 25 let ptr: *mut u64 = test_va.as_mut_ptr(); 26 let pattern: u64 = 0x1234_5678_9ABC_DEF0; 27 unsafe { ptr.write_volatile(pattern) }; 28 let readback = unsafe { ptr.read_volatile() }; 29 assert_eq!(readback, pattern, "paging write/read mismatch"); 30 31 let (returned, flush) = mapper.unmap(page).expect("unmap failed"); 32 flush.flush(); 33 alloc.deallocate_frame(returned); 34 } 35); 36 37crate::kernel_test!( 38 fn dual_mapping_shares_physical() { 39 let hhdm = crate::mem::addr::hhdm_offset(); 40 let mut mapper = unsafe { crate::arch::paging::init(hhdm) }; 41 let mut alloc = BitmapFrameAllocator; 42 43 let va_a = VirtAddr::new(0xFFFF_FFFF_D000_0000); 44 let va_b = VirtAddr::new(0xFFFF_FFFF_D000_1000); 45 let page_a: Page<Size4KiB> = Page::containing_address(va_a); 46 let page_b: Page<Size4KiB> = Page::containing_address(va_b); 47 48 let frame = alloc.allocate().expect("alloc for dual-map"); 49 let phys = frame.inner(); 50 let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE; 51 52 unsafe { 53 mapper 54 .map_to(page_a, phys, flags, &mut alloc) 55 .expect("map_to A") 56 .flush(); 57 mapper 58 .map_to(page_b, phys, flags, &mut alloc) 59 .expect("map_to B") 60 .flush(); 61 } 62 63 let ptr_a: *mut u64 = va_a.as_mut_ptr(); 64 let ptr_b: *const u64 = va_b.as_ptr(); 65 let pattern: u64 = 0xCAFE_BABE_F00D_FACE; 66 unsafe { ptr_a.write_volatile(pattern) }; 67 let read_b = unsafe { ptr_b.read_volatile() }; 68 assert_eq!(read_b, pattern, "dual-mapped read mismatch"); 69 70 let (ret_a, flush_a) = mapper.unmap(page_a).expect("unmap A"); 71 flush_a.flush(); 72 let (_, flush_b) = mapper.unmap(page_b).expect("unmap B"); 73 flush_b.flush(); 74 alloc.deallocate_frame(ret_a); 75 } 76);