mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-09-12 10:04:51 +00:00
The snapshot and restore of AArch64 Gic was done in Vm. Now it is moved to DeviceManager. The benefit is that the restore can be done while the Gic is created in DeviceManager. While the moving of state data from Vm snapshot to DeviceManager snapshot breaks the compatability of migration from older versions. Signed-off-by: Michael Zhao <michael.zhao@arm.com>
66 lines
2.0 KiB
Rust
66 lines
2.0 KiB
Rust
// Copyright 2020, ARM Limited.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
|
|
|
|
use std::io;
|
|
use std::result;
|
|
use vmm_sys_util::eventfd::EventFd;
|
|
|
|
#[derive(Debug)]
|
|
pub enum Error {
|
|
/// Invalid trigger mode.
|
|
InvalidTriggerMode,
|
|
/// Invalid delivery mode.
|
|
InvalidDeliveryMode,
|
|
/// Failed creating the interrupt source group.
|
|
CreateInterruptSourceGroup(io::Error),
|
|
/// Failed triggering the interrupt.
|
|
TriggerInterrupt(io::Error),
|
|
/// Failed masking the interrupt.
|
|
MaskInterrupt(io::Error),
|
|
/// Failed unmasking the interrupt.
|
|
UnmaskInterrupt(io::Error),
|
|
/// Failed updating the interrupt.
|
|
UpdateInterrupt(io::Error),
|
|
/// Failed enabling the interrupt.
|
|
EnableInterrupt(io::Error),
|
|
#[cfg(target_arch = "aarch64")]
|
|
/// Failed creating GIC device.
|
|
CreateGic(hypervisor::HypervisorVmError),
|
|
#[cfg(target_arch = "aarch64")]
|
|
/// Failed restoring GIC device.
|
|
RestoreGic(hypervisor::arch::aarch64::gic::Error),
|
|
}
|
|
|
|
type Result<T> = result::Result<T, Error>;
|
|
|
|
pub struct MsiMessage {
|
|
// Message Address Register
|
|
// 31-20: Base address. Fixed value (0x0FEE)
|
|
// 19-12: Destination ID
|
|
// 11-4: Reserved
|
|
// 3: Redirection Hint indication
|
|
// 2: Destination Mode
|
|
// 1-0: Reserved
|
|
pub addr: u32,
|
|
// Message Data Register
|
|
// 32-16: Reserved
|
|
// 15: Trigger Mode. 0 = Edge, 1 = Level
|
|
// 14: Level. 0 = Deassert, 1 = Assert
|
|
// 13-11: Reserved
|
|
// 10-8: Delivery Mode
|
|
// 7-0: Vector
|
|
pub data: u32,
|
|
}
|
|
|
|
// Introduce trait InterruptController to uniform the interrupt
|
|
// service provided for devices.
|
|
// Device manager uses this trait without caring whether it is a
|
|
// IOAPIC (X86) or GIC (Arm).
|
|
pub trait InterruptController: Send {
|
|
fn service_irq(&mut self, irq: usize) -> Result<()>;
|
|
#[cfg(target_arch = "x86_64")]
|
|
fn end_of_interrupt(&mut self, vec: u8);
|
|
fn notifier(&self, irq: usize) -> Option<EventFd>;
|
|
}
|