x86_vcpu 0.5.10

x86 Virtual CPU implementation for the Arceos Hypervisor
Documentation
use core::convert::TryFrom;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum SvmExitCode {
    CR_READ(u8),
    CR_WRITE(u8),
    DR_READ(u8),
    DR_WRITE(u8),
    EXCP(u8),
    INTR,
    NMI,
    SMI,
    INIT,
    VINTR,
    CR0_SEL_WRITE,
    IDTR_READ,
    GDTR_READ,
    LDTR_READ,
    TR_READ,
    IDTR_WRITE,
    GDTR_WRITE,
    LDTR_WRITE,
    TR_WRITE,
    RDTSC,
    RDPMC,
    PUSHF,
    POPF,
    CPUID,
    RSM,
    IRET,
    SWINT,
    INVD,
    PAUSE,
    HLT,
    INVLPG,
    INVLPGA,
    IOIO,
    MSR,
    TASK_SWITCH,
    FERR_FREEZE,
    SHUTDOWN,
    VMRUN,
    VMMCALL,
    VMLOAD,
    VMSAVE,
    STGI,
    CLGI,
    SKINIT,
    RDTSCP,
    ICEBP,
    WBINVD,
    MONITOR,
    MWAIT,
    MWAIT_CONDITIONAL,
    XSETBV,
    RDPRU,
    EFER_WRITE_TRAP,
    CR_WRITE_TRAP(u8),
    INVLPGB,
    INVLPGB_ILLEGAL,
    INVPCID,
    MCOMMIT,
    TLBSYNC,
    NPF,
    AVIC_INCOMPLETE_IPI,
    AVIC_NOACCEL,
    VMGEXIT,
    INVALID,
    BUSY,
}

impl TryFrom<u64> for SvmExitCode {
    type Error = u64;

    fn try_from(val: u64) -> Result<Self, Self::Error> {
        match val as i64 {
            0x00..=0x0f => Ok(Self::CR_READ(val as u8)),
            0x10..=0x1f => Ok(Self::CR_WRITE(val as u8 - 0x10)),
            0x20..=0x2f => Ok(Self::DR_READ(val as u8 - 0x20)),
            0x30..=0x3f => Ok(Self::DR_WRITE(val as u8 - 0x30)),
            0x40..=0x5f => Ok(Self::EXCP(val as u8 - 0x40)),
            0x60 => Ok(Self::INTR),
            0x61 => Ok(Self::NMI),
            0x62 => Ok(Self::SMI),
            0x63 => Ok(Self::INIT),
            0x64 => Ok(Self::VINTR),
            0x65 => Ok(Self::CR0_SEL_WRITE),
            0x66 => Ok(Self::IDTR_READ),
            0x67 => Ok(Self::GDTR_READ),
            0x68 => Ok(Self::LDTR_READ),
            0x69 => Ok(Self::TR_READ),
            0x6a => Ok(Self::IDTR_WRITE),
            0x6b => Ok(Self::GDTR_WRITE),
            0x6c => Ok(Self::LDTR_WRITE),
            0x6d => Ok(Self::TR_WRITE),
            0x6e => Ok(Self::RDTSC),
            0x6f => Ok(Self::RDPMC),
            0x70 => Ok(Self::PUSHF),
            0x71 => Ok(Self::POPF),
            0x72 => Ok(Self::CPUID),
            0x73 => Ok(Self::RSM),
            0x74 => Ok(Self::IRET),
            0x75 => Ok(Self::SWINT),
            0x76 => Ok(Self::INVD),
            0x77 => Ok(Self::PAUSE),
            0x78 => Ok(Self::HLT),
            0x79 => Ok(Self::INVLPG),
            0x7a => Ok(Self::INVLPGA),
            0x7b => Ok(Self::IOIO),
            0x7c => Ok(Self::MSR),
            0x7d => Ok(Self::TASK_SWITCH),
            0x7e => Ok(Self::FERR_FREEZE),
            0x7f => Ok(Self::SHUTDOWN),
            0x80 => Ok(Self::VMRUN),
            0x81 => Ok(Self::VMMCALL),
            0x82 => Ok(Self::VMLOAD),
            0x83 => Ok(Self::VMSAVE),
            0x84 => Ok(Self::STGI),
            0x85 => Ok(Self::CLGI),
            0x86 => Ok(Self::SKINIT),
            0x87 => Ok(Self::RDTSCP),
            0x88 => Ok(Self::ICEBP),
            0x89 => Ok(Self::WBINVD),
            0x8a => Ok(Self::MONITOR),
            0x8b => Ok(Self::MWAIT),
            0x8c => Ok(Self::MWAIT_CONDITIONAL),
            0x8d => Ok(Self::XSETBV),
            0x8e => Ok(Self::RDPRU),
            0x8f => Ok(Self::EFER_WRITE_TRAP),
            0x90..=0x9f => Ok(Self::CR_WRITE_TRAP(val as u8 - 0x90)),
            0xa0 => Ok(Self::INVLPGB),
            0xa1 => Ok(Self::INVLPGB_ILLEGAL),
            0xa2 => Ok(Self::INVPCID),
            0xa3 => Ok(Self::MCOMMIT),
            0xa4 => Ok(Self::TLBSYNC),
            0x400 => Ok(Self::NPF),
            0x401 => Ok(Self::AVIC_INCOMPLETE_IPI),
            0x402 => Ok(Self::AVIC_NOACCEL),
            0x403 => Ok(Self::VMGEXIT),
            -1 => Ok(Self::INVALID),
            -2 => Ok(Self::BUSY),
            _ => Err(val),
        }
    }
}

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum SvmIntercept {
    INTR,
    NMI,
    SMI,
    INIT,
    VINTR,
    CR0_SEL_WRITE,
    IDTR_READ,
    GDTR_READ,
    LDTR_READ,
    TR_READ,
    IDTR_WRITE,
    GDTR_WRITE,
    LDTR_WRITE,
    TR_WRITE,
    RDTSC,
    RDPMC,
    PUSHF,
    POPF,
    CPUID,
    RSM,
    IRET,
    SWINT,
    INVD,
    PAUSE,
    HLT,
    INVLPG,
    INVLPGA,
    IOIO_PROT,
    MSR_PROT,
    TASK_SWITCH,
    FERR_FREEZE,
    SHUTDOWN,
    VMRUN,
    VMMCALL,
    VMLOAD,
    VMSAVE,
    STGI,
    CLGI,
    SKINIT,
    RDTSCP,
    ICEBP,
    WBINVD,
    MONITOR,
    MWAIT,
    MWAIT_CONDITIONAL,
    XSETBV,
    RDPRU,
    EFER_WRITE_TRAP,
    INVLPGB,
    INVLPGB_ILLEGAL,
    INVPCID,
    MCOMMIT,
    TLBSYNC,
}