@@ -39,14 +39,14 @@ type RootTBL<'a, const L: usize, const N: usize, const E: usize> =
39
39
& ' a mut PageTable < GuestPhysAddr , entry:: Entry , { E } > ;
40
40
41
41
pub enum Root < ' a > {
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 ) ,
42
+ L0N1 ( RootTBL < ' a , 0 , 1 , ENTR1 > , usize , usize ) ,
43
+ L0N16 ( RootTBL < ' a , 0 , 16 , ENTR16 > , usize , usize ) ,
44
+ L1N1 ( RootTBL < ' a , 1 , 1 , ENTR1 > , usize , usize ) ,
45
+ L1N2 ( RootTBL < ' a , 1 , 2 , ENTR2 > , usize , usize ) ,
46
+ L1N8 ( RootTBL < ' a , 1 , 8 , ENTR8 > , usize , usize ) ,
47
+ L2N4 ( RootTBL < ' a , 2 , 4 , ENTR4 > , usize , usize ) ,
48
+ L2N8 ( RootTBL < ' a , 2 , 8 , ENTR8 > , usize , usize ) ,
49
+ L2N16 ( RootTBL < ' a , 2 , 16 , ENTR16 > , usize , usize ) ,
50
50
}
51
51
52
52
#[ macro_export]
@@ -77,24 +77,24 @@ impl<'a> Stage2Translation<'a> {
77
77
let root_pgtlb = match root_level {
78
78
0 => unsafe {
79
79
match root_pages {
80
- 1 => Root :: L0N1 ( init_table ! ( 0 , 1 , rtt_base) , 0 ) ,
81
- 16 => Root :: L0N16 ( init_table ! ( 0 , 16 , rtt_base) , 0 ) ,
80
+ 1 => Root :: L0N1 ( init_table ! ( 0 , 1 , rtt_base) , 0 , 1 ) ,
81
+ 16 => Root :: L0N16 ( init_table ! ( 0 , 16 , rtt_base) , 0 , 16 ) ,
82
82
_ => todo ! ( ) ,
83
83
}
84
84
} ,
85
85
1 => unsafe {
86
86
match root_pages {
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 ) ,
87
+ 1 => Root :: L1N1 ( init_table ! ( 1 , 1 , rtt_base) , 1 , 1 ) ,
88
+ 2 => Root :: L1N2 ( init_table ! ( 1 , 2 , rtt_base) , 1 , 2 ) ,
89
+ 8 => Root :: L1N8 ( init_table ! ( 1 , 8 , rtt_base) , 1 , 8 ) ,
90
90
_ => todo ! ( ) ,
91
91
}
92
92
} ,
93
93
2 => unsafe {
94
94
match root_pages {
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 ) ,
95
+ 4 => Root :: L2N4 ( init_table ! ( 2 , 4 , rtt_base) , 2 , 4 ) ,
96
+ 8 => Root :: L2N8 ( init_table ! ( 2 , 8 , rtt_base) , 2 , 8 ) ,
97
+ 16 => Root :: L2N16 ( init_table ! ( 2 , 16 , rtt_base) , 2 , 16 ) ,
98
98
_ => todo ! ( ) ,
99
99
}
100
100
} ,
@@ -159,46 +159,46 @@ impl<'a> MemAlloc for Stage2Translation<'a> {
159
159
#[ macro_export]
160
160
// ipa_to_pa closure
161
161
macro_rules! to_pa {
162
- ( $root: expr, $guest: expr, $level: expr, $pa: expr, $root_level: expr) => {
162
+ ( $root: expr, $guest: expr, $level: expr, $pa: expr, $root_level: expr, $root_n : expr ) => {
163
163
$root. entry( $root_level, $guest, $level, false , |entry| {
164
164
$pa = entry. address( 0 ) ;
165
165
Ok ( None )
166
- } , true )
166
+ } , true , $root_n )
167
167
} ;
168
168
}
169
169
170
170
// ipa_to_pa closure
171
171
macro_rules! to_pte {
172
- ( $root: expr, $guest: expr, $level: expr, $pte: expr, $root_level: expr) => {
172
+ ( $root: expr, $guest: expr, $level: expr, $pte: expr, $root_level: expr, $root_n : expr ) => {
173
173
$root. entry( $root_level, $guest, $level, true , |entry| {
174
174
$pte = entry. pte( ) ;
175
175
Ok ( None )
176
- } , true )
176
+ } , true , $root_n )
177
177
} ;
178
178
}
179
179
180
180
// ipa_to_pte_set clousre
181
181
macro_rules! set_pte {
182
- ( $root: expr, $guest: expr, $level: expr, $val: expr, $root_level: expr) => {
182
+ ( $root: expr, $guest: expr, $level: expr, $val: expr, $root_level: expr, $root_n : expr ) => {
183
183
$root. entry( $root_level, $guest, $level, true , |entry| {
184
184
let pte = entry. mut_pte( ) ;
185
185
* pte = RawPTE ( $val) ;
186
186
Ok ( None )
187
- } , true )
187
+ } , true , $root_n )
188
188
} ;
189
189
}
190
190
191
191
impl < ' a > IPATranslation for Stage2Translation < ' a > {
192
192
fn get_base_address ( & self ) -> * const c_void {
193
193
match & self . root_pgtlb {
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 ,
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 ,
202
202
}
203
203
}
204
204
@@ -218,14 +218,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
218
218
let mut pa = None ;
219
219
220
220
let res = match & mut self . root_pgtlb {
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) ,
221
+ Root :: L2N8 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) , // most likely first, for linux-realm
222
+ Root :: L0N1 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
223
+ Root :: L0N16 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
224
+ Root :: L1N1 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
225
+ Root :: L1N2 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
226
+ Root :: L1N8 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
227
+ Root :: L2N4 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
228
+ Root :: L2N16 ( root, root_level, root_n ) => to_pa ! ( root, guest, level, pa, * root_level, * root_n ) ,
229
229
} ;
230
230
if res. is_ok ( ) {
231
231
pa
@@ -249,14 +249,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
249
249
let guest = Page :: < BasePageSize , GuestPhysAddr > :: including_address ( guest) ;
250
250
let mut pte = 0 ;
251
251
let res = match & mut self . root_pgtlb {
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) ,
252
+ Root :: L2N8 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) , // most likely first, for linux-realm
253
+ Root :: L0N1 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
254
+ Root :: L0N16 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
255
+ Root :: L1N1 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
256
+ Root :: L1N2 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
257
+ Root :: L1N8 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
258
+ Root :: L2N4 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
259
+ Root :: L2N16 ( root, root_level, root_n ) => to_pte ! ( root, guest, level, pte, * root_level, * root_n ) ,
260
260
} ;
261
261
if let Ok ( x) = res {
262
262
Some ( ( pte, x. 1 ) )
@@ -273,14 +273,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
273
273
) -> Result < ( ) , Error > {
274
274
let guest = Page :: < BasePageSize , GuestPhysAddr > :: including_address ( guest) ;
275
275
let res = match & mut self . root_pgtlb {
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) ,
276
+ Root :: L2N8 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
277
+ Root :: L0N1 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
278
+ Root :: L0N16 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
279
+ Root :: L1N1 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
280
+ Root :: L1N2 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
281
+ Root :: L1N8 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
282
+ Root :: L2N4 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
283
+ Root :: L2N16 ( root, root_level, root_n ) => set_pte ! ( root, guest, level, val, * root_level, * root_n ) ,
284
284
} ;
285
285
if let Ok ( _x) = res {
286
286
Ok ( ( ) )
0 commit comments