Nothing to see here, move along
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);