@@ -3,7 +3,7 @@ use aarch64::paging::{memory_attribute::*, PageTable, PageTableAttribute, PageTa
3
3
use aarch64:: paging:: { Page , PhysFrame , Size1GiB , Size2MiB , Size4KiB } ;
4
4
use aarch64:: { asm:: * , barrier, regs:: * } ;
5
5
use bcm2837:: addr:: { phys_to_virt, virt_to_phys} ;
6
- use bcm2837:: addr:: { PHYSICAL_IO_START , PHYSICAL_IO_END , PHYSICAL_MEMORY_OFFSET } ;
6
+ use bcm2837:: addr:: { PHYSICAL_IO_END , PHYSICAL_IO_START , PHYSICAL_MEMORY_OFFSET } ;
7
7
use bcm2837:: atags:: Atags ;
8
8
use bootinfo:: BootInfo ;
9
9
use core:: ptr;
@@ -15,6 +15,15 @@ const ALIGN_2MB: u64 = 0x200000;
15
15
16
16
global_asm ! ( include_str!( "boot.S" ) ) ;
17
17
18
+ fn map_2mib ( p2 : & mut PageTable , start : usize , end : usize , flag : EF , attr : PageTableAttribute ) {
19
+ for frame in PhysFrame :: < Size2MiB > :: range_of ( start as u64 , end as u64 ) {
20
+ let paddr = frame. start_address ( ) ;
21
+ let vaddr = VirtAddr :: new ( phys_to_virt ( paddr. as_u64 ( ) as usize ) as u64 ) ;
22
+ let page = Page :: < Size2MiB > :: containing_address ( vaddr) ;
23
+ p2[ page. p2_index ( ) ] . set_block :: < Size2MiB > ( paddr, flag, attr) ;
24
+ }
25
+ }
26
+
18
27
// TODO: set segments permission
19
28
fn create_page_table ( start_paddr : usize , end_paddr : usize ) {
20
29
#[ repr( align( 4096 ) ) ]
@@ -35,19 +44,11 @@ fn create_page_table(start_paddr: usize, end_paddr: usize) {
35
44
36
45
let block_flags = EF :: default_block ( ) | EF :: UXN ;
37
46
// normal memory
38
- for frame in PhysFrame :: < Size2MiB > :: range_of ( start_paddr as u64 , end_paddr as u64 ) {
39
- let paddr = frame. start_address ( ) ;
40
- let vaddr = VirtAddr :: new ( phys_to_virt ( paddr. as_u64 ( ) as usize ) as u64 ) ;
41
- let page = Page :: < Size2MiB > :: containing_address ( vaddr) ;
42
- p2[ page. p2_index ( ) ] . set_block :: < Size2MiB > ( paddr, block_flags, MairNormal :: attr_value ( ) ) ;
43
- }
47
+ map_2mib ( p2, start_paddr, end_paddr, block_flags, MairNormal :: attr_value ( ) ) ;
48
+ // normal non-cacheable memory
49
+ map_2mib ( p2, end_paddr, PHYSICAL_IO_START , block_flags | EF :: PXN , MairNormalNonCacheable :: attr_value ( ) ) ;
44
50
// device memory
45
- for frame in PhysFrame :: < Size2MiB > :: range_of ( PHYSICAL_IO_START as u64 , PHYSICAL_IO_END as u64 ) {
46
- let paddr = frame. start_address ( ) ;
47
- let vaddr = VirtAddr :: new ( phys_to_virt ( paddr. as_u64 ( ) as usize ) as u64 ) ;
48
- let page = Page :: < Size2MiB > :: containing_address ( vaddr) ;
49
- p2[ page. p2_index ( ) ] . set_block :: < Size2MiB > ( paddr, block_flags | EF :: PXN , MairDevice :: attr_value ( ) ) ;
50
- }
51
+ map_2mib ( p2, PHYSICAL_IO_START , PHYSICAL_IO_END , block_flags | EF :: PXN , MairDevice :: attr_value ( ) ) ;
51
52
52
53
p3[ 0 ] . set_frame ( frame_lvl2, EF :: default_table ( ) , PageTableAttribute :: new ( 0 , 0 , 0 ) ) ;
53
54
p3[ 1 ] . set_block :: < Size1GiB > ( PhysAddr :: new ( PHYSICAL_IO_END as u64 ) , block_flags | EF :: PXN , MairDevice :: attr_value ( ) ) ;
0 commit comments