use ax_errno::AxResult;
use axaddrspace::{GuestPhysAddr, HostPhysAddr};
use axvisor_api::vmm::{VCpuId, VMId};
use crate::exit::AxVCpuExitReason;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InterruptTriggerMode {
EdgeTriggered,
LevelTriggered,
}
pub trait AxArchVCpu: Sized {
type CreateConfig;
type SetupConfig;
fn new(vm_id: VMId, vcpu_id: VCpuId, config: Self::CreateConfig) -> AxResult<Self>;
fn set_entry(&mut self, entry: GuestPhysAddr) -> AxResult;
fn set_ept_root(&mut self, ept_root: HostPhysAddr) -> AxResult;
fn setup(&mut self, config: Self::SetupConfig) -> AxResult;
fn run(&mut self) -> AxResult<AxVCpuExitReason>;
fn bind(&mut self) -> AxResult;
fn unbind(&mut self) -> AxResult;
fn set_gpr(&mut self, reg: usize, val: usize);
fn inject_interrupt(&mut self, vector: usize) -> AxResult;
fn inject_interrupt_with_trigger(
&mut self,
vector: usize,
trigger: InterruptTriggerMode,
) -> AxResult {
debug_assert!(
trigger == InterruptTriggerMode::EdgeTriggered,
"level-triggered interrupt injection requires an architecture-specific implementation"
);
self.inject_interrupt(vector)
}
fn handle_eoi(&mut self) -> Option<u8> {
None
}
fn set_return_value(&mut self, val: usize);
}