(
&mut self,
)
| 1773 | |
| 1774 | #[cfg(target_arch = "aarch64")] |
| 1775 | fn add_interrupt_controller( |
| 1776 | &mut self, |
| 1777 | ) -> DeviceManagerResult<Arc<Mutex<dyn InterruptController>>> { |
| 1778 | let interrupt_controller: Arc<Mutex<gic::Gic>> = Arc::new(Mutex::new( |
| 1779 | gic::Gic::new( |
| 1780 | self.config.lock().unwrap().cpus.boot_vcpus, |
| 1781 | Arc::clone(&self.msi_interrupt_manager), |
| 1782 | self.address_manager.vm.clone(), |
| 1783 | ) |
| 1784 | .map_err(DeviceManagerError::CreateInterruptController)?, |
| 1785 | )); |
| 1786 | |
| 1787 | self.interrupt_controller = Some(interrupt_controller.clone()); |
| 1788 | |
| 1789 | // Restore the vGic if this is in the process of restoration |
| 1790 | let id = String::from(gic::GIC_SNAPSHOT_ID); |
| 1791 | if let Some(vgic_snapshot) = snapshot_from_id(self.snapshot.as_ref(), &id) { |
| 1792 | // PMU support is optional. Nothing should be impacted if the PMU initialization failed. |
| 1793 | if self |
| 1794 | .cpu_manager |
| 1795 | .lock() |
| 1796 | .unwrap() |
| 1797 | .init_pmu(AARCH64_PMU_IRQ + 16) |
| 1798 | .is_err() |
| 1799 | { |
| 1800 | info!("Failed to initialize PMU"); |
| 1801 | } |
| 1802 | |
| 1803 | let vgic_state = vgic_snapshot |
| 1804 | .to_state() |
| 1805 | .map_err(DeviceManagerError::RestoreGetState)?; |
| 1806 | let saved_vcpu_states = self.cpu_manager.lock().unwrap().get_saved_states(); |
| 1807 | interrupt_controller |
| 1808 | .lock() |
| 1809 | .unwrap() |
| 1810 | .restore_vgic(vgic_state, &saved_vcpu_states) |
| 1811 | .unwrap(); |
| 1812 | } |
| 1813 | |
| 1814 | self.device_tree |
| 1815 | .lock() |
| 1816 | .unwrap() |
| 1817 | .insert(id.clone(), device_node!(id, interrupt_controller)); |
| 1818 | |
| 1819 | Ok(interrupt_controller) |
| 1820 | } |
| 1821 | |
| 1822 | #[cfg(target_arch = "aarch64")] |
| 1823 | pub fn get_interrupt_controller(&self) -> Option<&Arc<Mutex<gic::Gic>>> { |
no test coverage detected