Skip to content

Commit a052623

Browse files
committed
Pass root_n
1 parent fcb1cc8 commit a052623

File tree

4 files changed

+60
-60
lines changed

4 files changed

+60
-60
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, _is_root: bool) -> usize {
111+
fn index_with_level(addr: usize, level: usize, _is_root: bool, _root_n: usize) -> 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/mm/translation.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl<'a> Inner<'a> {
136136

137137
if self
138138
.root_pgtlb
139-
.set_pages(1, virtaddr, phyaddr, flags, false)
139+
.set_pages(1, virtaddr, phyaddr, flags, false, 1)
140140
.is_err()
141141
{
142142
warn!("set_pages error");
@@ -146,7 +146,7 @@ impl<'a> Inner<'a> {
146146
fn unset_page(&mut self, addr: usize) {
147147
let va = VirtAddr::from(addr);
148148
let page = Page::<BasePageSize, VirtAddr>::including_address(va);
149-
self.root_pgtlb.unset_page(1, page);
149+
self.root_pgtlb.unset_page(1, page, 1);
150150
}
151151

152152
fn set_pages_for_rmi(&mut self, addr: usize, secure: bool) -> bool {

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

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

116-
fn index_with_level(addr: usize, level: usize, is_root: bool) -> usize {
116+
fn index_with_level(addr: usize, level: usize, is_root: bool, root_n: usize) -> usize {
117117
match level {
118118
0 => RawGPA::from(addr).get_masked_value(RawGPA::L0Index) as usize,
119119
1 => {
120-
if is_root {
120+
if is_root && root_n > 1 {
121121
// We know that refering one direct parent table is enough
122122
// because concatenation of the initial lookup table is upto 16.
123123
let l0 = RawGPA::from(addr).get_masked_value(RawGPA::L0Index) as usize;
@@ -129,7 +129,7 @@ impl page_table::Entry for Entry {
129129
}
130130
}
131131
2 => {
132-
if is_root {
132+
if is_root && root_n > 1 {
133133
let l1 = RawGPA::from(addr).get_masked_value(RawGPA::L1Index) as usize;
134134
let l2 = RawGPA::from(addr).get_masked_value(RawGPA::L2Index) as usize;
135135
l1 * L3Table::NUM_ENTRIES + l2

rmm/src/realm/mm/stage2_translation.rs

+54-54
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ type RootTBL<'a, const L: usize, const N: usize, const E: usize> =
3939
&'a mut PageTable<GuestPhysAddr, entry::Entry, { E }>;
4040

4141
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),
5050
}
5151

5252
#[macro_export]
@@ -77,24 +77,24 @@ impl<'a> Stage2Translation<'a> {
7777
let root_pgtlb = match root_level {
7878
0 => unsafe {
7979
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),
8282
_ => todo!(),
8383
}
8484
},
8585
1 => unsafe {
8686
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),
9090
_ => todo!(),
9191
}
9292
},
9393
2 => unsafe {
9494
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),
9898
_ => todo!(),
9999
}
100100
},
@@ -159,46 +159,46 @@ impl<'a> MemAlloc for Stage2Translation<'a> {
159159
#[macro_export]
160160
// ipa_to_pa closure
161161
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) => {
163163
$root.entry($root_level, $guest, $level, false, |entry| {
164164
$pa = entry.address(0);
165165
Ok(None)
166-
}, true)
166+
}, true, $root_n)
167167
};
168168
}
169169

170170
// ipa_to_pa closure
171171
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) => {
173173
$root.entry($root_level, $guest, $level, true, |entry| {
174174
$pte = entry.pte();
175175
Ok(None)
176-
}, true)
176+
}, true, $root_n)
177177
};
178178
}
179179

180180
// ipa_to_pte_set clousre
181181
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) => {
183183
$root.entry($root_level, $guest, $level, true, |entry| {
184184
let pte = entry.mut_pte();
185185
*pte = RawPTE($val);
186186
Ok(None)
187-
}, true)
187+
}, true, $root_n)
188188
};
189189
}
190190

191191
impl<'a> IPATranslation for Stage2Translation<'a> {
192192
fn get_base_address(&self) -> *const c_void {
193193
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,
202202
}
203203
}
204204

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

220220
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),
229229
};
230230
if res.is_ok() {
231231
pa
@@ -249,14 +249,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
249249
let guest = Page::<BasePageSize, GuestPhysAddr>::including_address(guest);
250250
let mut pte = 0;
251251
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),
260260
};
261261
if let Ok(x) = res {
262262
Some((pte, x.1))
@@ -273,14 +273,14 @@ impl<'a> IPATranslation for Stage2Translation<'a> {
273273
) -> Result<(), Error> {
274274
let guest = Page::<BasePageSize, GuestPhysAddr>::including_address(guest);
275275
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),
284284
};
285285
if let Ok(_x) = res {
286286
Ok(())

0 commit comments

Comments
 (0)