use crate::KVM_STATE_NESTED_SVM_VMCB_SIZE;
use crate::{KVM_STATE_NESTED_VMX_VMCS_SIZE, kvm_nested_state__bindgen_ty_1};
use core::mem;
#[derive(Clone, Copy)]
#[cfg_attr(feature = "serde", derive(zerocopy::Immutable, zerocopy::FromBytes))]
#[repr(C)]
pub union kvm_nested_state__data {
pub vmx: kvm_vmx_nested_state_data,
pub svm: kvm_svm_nested_state_data,
}
impl Default for kvm_nested_state__data {
fn default() -> Self {
unsafe { mem::zeroed() }
}
}
#[derive(Clone, Copy)]
#[cfg_attr(
feature = "serde",
derive(zerocopy::IntoBytes, zerocopy::Immutable, zerocopy::FromBytes)
)]
#[repr(C)]
pub struct kvm_vmx_nested_state_data {
pub vmcs12: [u8; KVM_STATE_NESTED_VMX_VMCS_SIZE as usize],
pub shadow_vmcs12: [u8; KVM_STATE_NESTED_VMX_VMCS_SIZE as usize],
}
#[derive(Clone, Copy)]
#[cfg_attr(
feature = "serde",
derive(zerocopy::IntoBytes, zerocopy::Immutable, zerocopy::FromBytes)
)]
#[repr(C)]
pub struct kvm_svm_nested_state_data {
pub vmcb12: [u8; KVM_STATE_NESTED_SVM_VMCB_SIZE as usize],
}
#[derive(Clone, Copy)]
#[cfg_attr(
feature = "serde",
derive(zerocopy::IntoBytes, zerocopy::Immutable, zerocopy::FromBytes)
)]
#[repr(C)]
#[non_exhaustive] pub struct KvmNestedStateBuffer {
pub flags: u16,
pub format: u16,
pub size: u32,
pub hdr: kvm_nested_state__bindgen_ty_1,
pub data: kvm_nested_state__data,
}
impl KvmNestedStateBuffer {
pub fn empty() -> Self {
let mut this: KvmNestedStateBuffer = unsafe { mem::zeroed() };
this.size = size_of::<Self>() as u32;
this
}
}
impl Default for KvmNestedStateBuffer {
fn default() -> Self {
Self::empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::kvm_nested_state as kvm_nested_state_raw_binding;
#[test]
fn test_layout() {
assert_eq!(
align_of::<kvm_nested_state_raw_binding>(),
align_of::<KvmNestedStateBuffer>()
);
assert!(size_of::<KvmNestedStateBuffer>() > size_of::<kvm_nested_state_raw_binding>());
assert_eq!(size_of::<KvmNestedStateBuffer>(), 8320);
}
}