Skip to content

Commit 5775ac6

Browse files
committed
refactor(snp): implement memory encryption as layout change callbacks
Signed-off-by: Changyuan Lyu <changyuanl@google.com>
1 parent e8477f8 commit 5775ac6

File tree

6 files changed

+68
-27
lines changed

6 files changed

+68
-27
lines changed

alioth/src/board/board.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,12 @@ where
245245
coco: config.coco.clone(),
246246
};
247247
let mut vm = hv.create_vm(&vm_config)?;
248-
let vm_memory = vm.create_vm_memory()?;
248+
let vm_memory = Arc::new(vm.create_vm_memory()?);
249249
let arch = ArchBoard::new(hv, &vm, &config)?;
250250

251251
let board = Board {
252252
vm,
253-
memory: Memory::new(vm_memory),
253+
memory: Memory::new(vm_memory.clone()),
254254
arch,
255255
config,
256256
payload: RwLock::new(None),
@@ -273,7 +273,7 @@ where
273273
cond_var: Condvar::new(),
274274
};
275275

276-
board.coco_init()?;
276+
board.coco_init(vm_memory)?;
277277

278278
Ok(board)
279279
}

alioth/src/board/board_aarch64.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ where
154154
Ok(())
155155
}
156156

157-
pub fn coco_init(&self) -> Result<()> {
157+
pub fn coco_init(&self, _: Arc<V::Memory>) -> Result<()> {
158158
Ok(())
159159
}
160160

alioth/src/board/board_x86_64/board_x86_64.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -297,34 +297,23 @@ where
297297
callbacks: Mutex::new(vec![]),
298298
};
299299
memory.add_region(0, Arc::new(region_low))?;
300-
if let Some(coco) = &self.config.coco {
301-
memory.register_encrypted_pages(&pages_low)?;
302-
if let Coco::AmdSnp { .. } = coco {
303-
memory.mark_private_memory(0, low_mem_size as _, true)?;
304-
}
305-
}
300+
306301
if config.mem.size > RAM_32_SIZE {
307302
let mem_hi_size = config.mem.size - RAM_32_SIZE;
308303
let mem_hi = self.create_ram_pages(mem_hi_size, c"ram-high")?;
309304
let region_hi = MemRegion::with_ram(mem_hi.clone(), MemRegionType::Ram);
310305
memory.add_region(MEM_64_START, Arc::new(region_hi))?;
311-
if let Some(coco) = &self.config.coco {
312-
memory.register_encrypted_pages(&mem_hi)?;
313-
if let Coco::AmdSnp { .. } = coco {
314-
memory.mark_private_memory(MEM_64_START as _, mem_hi_size as _, true)?;
315-
}
316-
}
317306
}
318307
Ok(())
319308
}
320309

321-
pub fn coco_init(&self) -> Result<()> {
310+
pub fn coco_init(&self, memory: Arc<V::Memory>) -> Result<()> {
322311
let Some(coco) = &self.config.coco else {
323312
return Ok(());
324313
};
325314
match coco {
326-
Coco::AmdSev { policy } => self.vm.sev_launch_start(*policy)?,
327-
Coco::AmdSnp { policy } => self.vm.snp_launch_start(*policy)?,
315+
Coco::AmdSev { policy } => self.sev_init(*policy, memory)?,
316+
Coco::AmdSnp { policy } => self.snp_init(*policy, memory)?,
328317
Coco::IntelTdx { attr } => todo!("Intel TDX {attr:?}"),
329318
}
330319
Ok(())

alioth/src/board/board_x86_64/sev.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,21 @@
1313
// limitations under the License.
1414

1515
use std::iter::zip;
16+
use std::sync::Arc;
1617
use std::sync::atomic::Ordering;
1718

1819
use zerocopy::FromZeros;
1920

2021
use crate::arch::layout::MEM_64_START;
2122
use crate::arch::reg::{Reg, SegAccess, SegReg, SegRegVal};
22-
use crate::arch::sev::{SevPolicy, SnpPageType};
23+
use crate::arch::sev::{SevPolicy, SnpPageType, SnpPolicy};
2324
use crate::board::{Board, Result, VcpuGuard};
2425
use crate::firmware::ovmf::sev::{
2526
SevDescType, SevMetadataDesc, SnpCpuidFunc, SnpCpuidInfo, parse_desc, parse_sev_ap_eip,
2627
};
27-
use crate::hv::{Vcpu, Vm};
28+
use crate::hv::{Vcpu, Vm, VmMemory};
2829
use crate::mem::mapped::ArcMemPages;
30+
use crate::mem::{self, LayoutChanged, MarkPrivateMemory};
2931

3032
impl<V> Board<V>
3133
where
@@ -162,4 +164,38 @@ where
162164
)?;
163165
Ok(())
164166
}
167+
168+
pub(crate) fn sev_init(&self, policy: SevPolicy, memory: Arc<V::Memory>) -> Result<()> {
169+
self.vm.sev_launch_start(policy)?;
170+
let encrypt_pages = Box::new(EncryptPages { memory });
171+
self.memory.register_change_callback(encrypt_pages)?;
172+
Ok(())
173+
}
174+
175+
pub(crate) fn snp_init(&self, policy: SnpPolicy, memory: Arc<V::Memory>) -> Result<()> {
176+
self.vm.snp_launch_start(policy)?;
177+
let encrypt_pages = Box::new(EncryptPages {
178+
memory: memory.clone(),
179+
});
180+
self.memory.register_change_callback(encrypt_pages)?;
181+
let mark_private_memory = Box::new(MarkPrivateMemory { memory });
182+
self.memory.register_change_callback(mark_private_memory)?;
183+
Ok(())
184+
}
185+
}
186+
187+
#[derive(Debug)]
188+
pub struct EncryptPages {
189+
memory: Arc<dyn VmMemory>,
190+
}
191+
192+
impl LayoutChanged for EncryptPages {
193+
fn ram_added(&self, _: u64, pages: &ArcMemPages) -> mem::Result<()> {
194+
self.memory.register_encrypted_range(pages.as_slice())?;
195+
Ok(())
196+
}
197+
198+
fn ram_removed(&self, _: u64, _: &ArcMemPages) -> mem::Result<()> {
199+
Ok(())
200+
}
165201
}

