@@ -2,9 +2,9 @@ use core::fmt::Debug;
22use core:: ptr;
33
44use log:: warn;
5- use x86_64:: structures:: paging:: mapper:: CleanUp ;
5+ use x86_64:: structures:: paging:: mapper:: { CleanUp , MapToError } ;
66use x86_64:: structures:: paging:: {
7- Mapper , Page , PageSize , PageTableFlags , PhysFrame , RecursivePageTable ,
7+ Mapper , Page , PageSize , PageTableFlags , PhysFrame , RecursivePageTable , Translate ,
88} ;
99
1010use super :: physicalmem:: PhysAlloc ;
@@ -41,11 +41,16 @@ where
4141 let mut table = unsafe { recursive_page_table ( ) } ;
4242
4343 for ( page, frame) in pages. zip ( frames) {
44- unsafe {
45- table
46- . map_to ( page, frame, flags, & mut PhysAlloc )
47- . unwrap ( )
48- . flush ( ) ;
44+ let mapper_result = unsafe { table. map_to ( page, frame, flags, & mut PhysAlloc ) } ;
45+ match mapper_result {
46+ Ok ( mapper_flush) => mapper_flush. flush ( ) ,
47+ Err ( MapToError :: PageAlreadyMapped ( current_frame) ) => assert_eq ! ( current_frame, frame) ,
48+ Err ( MapToError :: ParentEntryHugePage ) => {
49+ let current_addr = table. translate_addr ( page. start_address ( ) ) . unwrap ( ) ;
50+ let expected_addr = frame. start_address ( ) ;
51+ assert_eq ! ( current_addr, expected_addr) ;
52+ }
53+ Err ( err) => panic ! ( "could not map {frame:?}: {err:?}" ) ,
4954 }
5055 }
5156}
@@ -75,11 +80,16 @@ pub fn map_range<S>(
7580 let page_range = core:: iter:: successors ( Some ( first_page) , |page| Some ( * page + 1u64 ) ) ;
7681 let frame_range = PhysFrame :: < S > :: range ( first_frame, last_frame) ;
7782 for ( page, frame) in core:: iter:: zip ( page_range, frame_range) {
78- unsafe {
79- table
80- . map_to ( page, frame, flags, & mut PhysAlloc )
81- . unwrap ( )
82- . flush ( ) ;
83+ let mapper_result = unsafe { table. map_to ( page, frame, flags, & mut PhysAlloc ) } ;
84+ match mapper_result {
85+ Ok ( mapper_flush) => mapper_flush. flush ( ) ,
86+ Err ( MapToError :: PageAlreadyMapped ( current_frame) ) => assert_eq ! ( current_frame, frame) ,
87+ Err ( MapToError :: ParentEntryHugePage ) => {
88+ let current_addr = table. translate_addr ( page. start_address ( ) ) . unwrap ( ) ;
89+ let expected_addr = frame. start_address ( ) ;
90+ assert_eq ! ( current_addr, expected_addr) ;
91+ }
92+ Err ( err) => panic ! ( "could not map {frame:?}: {err:?}" ) ,
8393 }
8494 }
8595}
0 commit comments