use crate::registers::{FpState, GeneralRegisters};
#[derive(Debug, Default, Clone)]
#[repr(C)]
pub struct HypervisorCpuState {
pub gprs: GeneralRegisters,
pub sstatus: usize,
pub hstatus: usize,
pub scounteren: usize,
pub stvec: usize,
pub sscratch: usize,
}
#[derive(Debug, Default, Clone)]
#[repr(C)]
pub struct GuestCpuState {
pub gprs: GeneralRegisters,
pub sstatus: usize,
pub hstatus: usize,
pub scounteren: usize,
pub sepc: usize,
}
#[derive(Debug, Default, Clone)]
#[repr(C)]
pub struct GuestVsCsrs {
pub htimedelta: usize,
pub vsstatus: usize,
pub vsie: usize,
pub vstvec: usize,
pub vsscratch: usize,
pub vsepc: usize,
pub vscause: usize,
pub vstval: usize,
pub vsatp: usize,
pub vstimecmp: usize,
}
#[derive(Debug, Default, Clone)]
#[repr(C)]
pub struct GuestVirtualHsCsrs {
pub hie: usize,
pub hvip: usize,
pub hgeie: usize,
pub hgatp: usize,
}
#[derive(Debug, Default, Clone, Copy)]
#[repr(C)]
pub struct Exit {
pub scause: usize,
pub stval: usize,
pub htval: usize,
pub htinst: usize,
pub pc: usize,
}
impl Exit {
pub fn gpt_page_fault_addr(&self) -> usize {
guest_page_fault_addr(self.htval, self.stval)
}
}
#[derive(Debug, Default, Clone)]
#[repr(C)]
pub struct Vcpu {
pub hyp_regs: HypervisorCpuState,
pub guest_regs: GuestCpuState,
pub vs_csrs: GuestVsCsrs,
pub virtual_hs_csrs: GuestVirtualHsCsrs,
pub trap_csrs: Exit,
pub fp: FpState,
pub(in crate::arch::riscv64) host_fp: FpState,
}
pub const fn guest_page_fault_addr(htval: usize, stval: usize) -> usize {
(htval << 2) | (stval & 3)
}