use axaddrspace::{GuestPhysAddr, HostPhysAddr};
use axerrno::AxResult;
use axvisor_api::vmm::{VCpuId, VMId};
use crate::exit::AxVCpuExitReason;
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 set_return_value(&mut self, val: usize);
}