use core::{fmt, marker::PhantomData};
#[derive(Clone, Copy, Debug)]
pub struct VmcsReadOnly;
#[derive(Clone, Copy, Debug)]
pub struct VmcsReadWrite;
mod private {
pub trait Value: Copy {
fn from_raw(value: u64) -> Self;
fn into_raw(self) -> u64;
}
}
pub trait VmcsValue: private::Value {}
macro_rules! value_widths {
($($word:ty),* $(,)?) => {$(
impl private::Value for $word {
fn from_raw(value: u64) -> Self { value as Self }
fn into_raw(self) -> u64 { self as u64 }
}
impl VmcsValue for $word {}
)*};
}
value_widths!(u16, u32, u64, usize);
#[derive(Clone, Copy)]
pub struct VmcsField<T, A> {
encoding: u32,
name: &'static str,
word: PhantomData<(T, A)>,
}
impl<T, A> VmcsField<T, A> {
const fn new(encoding: u32, name: &'static str) -> Self {
Self {
encoding,
name,
word: PhantomData,
}
}
pub const fn encoding(self) -> u32 {
self.encoding
}
}
impl<T, A> fmt::Debug for VmcsField<T, A> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.name)
}
}
pub(super) fn from_raw<T: VmcsValue>(value: u64) -> T {
T::from_raw(value)
}
pub(super) fn into_raw<T: VmcsValue>(value: T) -> u64 {
value.into_raw()
}
pub struct VmcsControl16;
impl VmcsControl16 {
pub const VPID: VmcsField<u16, VmcsReadWrite> = VmcsField::new(0x0, "VmcsControl16::VPID");
pub const POSTED_INTERRUPT_NOTIFICATION_VECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x2, "VmcsControl16::POSTED_INTERRUPT_NOTIFICATION_VECTOR");
pub const EPTP_INDEX: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x4, "VmcsControl16::EPTP_INDEX");
}
pub struct VmcsControl64;
impl VmcsControl64 {
pub const IO_BITMAP_A_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2000, "VmcsControl64::IO_BITMAP_A_ADDR");
pub const IO_BITMAP_B_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2002, "VmcsControl64::IO_BITMAP_B_ADDR");
pub const MSR_BITMAPS_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2004, "VmcsControl64::MSR_BITMAPS_ADDR");
pub const VMEXIT_MSR_STORE_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2006, "VmcsControl64::VMEXIT_MSR_STORE_ADDR");
pub const VMEXIT_MSR_LOAD_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2008, "VmcsControl64::VMEXIT_MSR_LOAD_ADDR");
pub const VMENTRY_MSR_LOAD_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x200A, "VmcsControl64::VMENTRY_MSR_LOAD_ADDR");
pub const EXECUTIVE_VMCS_PTR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x200C, "VmcsControl64::EXECUTIVE_VMCS_PTR");
pub const PML_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x200E, "VmcsControl64::PML_ADDR");
pub const TSC_OFFSET: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2010, "VmcsControl64::TSC_OFFSET");
pub const VIRT_APIC_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2012, "VmcsControl64::VIRT_APIC_ADDR");
pub const APIC_ACCESS_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2014, "VmcsControl64::APIC_ACCESS_ADDR");
pub const POSTED_INTERRUPT_DESC_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2016, "VmcsControl64::POSTED_INTERRUPT_DESC_ADDR");
pub const VM_FUNCTION_CONTROLS: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2018, "VmcsControl64::VM_FUNCTION_CONTROLS");
pub const EPTP: VmcsField<u64, VmcsReadWrite> = VmcsField::new(0x201A, "VmcsControl64::EPTP");
pub const EOI_EXIT0: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x201C, "VmcsControl64::EOI_EXIT0");
pub const EOI_EXIT1: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x201E, "VmcsControl64::EOI_EXIT1");
pub const EOI_EXIT2: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2020, "VmcsControl64::EOI_EXIT2");
pub const EOI_EXIT3: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2022, "VmcsControl64::EOI_EXIT3");
pub const EPTP_LIST_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2024, "VmcsControl64::EPTP_LIST_ADDR");
pub const VMREAD_BITMAP_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2026, "VmcsControl64::VMREAD_BITMAP_ADDR");
pub const VMWRITE_BITMAP_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2028, "VmcsControl64::VMWRITE_BITMAP_ADDR");
pub const VIRT_EXCEPTION_INFO_ADDR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x202A, "VmcsControl64::VIRT_EXCEPTION_INFO_ADDR");
pub const XSS_EXITING_BITMAP: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x202C, "VmcsControl64::XSS_EXITING_BITMAP");
pub const ENCLS_EXITING_BITMAP: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x202E, "VmcsControl64::ENCLS_EXITING_BITMAP");
pub const SUBPAGE_PERM_TABLE_PTR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2030, "VmcsControl64::SUBPAGE_PERM_TABLE_PTR");
pub const TSC_MULTIPLIER: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2032, "VmcsControl64::TSC_MULTIPLIER");
}
pub struct VmcsControl32;
impl VmcsControl32 {
pub const PINBASED_EXEC_CONTROLS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4000, "VmcsControl32::PINBASED_EXEC_CONTROLS");
pub const PRIMARY_PROCBASED_EXEC_CONTROLS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4002, "VmcsControl32::PRIMARY_PROCBASED_EXEC_CONTROLS");
pub const EXCEPTION_BITMAP: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4004, "VmcsControl32::EXCEPTION_BITMAP");
pub const PAGE_FAULT_ERR_CODE_MASK: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4006, "VmcsControl32::PAGE_FAULT_ERR_CODE_MASK");
pub const PAGE_FAULT_ERR_CODE_MATCH: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4008, "VmcsControl32::PAGE_FAULT_ERR_CODE_MATCH");
pub const CR3_TARGET_COUNT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x400A, "VmcsControl32::CR3_TARGET_COUNT");
pub const VMEXIT_CONTROLS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x400C, "VmcsControl32::VMEXIT_CONTROLS");
pub const VMEXIT_MSR_STORE_COUNT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x400E, "VmcsControl32::VMEXIT_MSR_STORE_COUNT");
pub const VMEXIT_MSR_LOAD_COUNT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4010, "VmcsControl32::VMEXIT_MSR_LOAD_COUNT");
pub const VMENTRY_CONTROLS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4012, "VmcsControl32::VMENTRY_CONTROLS");
pub const VMENTRY_MSR_LOAD_COUNT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4014, "VmcsControl32::VMENTRY_MSR_LOAD_COUNT");
pub const VMENTRY_INTERRUPTION_INFO_FIELD: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4016, "VmcsControl32::VMENTRY_INTERRUPTION_INFO_FIELD");
pub const VMENTRY_EXCEPTION_ERR_CODE: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4018, "VmcsControl32::VMENTRY_EXCEPTION_ERR_CODE");
pub const VMENTRY_INSTRUCTION_LEN: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x401A, "VmcsControl32::VMENTRY_INSTRUCTION_LEN");
pub const TPR_THRESHOLD: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x401C, "VmcsControl32::TPR_THRESHOLD");
pub const SECONDARY_PROCBASED_EXEC_CONTROLS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x401E, "VmcsControl32::SECONDARY_PROCBASED_EXEC_CONTROLS");
pub const PLE_GAP: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4020, "VmcsControl32::PLE_GAP");
pub const PLE_WINDOW: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4022, "VmcsControl32::PLE_WINDOW");
}
pub struct VmcsControlNW;
impl VmcsControlNW {
pub const CR0_GUEST_HOST_MASK: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6000, "VmcsControlNW::CR0_GUEST_HOST_MASK");
pub const CR4_GUEST_HOST_MASK: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6002, "VmcsControlNW::CR4_GUEST_HOST_MASK");
pub const CR0_READ_SHADOW: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6004, "VmcsControlNW::CR0_READ_SHADOW");
pub const CR4_READ_SHADOW: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6006, "VmcsControlNW::CR4_READ_SHADOW");
pub const CR3_TARGET_VALUE0: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6008, "VmcsControlNW::CR3_TARGET_VALUE0");
pub const CR3_TARGET_VALUE1: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x600A, "VmcsControlNW::CR3_TARGET_VALUE1");
pub const CR3_TARGET_VALUE2: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x600C, "VmcsControlNW::CR3_TARGET_VALUE2");
pub const CR3_TARGET_VALUE3: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x600E, "VmcsControlNW::CR3_TARGET_VALUE3");
}
pub struct VmcsGuest16;
impl VmcsGuest16 {
pub const ES_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x800, "VmcsGuest16::ES_SELECTOR");
pub const CS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x802, "VmcsGuest16::CS_SELECTOR");
pub const SS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x804, "VmcsGuest16::SS_SELECTOR");
pub const DS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x806, "VmcsGuest16::DS_SELECTOR");
pub const FS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x808, "VmcsGuest16::FS_SELECTOR");
pub const GS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x80a, "VmcsGuest16::GS_SELECTOR");
pub const LDTR_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x80c, "VmcsGuest16::LDTR_SELECTOR");
pub const TR_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x80e, "VmcsGuest16::TR_SELECTOR");
pub const INTERRUPT_STATUS: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x810, "VmcsGuest16::INTERRUPT_STATUS");
pub const PML_INDEX: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0x812, "VmcsGuest16::PML_INDEX");
}
pub struct VmcsGuest64;
impl VmcsGuest64 {
pub const LINK_PTR: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2800, "VmcsGuest64::LINK_PTR");
pub const IA32_DEBUGCTL: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2802, "VmcsGuest64::IA32_DEBUGCTL");
pub const IA32_PAT: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2804, "VmcsGuest64::IA32_PAT");
pub const IA32_EFER: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2806, "VmcsGuest64::IA32_EFER");
pub const IA32_PERF_GLOBAL_CTRL: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2808, "VmcsGuest64::IA32_PERF_GLOBAL_CTRL");
pub const PDPTE0: VmcsField<u64, VmcsReadWrite> = VmcsField::new(0x280A, "VmcsGuest64::PDPTE0");
pub const PDPTE1: VmcsField<u64, VmcsReadWrite> = VmcsField::new(0x280C, "VmcsGuest64::PDPTE1");
pub const PDPTE2: VmcsField<u64, VmcsReadWrite> = VmcsField::new(0x280E, "VmcsGuest64::PDPTE2");
pub const PDPTE3: VmcsField<u64, VmcsReadWrite> = VmcsField::new(0x2810, "VmcsGuest64::PDPTE3");
pub const IA32_BNDCFGS: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2812, "VmcsGuest64::IA32_BNDCFGS");
pub const IA32_RTIT_CTL: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2814, "VmcsGuest64::IA32_RTIT_CTL");
}
pub struct VmcsGuest32;
impl VmcsGuest32 {
pub const ES_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4800, "VmcsGuest32::ES_LIMIT");
pub const CS_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4802, "VmcsGuest32::CS_LIMIT");
pub const SS_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4804, "VmcsGuest32::SS_LIMIT");
pub const DS_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4806, "VmcsGuest32::DS_LIMIT");
pub const FS_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4808, "VmcsGuest32::FS_LIMIT");
pub const GS_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x480A, "VmcsGuest32::GS_LIMIT");
pub const LDTR_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x480C, "VmcsGuest32::LDTR_LIMIT");
pub const TR_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x480E, "VmcsGuest32::TR_LIMIT");
pub const GDTR_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4810, "VmcsGuest32::GDTR_LIMIT");
pub const IDTR_LIMIT: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4812, "VmcsGuest32::IDTR_LIMIT");
pub const ES_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4814, "VmcsGuest32::ES_ACCESS_RIGHTS");
pub const CS_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4816, "VmcsGuest32::CS_ACCESS_RIGHTS");
pub const SS_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4818, "VmcsGuest32::SS_ACCESS_RIGHTS");
pub const DS_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x481A, "VmcsGuest32::DS_ACCESS_RIGHTS");
pub const FS_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x481C, "VmcsGuest32::FS_ACCESS_RIGHTS");
pub const GS_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x481E, "VmcsGuest32::GS_ACCESS_RIGHTS");
pub const LDTR_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4820, "VmcsGuest32::LDTR_ACCESS_RIGHTS");
pub const TR_ACCESS_RIGHTS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4822, "VmcsGuest32::TR_ACCESS_RIGHTS");
pub const INTERRUPTIBILITY_STATE: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4824, "VmcsGuest32::INTERRUPTIBILITY_STATE");
pub const ACTIVITY_STATE: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4826, "VmcsGuest32::ACTIVITY_STATE");
pub const SMBASE: VmcsField<u32, VmcsReadWrite> = VmcsField::new(0x4828, "VmcsGuest32::SMBASE");
pub const IA32_SYSENTER_CS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x482A, "VmcsGuest32::IA32_SYSENTER_CS");
pub const VMX_PREEMPTION_TIMER_VALUE: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x482E, "VmcsGuest32::VMX_PREEMPTION_TIMER_VALUE");
}
pub struct VmcsGuestNW;
impl VmcsGuestNW {
pub const CR0: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6800, "VmcsGuestNW::CR0");
pub const CR3: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6802, "VmcsGuestNW::CR3");
pub const CR4: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6804, "VmcsGuestNW::CR4");
pub const ES_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6806, "VmcsGuestNW::ES_BASE");
pub const CS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6808, "VmcsGuestNW::CS_BASE");
pub const SS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x680A, "VmcsGuestNW::SS_BASE");
pub const DS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x680C, "VmcsGuestNW::DS_BASE");
pub const FS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x680E, "VmcsGuestNW::FS_BASE");
pub const GS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6810, "VmcsGuestNW::GS_BASE");
pub const LDTR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6812, "VmcsGuestNW::LDTR_BASE");
pub const TR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6814, "VmcsGuestNW::TR_BASE");
pub const GDTR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6816, "VmcsGuestNW::GDTR_BASE");
pub const IDTR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6818, "VmcsGuestNW::IDTR_BASE");
pub const DR7: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x681A, "VmcsGuestNW::DR7");
pub const RSP: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x681C, "VmcsGuestNW::RSP");
pub const RIP: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x681E, "VmcsGuestNW::RIP");
pub const RFLAGS: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6820, "VmcsGuestNW::RFLAGS");
pub const PENDING_DBG_EXCEPTIONS: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6822, "VmcsGuestNW::PENDING_DBG_EXCEPTIONS");
pub const IA32_SYSENTER_ESP: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6824, "VmcsGuestNW::IA32_SYSENTER_ESP");
pub const IA32_SYSENTER_EIP: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6826, "VmcsGuestNW::IA32_SYSENTER_EIP");
}
pub struct VmcsHost16;
impl VmcsHost16 {
pub const ES_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC00, "VmcsHost16::ES_SELECTOR");
pub const CS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC02, "VmcsHost16::CS_SELECTOR");
pub const SS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC04, "VmcsHost16::SS_SELECTOR");
pub const DS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC06, "VmcsHost16::DS_SELECTOR");
pub const FS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC08, "VmcsHost16::FS_SELECTOR");
pub const GS_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC0A, "VmcsHost16::GS_SELECTOR");
pub const TR_SELECTOR: VmcsField<u16, VmcsReadWrite> =
VmcsField::new(0xC0C, "VmcsHost16::TR_SELECTOR");
}
pub struct VmcsHost64;
impl VmcsHost64 {
pub const IA32_PAT: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2C00, "VmcsHost64::IA32_PAT");
pub const IA32_EFER: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2C02, "VmcsHost64::IA32_EFER");
pub const IA32_PERF_GLOBAL_CTRL: VmcsField<u64, VmcsReadWrite> =
VmcsField::new(0x2C04, "VmcsHost64::IA32_PERF_GLOBAL_CTRL");
}
pub struct VmcsHost32;
impl VmcsHost32 {
pub const IA32_SYSENTER_CS: VmcsField<u32, VmcsReadWrite> =
VmcsField::new(0x4C00, "VmcsHost32::IA32_SYSENTER_CS");
}
pub struct VmcsHostNW;
impl VmcsHostNW {
pub const CR0: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6C00, "VmcsHostNW::CR0");
pub const CR3: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6C02, "VmcsHostNW::CR3");
pub const CR4: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6C04, "VmcsHostNW::CR4");
pub const FS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C06, "VmcsHostNW::FS_BASE");
pub const GS_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C08, "VmcsHostNW::GS_BASE");
pub const TR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C0A, "VmcsHostNW::TR_BASE");
pub const GDTR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C0C, "VmcsHostNW::GDTR_BASE");
pub const IDTR_BASE: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C0E, "VmcsHostNW::IDTR_BASE");
pub const IA32_SYSENTER_ESP: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C10, "VmcsHostNW::IA32_SYSENTER_ESP");
pub const IA32_SYSENTER_EIP: VmcsField<usize, VmcsReadWrite> =
VmcsField::new(0x6C12, "VmcsHostNW::IA32_SYSENTER_EIP");
pub const RSP: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6C14, "VmcsHostNW::RSP");
pub const RIP: VmcsField<usize, VmcsReadWrite> = VmcsField::new(0x6C16, "VmcsHostNW::RIP");
}
pub struct VmcsReadOnly64;
impl VmcsReadOnly64 {
pub const GUEST_PHYSICAL_ADDR: VmcsField<u64, VmcsReadOnly> =
VmcsField::new(0x2400, "VmcsReadOnly64::GUEST_PHYSICAL_ADDR");
}
pub struct VmcsReadOnly32;
impl VmcsReadOnly32 {
pub const VM_INSTRUCTION_ERROR: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x4400, "VmcsReadOnly32::VM_INSTRUCTION_ERROR");
pub const EXIT_REASON: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x4402, "VmcsReadOnly32::EXIT_REASON");
pub const VMEXIT_INTERRUPTION_INFO: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x4404, "VmcsReadOnly32::VMEXIT_INTERRUPTION_INFO");
pub const VMEXIT_INTERRUPTION_ERR_CODE: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x4406, "VmcsReadOnly32::VMEXIT_INTERRUPTION_ERR_CODE");
pub const IDT_VECTORING_INFO: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x4408, "VmcsReadOnly32::IDT_VECTORING_INFO");
pub const IDT_VECTORING_ERR_CODE: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x440A, "VmcsReadOnly32::IDT_VECTORING_ERR_CODE");
pub const VMEXIT_INSTRUCTION_LEN: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x440C, "VmcsReadOnly32::VMEXIT_INSTRUCTION_LEN");
pub const VMEXIT_INSTRUCTION_INFO: VmcsField<u32, VmcsReadOnly> =
VmcsField::new(0x440E, "VmcsReadOnly32::VMEXIT_INSTRUCTION_INFO");
}
pub struct VmcsReadOnlyNW;
impl VmcsReadOnlyNW {
pub const EXIT_QUALIFICATION: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x6400, "VmcsReadOnlyNW::EXIT_QUALIFICATION");
pub const IO_RCX: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x6402, "VmcsReadOnlyNW::IO_RCX");
pub const IO_RSI: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x6404, "VmcsReadOnlyNW::IO_RSI");
pub const IO_RDI: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x6406, "VmcsReadOnlyNW::IO_RDI");
pub const IO_RIP: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x6408, "VmcsReadOnlyNW::IO_RIP");
pub const GUEST_LINEAR_ADDR: VmcsField<usize, VmcsReadOnly> =
VmcsField::new(0x640A, "VmcsReadOnlyNW::GUEST_LINEAR_ADDR");
}