@@ -2,17 +2,26 @@ use core::ops::Range;
2
2
3
3
use axplat:: mem:: { MemIf , RawRange } ;
4
4
use heapless:: Vec ;
5
- use memory_addr:: { PhysAddr , VirtAddr } ;
5
+ use memory_addr:: { MemoryAddr , PhysAddr , VirtAddr } ;
6
6
use pie_boot:: { KIMAGE_VADDR , KLINER_OFFSET , MemoryRegionKind , boot_info} ;
7
- use spin:: { Mutex , Once } ;
7
+ use spin:: { Mutex , Once , RwLock } ;
8
8
9
9
struct MemIfImpl ;
10
10
11
11
static RAM_LIST : Once < Vec < RawRange , 32 > > = Once :: new ( ) ;
12
12
static RESERVED_LIST : Once < Vec < RawRange , 32 > > = Once :: new ( ) ;
13
- static MMIO : Mutex < Vec < RawRange , 32 > > = Mutex :: new ( Vec :: new ( ) ) ;
13
+ static MMIO : Once < Vec < RawRange , 32 > > = Once :: new ( ) ;
14
+ static mut VA_OFFSET : usize = 0 ;
15
+
16
+ fn va_offset ( ) -> usize {
17
+ unsafe { VA_OFFSET }
18
+ }
14
19
15
20
pub fn setup ( ) {
21
+ unsafe {
22
+ VA_OFFSET = boot_info ( ) . kimage_start_vma as usize - boot_info ( ) . kimage_start_lma as usize
23
+ } ;
24
+
16
25
RAM_LIST . call_once ( || {
17
26
let mut ram_list = Vec :: new ( ) ;
18
27
for region in boot_info ( )
@@ -28,6 +37,7 @@ pub fn setup() {
28
37
29
38
RESERVED_LIST . call_once ( || {
30
39
let mut ram_list = Vec :: new ( ) ;
40
+
31
41
for region in boot_info ( )
32
42
. memory_regions
33
43
. iter ( )
@@ -43,6 +53,16 @@ pub fn setup() {
43
53
}
44
54
ram_list
45
55
} ) ;
56
+
57
+ MMIO . call_once ( || {
58
+ let mut mmio_list = Vec :: new ( ) ;
59
+ if let Some ( debug) = & boot_info ( ) . debug_console {
60
+ let start = ( debug. base as usize ) . align_down_4k ( ) ;
61
+ let _ = mmio_list. push ( ( start, 0x1000 ) ) ;
62
+ }
63
+
64
+ mmio_list
65
+ } ) ;
46
66
}
47
67
48
68
#[ impl_plat_interface]
@@ -68,20 +88,20 @@ impl MemIf for MemIfImpl {
68
88
69
89
/// Returns all device memory (MMIO) ranges on the platform.
70
90
fn mmio_ranges ( ) -> & ' static [ RawRange ] {
71
- & [ ]
91
+ MMIO . wait ( )
72
92
}
73
93
74
94
fn phys_to_virt ( p : PhysAddr ) -> VirtAddr {
75
95
if kimage_range_phys ( ) . contains ( & p) {
76
- VirtAddr :: from_usize ( p. as_usize ( ) + KIMAGE_VADDR )
96
+ VirtAddr :: from_usize ( p. as_usize ( ) + va_offset ( ) )
77
97
} else {
78
98
// MMIO or other reserved regions
79
99
VirtAddr :: from_usize ( p. as_usize ( ) + KLINER_OFFSET )
80
100
}
81
101
}
82
102
fn virt_to_phys ( p : VirtAddr ) -> PhysAddr {
83
103
if ( KIMAGE_VADDR ..KLINER_OFFSET ) . contains ( & p. as_usize ( ) ) {
84
- PhysAddr :: from_usize ( p. as_usize ( ) - KIMAGE_VADDR )
104
+ PhysAddr :: from_usize ( p. as_usize ( ) - va_offset ( ) )
85
105
} else {
86
106
PhysAddr :: from_usize ( p. as_usize ( ) - KLINER_OFFSET )
87
107
}
@@ -94,7 +114,7 @@ fn kimage_range_phys() -> Range<PhysAddr> {
94
114
fn _ekernel ( ) ;
95
115
}
96
116
97
- let start = PhysAddr :: from_usize ( _skernel as usize - KIMAGE_VADDR ) ;
98
- let end = PhysAddr :: from_usize ( _ekernel as usize - KIMAGE_VADDR ) ;
117
+ let start = PhysAddr :: from_usize ( KIMAGE_VADDR - va_offset ( ) ) ;
118
+ let end = PhysAddr :: from_usize ( _ekernel as usize - va_offset ( ) ) ;
99
119
start..end
100
120
}
0 commit comments