5
5
/// 4KiB tables here, although it supports various sizes of pages.
6
6
use crate :: {
7
7
kmem:: {
8
- boottext_range, bss_range, data_range, from_ptr_to_physaddr , physaddr_as_ptr_mut ,
9
- rodata_range, text_range,
8
+ boottext_range, bss_range, data_range, from_ptr_to_physaddr_offset_from_kzero ,
9
+ physaddr_as_ptr_mut , rodata_range, text_range,
10
10
} ,
11
11
pagealloc,
12
12
param:: KZERO ,
@@ -487,7 +487,7 @@ impl RootPageTable {
487
487
// TODO Only do this if self != kernel_root()
488
488
let old_recursive_entry = root_page_table ( pgtype) . entries [ 511 ] ;
489
489
let temp_recursive_entry = Entry :: rw_kernel_data ( )
490
- . with_phys_addr ( from_ptr_to_physaddr ( self ) )
490
+ . with_phys_addr ( from_ptr_to_physaddr_offset_from_kzero ( self ) )
491
491
. with_page_or_table ( true ) ;
492
492
493
493
unsafe {
@@ -680,25 +680,16 @@ fn print_pte_table(indent: usize, i: usize, pte: Entry, table_va: usize) {
680
680
}
681
681
682
682
pub unsafe fn init_kernel_page_tables (
683
- page_table : & mut RootPageTable ,
683
+ new_kernel_root_page_table : & mut RootPageTable ,
684
684
dtb_range : PhysRange ,
685
685
available_mem : PhysRange ,
686
686
) {
687
- pagealloc:: init_page_allocator ( ) ;
688
-
689
687
// We use recursive page tables, but we have to be careful in the init call,
690
688
// since the kpage_table is not currently pointed to by ttbr1_el1. Any
691
689
// recursive addressing of (511, 511, 511, 511) always points to the
692
690
// physical address of the root page table, which isn't what we want here
693
691
// because kpage_table hasn't been switched to yet.
694
-
695
- // Write the recursive entry
696
- unsafe {
697
- let entry = Entry :: rw_kernel_data ( )
698
- . with_phys_addr ( from_ptr_to_physaddr ( page_table) )
699
- . with_page_or_table ( true ) ;
700
- write_volatile ( & mut page_table. entries [ 511 ] , entry) ;
701
- }
692
+ unsafe { init_empty_root_page_table ( new_kernel_root_page_table) } ;
702
693
703
694
// TODO leave the first page unmapped to catch null pointer dereferences in unsafe code
704
695
let custom_map = {
@@ -725,7 +716,7 @@ pub unsafe fn init_kernel_page_tables(
725
716
726
717
println ! ( "Memory map:" ) ;
727
718
for ( name, range, flags, page_size) in custom_map. iter ( ) {
728
- let mapped_range = page_table
719
+ let mapped_range = new_kernel_root_page_table
729
720
. map_phys_range (
730
721
name,
731
722
range,
@@ -748,13 +739,19 @@ pub unsafe fn init_kernel_page_tables(
748
739
}
749
740
}
750
741
751
- pub unsafe fn init_user_page_tables ( page_table : & mut RootPageTable ) {
752
- // Write the recursive entry
742
+ pub unsafe fn init_user_page_tables ( new_user_root_page_table : & mut RootPageTable ) {
743
+ unsafe { init_empty_root_page_table ( new_user_root_page_table) } ;
744
+ }
745
+
746
+ /// Given an empty, statically allocated page table. We need to write a
747
+ /// recursive entry in the last entry. To do this, we need to know the physical
748
+ /// address, but all we have is the virtual address
749
+ unsafe fn init_empty_root_page_table ( root_page_table : & mut RootPageTable ) {
753
750
unsafe {
754
751
let entry = Entry :: rw_kernel_data ( )
755
- . with_phys_addr ( from_ptr_to_physaddr ( page_table ) )
752
+ . with_phys_addr ( from_ptr_to_physaddr_offset_from_kzero ( root_page_table ) )
756
753
. with_page_or_table ( true ) ;
757
- write_volatile ( & mut page_table . entries [ 511 ] , entry) ;
754
+ write_volatile ( & mut root_page_table . entries [ 511 ] , entry) ;
758
755
}
759
756
}
760
757
@@ -797,7 +794,7 @@ fn ttbr1_el1() -> PhysAddr {
797
794
pub unsafe fn switch ( page_table : & RootPageTable , pgtype : RootPageTableType ) {
798
795
#[ cfg( not( test) ) ]
799
796
unsafe {
800
- let pt_phys = from_ptr_to_physaddr ( page_table) . addr ( ) ;
797
+ let pt_phys = from_ptr_to_physaddr_offset_from_kzero ( page_table) . addr ( ) ;
801
798
// https://forum.osdev.org/viewtopic.php?t=36412&p=303237
802
799
match pgtype {
803
800
RootPageTableType :: User => {
0 commit comments