use base::Event;
use base::Result;
use hypervisor::gunyah::GunyahVm;
use hypervisor::DeviceKind;
use hypervisor::IrqRoute;
use hypervisor::MPState;
use hypervisor::Vcpu;
use crate::IrqChip;
use crate::IrqChipAArch64;
use crate::IrqChipCap;
use crate::IrqEdgeEvent;
use crate::IrqEventIndex;
use crate::IrqEventSource;
use crate::IrqLevelEvent;
use crate::VcpuRunState;
pub struct GunyahIrqChip {
vm: GunyahVm,
}
impl GunyahIrqChip {
pub fn new(vm: GunyahVm) -> Result<GunyahIrqChip> {
Ok(GunyahIrqChip { vm })
}
}
impl IrqChip for GunyahIrqChip {
fn add_vcpu(&mut self, _vcpu_id: usize, _vcpu: &dyn Vcpu) -> Result<()> {
Ok(())
}
fn register_edge_irq_event(
&mut self,
irq: u32,
irq_event: &IrqEdgeEvent,
_source: IrqEventSource,
) -> Result<Option<IrqEventIndex>> {
self.vm
.register_irqfd(irq, irq_event.get_trigger(), false)?;
Ok(None)
}
fn unregister_edge_irq_event(&mut self, irq: u32, irq_event: &IrqEdgeEvent) -> Result<()> {
self.vm.unregister_irqfd(irq, irq_event.get_trigger())?;
Ok(())
}
fn register_level_irq_event(
&mut self,
irq: u32,
irq_event: &IrqLevelEvent,
_source: IrqEventSource,
) -> Result<Option<IrqEventIndex>> {
self.vm.register_irqfd(irq, irq_event.get_trigger(), true)?;
Ok(None)
}
fn unregister_level_irq_event(&mut self, irq: u32, irq_event: &IrqLevelEvent) -> Result<()> {
self.vm.unregister_irqfd(irq, irq_event.get_trigger())?;
Ok(())
}
fn route_irq(&mut self, _route: IrqRoute) -> Result<()> {
unimplemented!()
}
fn set_irq_routes(&mut self, _routes: &[IrqRoute]) -> Result<()> {
unimplemented!()
}
fn irq_event_tokens(&self) -> Result<Vec<(IrqEventIndex, IrqEventSource, Event)>> {
Ok(Vec::new())
}
fn service_irq(&mut self, _irq: u32, _level: bool) -> Result<()> {
unimplemented!()
}
fn service_irq_event(&mut self, _event_index: IrqEventIndex) -> Result<()> {
unreachable!();
}
fn broadcast_eoi(&self, _vector: u8) -> Result<()> {
unreachable!();
}
fn inject_interrupts(&self, _vcpu: &dyn Vcpu) -> Result<()> {
Ok(())
}
fn halted(&self, _vcpu_id: usize) {}
fn wait_until_runnable(&self, _vcpu: &dyn Vcpu) -> Result<VcpuRunState> {
Ok(VcpuRunState::Runnable)
}
fn kick_halted_vcpus(&self) {}
fn get_mp_state(&self, _vcpu_id: usize) -> Result<MPState> {
unimplemented!()
}
fn set_mp_state(&mut self, _vcpu_id: usize, _state: &MPState) -> Result<()> {
unimplemented!()
}
fn try_clone(&self) -> Result<Self>
where
Self: Sized,
{
Ok(Self {
vm: self.vm.try_clone()?,
})
}
fn finalize_devices(
&mut self,
_resources: &mut resources::SystemAllocator,
_io_bus: &crate::Bus,
_mmio_bus: &crate::Bus,
) -> Result<()> {
Ok(())
}
fn process_delayed_irq_events(&mut self) -> Result<()> {
Ok(())
}
fn irq_delayed_event_token(&self) -> Result<Option<Event>> {
Ok(None)
}
fn check_capability(&self, _c: IrqChipCap) -> bool {
false
}
}
impl IrqChipAArch64 for GunyahIrqChip {
fn try_box_clone(&self) -> Result<Box<dyn IrqChipAArch64>> {
Ok(Box::new(self.try_clone()?))
}
fn as_irq_chip(&self) -> &dyn IrqChip {
self
}
fn as_irq_chip_mut(&mut self) -> &mut dyn IrqChip {
self
}
fn get_vgic_version(&self) -> DeviceKind {
DeviceKind::ArmVgicV3
}
fn has_vgic_its(&self) -> bool {
false
}
fn finalize(&self) -> Result<()> {
Ok(())
}
}