alioth/src/mem/mem.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,21 +264,21 @@ pub struct Memory {
264264
callbacks: Mutex<LayoutCallbacks>,
265265
ram_bus: Arc<RamBus>,
266266
mmio_bus: RwLock<MmioBus>,
267-
vm_memory: Box<dyn VmMemory>,
267+
vm_memory: Arc<dyn VmMemory>,
268268

269269
#[cfg(target_arch = "x86_64")]
270270
io_bus: RwLock<MmioBus>,
271271
io_regions: Mutex<Addressable<Arc<IoRegion>>>,
272272
}
273273

274274
impl Memory {
275-
pub fn new(vm_memory: impl VmMemory) -> Self {
275+
pub fn new(vm_memory: Arc<dyn VmMemory>) -> Self {
276276
Memory {
277277
regions: Mutex::new(Addressable::new()),
278278
callbacks: Mutex::new(LayoutCallbacks::default()),
279279
ram_bus: Arc::new(RamBus::new()),
280280
mmio_bus: RwLock::new(MmioBus::new()),
281-
vm_memory: Box::new(vm_memory),
281+
vm_memory,
282282
#[cfg(target_arch = "x86_64")]
283283
io_bus: RwLock::new(MmioBus::new()),
284284
io_regions: Mutex::new(Addressable::new()),
@@ -397,7 +397,7 @@ impl Memory {
397397
}
398398
MemRange::Ram(r) => {
399399
self.ram_bus.remove(gpa)?;
400-
for callback in &callbacks.changed {
400+
for callback in callbacks.changed.iter().rev() {
401401
callback.ram_removed(gpa, r)?;
402402
}
403403
self.unmap_from_vm(gpa, r)?;
@@ -605,3 +605,19 @@ impl Memory {
605605
}
606606
}
607607
}
608+
609+
#[derive(Debug)]
610+
pub struct MarkPrivateMemory {
611+
pub memory: Arc<dyn VmMemory>,
612+
}
613+
614+
impl LayoutChanged for MarkPrivateMemory {
615+
fn ram_added(&self, gpa: u64, pages: &ArcMemPages) -> Result<()> {
616+
self.memory.mark_private_memory(gpa, pages.size(), true)?;
617+
Ok(())
618+
}
619+
620+
fn ram_removed(&self, _: u64, _: &ArcMemPages) -> Result<()> {
621+
Ok(())
622+
}
623+
}

alioth/src/pci/config_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ impl VmMemory for FakeVmMemory {
291291

292292
#[test]
293293
fn test_mem_bar_layout_change() {
294-
let memory = Memory::new(FakeVmMemory);
294+
let memory = Memory::new(Arc::new(FakeVmMemory));
295295
let header = fixture_emulated_header();
296296

297297
let callback = assert_matches!(
@@ -351,7 +351,7 @@ fn test_mem_bar_layout_change() {
351351

352352
#[test]
353353
fn test_io_bar_layout_change() {
354-
let memory = Memory::new(FakeVmMemory);
354+
let memory = Memory::new(Arc::new(FakeVmMemory));
355355
let header = fixture_emulated_header();
356356

357357
let callback = assert_matches!(

0 commit comments

Comments
 (0)