use super::{Exit, GuestContext, GuestSystemRegisters, VirtualTimerState};
use crate::{VirtAddr, registers::FpState};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct HostIrqConfig {
pub(crate) interface: u64,
pub(crate) base: usize,
}
impl HostIrqConfig {
pub const fn gicv3() -> Self {
Self {
interface: 2,
base: 0,
}
}
pub unsafe fn gicv2(base: VirtAddr) -> Self {
Self {
interface: 1,
base: base.as_usize(),
}
}
}
#[repr(C)]
#[derive(Debug, Default)]
pub(crate) struct HostContext {
pub stack: u64,
pub sp_el0: u64,
pub tpidr_el0: u64,
pub irq_interface: u64,
pub irq_base: usize,
pub timer_hypervisor_control: u64,
pub timer_kernel_control: u64,
pub timer_offset: u64,
pub timer_compare: u64,
pub timer_control: u64,
pub cptr: u64,
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct Vcpu {
pub context: GuestContext,
pub(crate) host: HostContext,
pub system: GuestSystemRegisters,
pub timer: VirtualTimerState,
pub fp: FpState,
pub(crate) host_fp: FpState,
pub(crate) exit: Exit,
}
impl Vcpu {
pub fn set_host_irq_interface(&mut self, config: HostIrqConfig) {
self.host.irq_interface = config.interface;
self.host.irq_base = config.base;
}
}