Skip to content

Commit fcb1cc8

Browse files
committed
Use no_level for stage2 translation
- Pass build errors with is_root - Pass root level in macros
1 parent 32f5532 commit fcb1cc8

File tree

4 files changed

+95
-65
lines changed

4 files changed

+95
-65
lines changed

rmm/src/mm/page_table/entry.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl page_table::Entry for Entry {
108108
}
109109
}
110110

111-
fn index_with_level(addr: usize, level: usize) -> usize {
111+
fn index_with_level(addr: usize, level: usize, _is_root: bool) -> usize {
112112
match level {
113113
0 => RawGPA::from(addr).get_masked_value(RawGPA::L0Index) as usize,
114114
1 => RawGPA::from(addr).get_masked_value(RawGPA::L1Index) as usize,

rmm/src/realm/mm/page_table/entry.rs

+29
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,35 @@ impl page_table::Entry for Entry {
113113
}
114114
}
115115

116+
fn index_with_level(addr: usize, level: usize, is_root: bool) -> usize {
117+
match level {
118+
0 => RawGPA::from(addr).get_masked_value(RawGPA::L0Index) as usize,
119+
1 => {
120+
if is_root {
121+
// We know that refering one direct parent table is enough
122+
// because concatenation of the initial lookup table is upto 16.
123+
let l0 = RawGPA::from(addr).get_masked_value(RawGPA::L0Index) as usize;
124+
let l1 = RawGPA::from(addr).get_masked_value(RawGPA::L1Index) as usize;
125+
// assuming L3Table is a single page-sized
126+
l0 * L3Table::NUM_ENTRIES + l1
127+
} else {
128+
RawGPA::from(addr).get_masked_value(RawGPA::L1Index) as usize
129+
}
130+
}
131+
2 => {
132+
if is_root {
133+
let l1 = RawGPA::from(addr).get_masked_value(RawGPA::L1Index) as usize;
134+
let l2 = RawGPA::from(addr).get_masked_value(RawGPA::L2Index) as usize;
135+
l1 * L3Table::NUM_ENTRIES + l2
136+
} else {
137+
RawGPA::from(addr).get_masked_value(RawGPA::L2Index) as usize
138+
}
139+
}
140+
3 => RawGPA::from(addr).get_masked_value(RawGPA::L3Index) as usize,
141+
_ => panic!(),
142+
}
143+
}
144+
116145
fn points_to_table_or_page(&self) -> bool {
117146
match self.is_valid() {
118147
true => match self.0.get_masked_value(RawPTE::TYPE) {

rmm/src/realm/mm/page_table/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl Level for L3Table {
7676
const NUM_ENTRIES: usize = (Self::TABLE_SIZE / core::mem::size_of::<Entry>());
7777
}
7878

79-
const_assert_size!(PageTable<GuestPhysAddr, L0Table, Entry, { L0Table::NUM_ENTRIES }>, PAGE_SIZE);
80-
const_assert_size!(PageTable<GuestPhysAddr, L1Table, Entry, { L1Table::NUM_ENTRIES }>, PAGE_SIZE);
81-
const_assert_size!(PageTable<GuestPhysAddr, L2Table, Entry, { L2Table::NUM_ENTRIES }>, PAGE_SIZE);
82-
const_assert_size!(PageTable<GuestPhysAddr, L3Table, Entry, { L3Table::NUM_ENTRIES }>, PAGE_SIZE);
79+
const_assert_size!(PageTable<GuestPhysAddr, Entry, { L0Table::NUM_ENTRIES }>, PAGE_SIZE);
80+
const_assert_size!(PageTable<GuestPhysAddr, Entry, { L1Table::NUM_ENTRIES }>, PAGE_SIZE);
81+
const_assert_size!(PageTable<GuestPhysAddr, Entry, { L2Table::NUM_ENTRIES }>, PAGE_SIZE);
82+
const_assert_size!(PageTable<GuestPhysAddr, Entry, { L3Table::NUM_ENTRIES }>, PAGE_SIZE);

rmm/src/realm/mm/stage2_translation.rs

+61-60
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ use armv9a::{bits_in_reg, define_bitfield, define_bits, define_mask};
2020
pub const NUM_ROOT_PAGE: usize = 2;
2121
pub const ALIGN_ROOT_PAGE: usize = 2;
2222

23+
const NUM_ENTRIES: usize = 512; // CCH added
24+
2325
pub mod tlbi_ns {
2426
pub const IPAS_S: u64 = 0b0;
2527
pub const IPAS_NS: u64 = 0b1;
@@ -34,27 +36,26 @@ const ENTR8: usize = ENTR1 * 8;
3436
const ENTR16: usize = ENTR1 * 16;
3537

3638
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 }>;
3840

3941
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),
4850
}
4951

5052
#[macro_export]
5153
macro_rules! init_table {
5254
($level:expr, $pages:expr, $base:expr) => {
5355
&mut *PageTable::<
5456
GuestPhysAddr,
55-
RootTable<$level, $pages>,
5657
entry::Entry,
57-
{ <RootTable<$level, $pages> as Level>::NUM_ENTRIES },
58+
{ $pages * NUM_ENTRIES },
5859
>::new_with_base($base)
5960
.unwrap()
6061
};
@@ -76,24 +77,24 @@ impl<'a> Stage2Translation<'a> {
7677
let root_pgtlb = match root_level {
7778
0 => unsafe {
7879
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),
8182
_ => todo!(),
8283
}
8384
},
8485
1 => unsafe {
8586
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),
8990
_ => todo!(),
9091
}
9192
},
9293
2 => unsafe {
9394
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),
9798
_ => todo!(),
9899
}
99100
},
@@ -158,46 +159,46 @@ impl<'a> MemAlloc for Stage2Translation<'a> {
158159
#[macro_export]
159160
// ipa_to_pa closure
160161
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| {
163164
$pa = entry.address(0);
164165
Ok(None)
165-
})
166+
}, true)
166167
};
167168
}
168169

169170
// ipa_to_pa closure
170171
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| {
173174
$pte = entry.pte();
174175
Ok(None)
175-
})
176+
}, true)
176177
};
177178
}
178179

179180
// ipa_to_pte_set clousre
180181
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| {
183184
let pte = entry.mut_pte();
184185
*pte = RawPTE($val);
185186
Ok(None)
186-
})
187+
}, true)
187188
};
188189
}
189190

190191
impl<'a> IPATranslation for Stage2Translation<'a> {
191192
fn get_base_address(&self) -> *const c_void {
192193
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,
201202
}
202203
}
203204

@@ -217,14 +218,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
217218
let mut pa = None;
218219

219220
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),
228229
};
229230
if res.is_ok() {
230231
pa
@@ -248,14 +249,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
248249
let guest = Page::<BasePageSize, GuestPhysAddr>::including_address(guest);
249250
let mut pte = 0;
250251
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),
259260
};
260261
if let Ok(x) = res {
261262
Some((pte, x.1))
@@ -272,14 +273,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
272273
) -> Result<(), Error> {
273274
let guest = Page::<BasePageSize, GuestPhysAddr>::including_address(guest);
274275
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),
283284
};
284285
if let Ok(_x) = res {
285286
Ok(())

0 commit comments

Comments
 (0)