use {
crate::error::HypervisorError,
alloc::boxed::Box,
core::mem::size_of,
static_assertions::const_assert_eq,
};
pub const KERNEL_STACK_SIZE: usize = 0x6000;
pub const STACK_CONTENTS_SIZE: usize = KERNEL_STACK_SIZE - size_of::<*mut u64>() * 4;
#[repr(C, align(4096))]
#[derive(Debug, Clone, Copy)]
pub struct VmStack {
pub stack_contents: [u8; STACK_CONTENTS_SIZE],
pub vmx: *mut u64,
pub padding_3: u64,
pub padding_2: u64,
pub padding_1: u64,
}
unsafe impl Send for VmStack {}
unsafe impl Sync for VmStack {}
const_assert_eq!(size_of::<VmStack>(), KERNEL_STACK_SIZE);
const_assert_eq!(size_of::<VmStack>() % 4096, 0);
impl VmStack {
pub fn setup(vmstack: &mut Box<VmStack, impl core::alloc::Allocator>) -> Result<(), HypervisorError> {
log::debug!("Setting up VMCS_HOST_RSP region");
log::trace!("VMCS_HOST_RSP Virtual Address: {:p}", vmstack);
vmstack.stack_contents = [0u8; STACK_CONTENTS_SIZE];
vmstack.padding_3 = u64::MAX;
vmstack.padding_2 = u64::MAX;
vmstack.padding_1 = u64::MAX;
log::debug!("VMCS_HOST_RSP setup successfully!");
Ok(())
}
}