@@ -20,6 +20,8 @@ use armv9a::{bits_in_reg, define_bitfield, define_bits, define_mask};
20
20
pub const NUM_ROOT_PAGE : usize = 2 ;
21
21
pub const ALIGN_ROOT_PAGE : usize = 2 ;
22
22
23
+ const NUM_ENTRIES : usize = 512 ; // CCH added
24
+
23
25
pub mod tlbi_ns {
24
26
pub const IPAS_S : u64 = 0b0 ;
25
27
pub const IPAS_NS : u64 = 0b1 ;
@@ -34,27 +36,26 @@ const ENTR8: usize = ENTR1 * 8;
34
36
const ENTR16 : usize = ENTR1 * 16 ;
35
37
36
38
type RootTBL < ' a , const L : usize , const N : usize , const E : usize > =
37
- & ' a mut PageTable < GuestPhysAddr , RootTable < { L } , { N } > , entry:: Entry , { E } > ;
39
+ & ' a mut PageTable < GuestPhysAddr , entry:: Entry , { E } > ;
38
40
39
41
pub enum Root < ' a > {
40
- L0N1 ( RootTBL < ' a , 0 , 1 , ENTR1 > ) ,
41
- L0N16 ( RootTBL < ' a , 0 , 16 , ENTR16 > ) ,
42
- L1N1 ( RootTBL < ' a , 1 , 1 , ENTR1 > ) ,
43
- L1N2 ( RootTBL < ' a , 1 , 2 , ENTR2 > ) ,
44
- L1N8 ( RootTBL < ' a , 1 , 8 , ENTR8 > ) ,
45
- L2N4 ( RootTBL < ' a , 2 , 4 , ENTR4 > ) ,
46
- L2N8 ( RootTBL < ' a , 2 , 8 , ENTR8 > ) ,
47
- L2N16 ( RootTBL < ' a , 2 , 16 , ENTR16 > ) ,
42
+ L0N1 ( RootTBL < ' a , 0 , 1 , ENTR1 > , usize ) ,
43
+ L0N16 ( RootTBL < ' a , 0 , 16 , ENTR16 > , usize ) ,
44
+ L1N1 ( RootTBL < ' a , 1 , 1 , ENTR1 > , usize ) ,
45
+ L1N2 ( RootTBL < ' a , 1 , 2 , ENTR2 > , usize ) ,
46
+ L1N8 ( RootTBL < ' a , 1 , 8 , ENTR8 > , usize ) ,
47
+ L2N4 ( RootTBL < ' a , 2 , 4 , ENTR4 > , usize ) ,
48
+ L2N8 ( RootTBL < ' a , 2 , 8 , ENTR8 > , usize ) ,
49
+ L2N16 ( RootTBL < ' a , 2 , 16 , ENTR16 > , usize ) ,
48
50
}
49
51
50
52
#[ macro_export]
51
53
macro_rules! init_table {
52
54
( $level: expr, $pages: expr, $base: expr) => {
53
55
& mut * PageTable :: <
54
56
GuestPhysAddr ,
55
- RootTable <$level, $pages>,
56
57
entry:: Entry ,
57
- { < RootTable <$level , $ pages> as Level > :: NUM_ENTRIES } ,
58
+ { $ pages * NUM_ENTRIES } ,
58
59
>:: new_with_base( $base)
59
60
. unwrap( )
60
61
} ;
@@ -76,24 +77,24 @@ impl<'a> Stage2Translation<'a> {
76
77
let root_pgtlb = match root_level {
77
78
0 => unsafe {
78
79
match root_pages {
79
- 1 => Root :: L0N1 ( init_table ! ( 0 , 1 , rtt_base) ) ,
80
- 16 => Root :: L0N16 ( init_table ! ( 0 , 16 , rtt_base) ) ,
80
+ 1 => Root :: L0N1 ( init_table ! ( 0 , 1 , rtt_base) , 0 ) ,
81
+ 16 => Root :: L0N16 ( init_table ! ( 0 , 16 , rtt_base) , 0 ) ,
81
82
_ => todo ! ( ) ,
82
83
}
83
84
} ,
84
85
1 => unsafe {
85
86
match root_pages {
86
- 1 => Root :: L1N1 ( init_table ! ( 1 , 1 , rtt_base) ) ,
87
- 2 => Root :: L1N2 ( init_table ! ( 1 , 2 , rtt_base) ) ,
88
- 8 => Root :: L1N8 ( init_table ! ( 1 , 8 , rtt_base) ) ,
87
+ 1 => Root :: L1N1 ( init_table ! ( 1 , 1 , rtt_base) , 1 ) ,
88
+ 2 => Root :: L1N2 ( init_table ! ( 1 , 2 , rtt_base) , 1 ) ,
89
+ 8 => Root :: L1N8 ( init_table ! ( 1 , 8 , rtt_base) , 1 ) ,
89
90
_ => todo ! ( ) ,
90
91
}
91
92
} ,
92
93
2 => unsafe {
93
94
match root_pages {
94
- 4 => Root :: L2N4 ( init_table ! ( 2 , 4 , rtt_base) ) ,
95
- 8 => Root :: L2N8 ( init_table ! ( 2 , 8 , rtt_base) ) ,
96
- 16 => Root :: L2N16 ( init_table ! ( 2 , 16 , rtt_base) ) ,
95
+ 4 => Root :: L2N4 ( init_table ! ( 2 , 4 , rtt_base) , 2 ) ,
96
+ 8 => Root :: L2N8 ( init_table ! ( 2 , 8 , rtt_base) , 2 ) ,
97
+ 16 => Root :: L2N16 ( init_table ! ( 2 , 16 , rtt_base) , 2 ) ,
97
98
_ => todo ! ( ) ,
98
99
}
99
100
} ,
@@ -158,46 +159,46 @@ impl<'a> MemAlloc for Stage2Translation<'a> {
158
159
#[ macro_export]
159
160
// ipa_to_pa closure
160
161
macro_rules! to_pa {
161
- ( $root: expr, $guest: expr, $level: expr, $pa: expr) => {
162
- $root. entry( $guest, $level, false , |entry| {
162
+ ( $root: expr, $guest: expr, $level: expr, $pa: expr, $root_level : expr ) => {
163
+ $root. entry( $root_level , $ guest, $level, false , |entry| {
163
164
$pa = entry. address( 0 ) ;
164
165
Ok ( None )
165
- } )
166
+ } , true )
166
167
} ;
167
168
}
168
169
169
170
// ipa_to_pa closure
170
171
macro_rules! to_pte {
171
- ( $root: expr, $guest: expr, $level: expr, $pte: expr) => {
172
- $root. entry( $guest, $level, true , |entry| {
172
+ ( $root: expr, $guest: expr, $level: expr, $pte: expr, $root_level : expr ) => {
173
+ $root. entry( $root_level , $ guest, $level, true , |entry| {
173
174
$pte = entry. pte( ) ;
174
175
Ok ( None )
175
- } )
176
+ } , true )
176
177
} ;
177
178
}
178
179
179
180
// ipa_to_pte_set clousre
180
181
macro_rules! set_pte {
181
- ( $root: expr, $guest: expr, $level: expr, $val: expr) => {
182
- $root. entry( $guest, $level, true , |entry| {
182
+ ( $root: expr, $guest: expr, $level: expr, $val: expr, $root_level : expr ) => {
183
+ $root. entry( $root_level , $ guest, $level, true , |entry| {
183
184
let pte = entry. mut_pte( ) ;
184
185
* pte = RawPTE ( $val) ;
185
186
Ok ( None )
186
- } )
187
+ } , true )
187
188
} ;
188
189
}
189
190
190
191
impl < ' a > IPATranslation for Stage2Translation < ' a > {
191
192
fn get_base_address ( & self ) -> * const c_void {
192
193
match & self . root_pgtlb {
193
- Root :: L2N8 ( c) => * c as * const _ as * const c_void , // most likely first, for linux-realm
194
- Root :: L0N1 ( a) => * a as * const _ as * const c_void ,
195
- Root :: L0N16 ( a) => * a as * const _ as * const c_void ,
196
- Root :: L1N1 ( b) => * b as * const _ as * const c_void ,
197
- Root :: L1N2 ( b) => * b as * const _ as * const c_void ,
198
- Root :: L1N8 ( b) => * b as * const _ as * const c_void ,
199
- Root :: L2N4 ( c) => * c as * const _ as * const c_void ,
200
- Root :: L2N16 ( c) => * c as * const _ as * const c_void ,
194
+ Root :: L2N8 ( c, _ ) => * c as * const _ as * const c_void , // most likely first, for linux-realm
195
+ Root :: L0N1 ( a, _ ) => * a as * const _ as * const c_void ,
196
+ Root :: L0N16 ( a, _ ) => * a as * const _ as * const c_void ,
197
+ Root :: L1N1 ( b, _ ) => * b as * const _ as * const c_void ,
198
+ Root :: L1N2 ( b, _ ) => * b as * const _ as * const c_void ,
199
+ Root :: L1N8 ( b, _ ) => * b as * const _ as * const c_void ,
200
+ Root :: L2N4 ( c, _ ) => * c as * const _ as * const c_void ,
201
+ Root :: L2N16 ( c, _ ) => * c as * const _ as * const c_void ,
201
202
}
202
203
}
203
204
@@ -217,14 +218,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
217
218
let mut pa = None ;
218
219
219
220
let res = match & mut self . root_pgtlb {
220
- Root :: L2N8 ( root) => to_pa ! ( root, guest, level, pa) , // most likely first, for linux-realm
221
- Root :: L0N1 ( root) => to_pa ! ( root, guest, level, pa) ,
222
- Root :: L0N16 ( root) => to_pa ! ( root, guest, level, pa) ,
223
- Root :: L1N1 ( root) => to_pa ! ( root, guest, level, pa) ,
224
- Root :: L1N2 ( root) => to_pa ! ( root, guest, level, pa) ,
225
- Root :: L1N8 ( root) => to_pa ! ( root, guest, level, pa) ,
226
- Root :: L2N4 ( root) => to_pa ! ( root, guest, level, pa) ,
227
- Root :: L2N16 ( root) => to_pa ! ( root, guest, level, pa) ,
221
+ Root :: L2N8 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) , // most likely first, for linux-realm
222
+ Root :: L0N1 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
223
+ Root :: L0N16 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
224
+ Root :: L1N1 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
225
+ Root :: L1N2 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
226
+ Root :: L1N8 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
227
+ Root :: L2N4 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
228
+ Root :: L2N16 ( root, root_level ) => to_pa ! ( root, guest, level, pa, * root_level ) ,
228
229
} ;
229
230
if res. is_ok ( ) {
230
231
pa
@@ -248,14 +249,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
248
249
let guest = Page :: < BasePageSize , GuestPhysAddr > :: including_address ( guest) ;
249
250
let mut pte = 0 ;
250
251
let res = match & mut self . root_pgtlb {
251
- Root :: L2N8 ( root) => to_pte ! ( root, guest, level, pte) , // most likely first, for linux-realm
252
- Root :: L0N1 ( root) => to_pte ! ( root, guest, level, pte) ,
253
- Root :: L0N16 ( root) => to_pte ! ( root, guest, level, pte) ,
254
- Root :: L1N1 ( root) => to_pte ! ( root, guest, level, pte) ,
255
- Root :: L1N2 ( root) => to_pte ! ( root, guest, level, pte) ,
256
- Root :: L1N8 ( root) => to_pte ! ( root, guest, level, pte) ,
257
- Root :: L2N4 ( root) => to_pte ! ( root, guest, level, pte) ,
258
- Root :: L2N16 ( root) => to_pte ! ( root, guest, level, pte) ,
252
+ Root :: L2N8 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) , // most likely first, for linux-realm
253
+ Root :: L0N1 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
254
+ Root :: L0N16 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
255
+ Root :: L1N1 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
256
+ Root :: L1N2 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
257
+ Root :: L1N8 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
258
+ Root :: L2N4 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
259
+ Root :: L2N16 ( root, root_level ) => to_pte ! ( root, guest, level, pte, * root_level ) ,
259
260
} ;
260
261
if let Ok ( x) = res {
261
262
Some ( ( pte, x. 1 ) )
@@ -272,14 +273,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
272
273
) -> Result < ( ) , Error > {
273
274
let guest = Page :: < BasePageSize , GuestPhysAddr > :: including_address ( guest) ;
274
275
let res = match & mut self . root_pgtlb {
275
- Root :: L2N8 ( root) => set_pte ! ( root, guest, level, val) ,
276
- Root :: L0N1 ( root) => set_pte ! ( root, guest, level, val) ,
277
- Root :: L0N16 ( root) => set_pte ! ( root, guest, level, val) ,
278
- Root :: L1N1 ( root) => set_pte ! ( root, guest, level, val) ,
279
- Root :: L1N2 ( root) => set_pte ! ( root, guest, level, val) ,
280
- Root :: L1N8 ( root) => set_pte ! ( root, guest, level, val) ,
281
- Root :: L2N4 ( root) => set_pte ! ( root, guest, level, val) ,
282
- Root :: L2N16 ( root) => set_pte ! ( root, guest, level, val) ,
276
+ Root :: L2N8 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
277
+ Root :: L0N1 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
278
+ Root :: L0N16 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
279
+ Root :: L1N1 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
280
+ Root :: L1N2 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
281
+ Root :: L1N8 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
282
+ Root :: L2N4 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
283
+ Root :: L2N16 ( root, root_level ) => set_pte ! ( root, guest, level, val, * root_level ) ,
283
284
} ;
284
285
if let Ok ( _x) = res {
285
286
Ok ( ( ) )
0 commit comments