From e7acbcc184d0517980092bddfd16e24a0406a18f Mon Sep 17 00:00:00 2001 From: Henry Wang Date: Mon, 31 Aug 2020 16:34:12 +0800 Subject: [PATCH] arch: AArch64: support saving RDIST pending tables into guest RAM This commit adds a function which allows to save RDIST pending tables to the guest RAM, as well as unit test case for it. Signed-off-by: Henry Wang --- arch/src/aarch64/gic/mod.rs | 14 ++++++++++++++ vmm/src/interrupt.rs | 12 +++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/arch/src/aarch64/gic/mod.rs b/arch/src/aarch64/gic/mod.rs index b8e56530f..63263a190 100644 --- a/arch/src/aarch64/gic/mod.rs +++ b/arch/src/aarch64/gic/mod.rs @@ -204,4 +204,18 @@ pub mod kvm { }) } } + + /// Function that saves RDIST pending tables into guest RAM. + /// + /// The tables get flushed to guest RAM whenever the VM gets stopped. + pub fn save_pending_tables(gic: &Arc) -> Result<()> { + let init_gic_attr = kvm_bindings::kvm_device_attr { + group: kvm_bindings::KVM_DEV_ARM_VGIC_GRP_CTRL, + attr: u64::from(kvm_bindings::KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES), + addr: 0, + flags: 0, + }; + gic.set_device_attr(&init_gic_attr) + .map_err(super::Error::SetDeviceAttribute) + } } diff --git a/vmm/src/interrupt.rs b/vmm/src/interrupt.rs index 96194833a..e2d12718c 100644 --- a/vmm/src/interrupt.rs +++ b/vmm/src/interrupt.rs @@ -395,7 +395,7 @@ pub mod kvm { #[cfg(target_arch = "aarch64")] #[cfg(test)] mod tests { - use arch::aarch64::gic::kvm::create_gic; + use arch::aarch64::gic::kvm::{create_gic, save_pending_tables}; use arch::aarch64::gic::{ get_dist_regs, get_icc_regs, get_redist_regs, set_dist_regs, set_icc_regs, set_redist_regs, }; @@ -459,4 +459,14 @@ mod tests { assert!(set_icc_regs(gic.device(), &gicr_typer, &state).is_ok()); } + + #[test] + fn test_save_pending_tables() { + let hv = hypervisor::new().unwrap(); + let vm = hv.create_vm().unwrap(); + let _ = vm.create_vcpu(0).unwrap(); + let gic = create_gic(&vm, 1, false).expect("Cannot create gic"); + + assert!(save_pending_tables(gic.device()).is_ok()); + } }