11use core:: fmt:: Debug ;
2+ use core:: ptr;
23
34use log:: warn;
5+ use x86_64:: registers:: control:: Cr3 ;
46use x86_64:: structures:: paging:: mapper:: CleanUp ;
57use x86_64:: structures:: paging:: {
6- Mapper , Page , PageSize , PageTableFlags , PhysFrame , RecursivePageTable ,
8+ Mapper , OffsetPageTable , Page , PageSize , PageTable , PageTableFlags , PhysFrame ,
79} ;
810
911use super :: physicalmem:: PhysAlloc ;
1012
1113pub fn map < S > ( virtual_address : usize , physical_address : usize , count : usize , flags : PageTableFlags )
1214where
1315 S : PageSize + Debug ,
14- RecursivePageTable < ' static > : Mapper < S > ,
16+ for < ' a > OffsetPageTable < ' a > : Mapper < S > ,
1517{
1618 let pages = {
1719 let start = Page :: < S > :: containing_address ( x86_64:: VirtAddr :: new ( virtual_address as u64 ) ) ;
3739 ) ;
3840
3941 let flags = flags | PageTableFlags :: PRESENT ;
40- let mut table = unsafe { recursive_page_table ( ) } ;
42+ let mut table = unsafe { identity_mapped_page_table ( ) } ;
4143
4244 for ( page, frame) in pages. zip ( frames) {
4345 unsafe {
@@ -57,7 +59,7 @@ pub fn map_range<S>(
5759 mut flags : PageTableFlags ,
5860) where
5961 S : PageSize + Debug ,
60- RecursivePageTable < ' static > : Mapper < S > ,
62+ for < ' a > OffsetPageTable < ' a > : Mapper < S > ,
6163{
6264 let first_page = Page :: < S > :: containing_address ( x86_64:: VirtAddr :: new ( virtual_start as u64 ) ) ;
6365 let first_frame = PhysFrame :: containing_address ( x86_64:: PhysAddr :: new ( phys_start as u64 ) ) ;
@@ -70,7 +72,7 @@ pub fn map_range<S>(
7072 to_end = last_frame. start_address( )
7173 ) ;
7274 flags |= PageTableFlags :: PRESENT ;
73- let mut table = unsafe { recursive_page_table ( ) } ;
75+ let mut table = unsafe { identity_mapped_page_table ( ) } ;
7476 let page_range = core:: iter:: successors ( Some ( first_page) , |page| Some ( * page + 1u64 ) ) ;
7577 let frame_range = PhysFrame :: < S > :: range ( first_frame, last_frame) ;
7678 for ( page, frame) in core:: iter:: zip ( page_range, frame_range) {
@@ -84,16 +86,17 @@ pub fn map_range<S>(
8486}
8587
8688pub fn clean_up ( ) {
87- let mut table = unsafe { recursive_page_table ( ) } ;
89+ let mut table = unsafe { identity_mapped_page_table ( ) } ;
8890
8991 unsafe { table. clean_up ( & mut PhysAlloc ) }
9092}
9193
92- unsafe fn recursive_page_table ( ) -> RecursivePageTable < ' static > {
93- let level_4_table_addr = 0xFFFF_FFFF_FFFF_F000_usize ;
94- let level_4_table_ptr = sptr:: from_exposed_addr_mut ( level_4_table_addr) ;
94+ pub unsafe fn identity_mapped_page_table ( ) -> OffsetPageTable < ' static > {
95+ let level_4_table_addr = Cr3 :: read ( ) . 0 . start_address ( ) . as_u64 ( ) ;
96+ let level_4_table_ptr =
97+ ptr:: with_exposed_provenance_mut :: < PageTable > ( level_4_table_addr. try_into ( ) . unwrap ( ) ) ;
9598 unsafe {
96- let level_4_table = & mut * ( level_4_table_ptr) ;
97- RecursivePageTable :: new ( level_4_table) . unwrap ( )
99+ let level_4_table = level_4_table_ptr. as_mut ( ) . unwrap ( ) ;
100+ OffsetPageTable :: new ( level_4_table, x86_64 :: addr :: VirtAddr :: new ( 0x0 ) )
98101 }
99102}
0 commit comments