diff --git a/hypervisor/src/arch/x86/mod.rs b/hypervisor/src/arch/x86/mod.rs index 72b57072f..b7d7f7733 100644 --- a/hypervisor/src/arch/x86/mod.rs +++ b/hypervisor/src/arch/x86/mod.rs @@ -312,10 +312,10 @@ pub struct MsrEntry { pub data: u64, } +#[repr(C)] #[serde_with::serde_as] -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[derive(Debug, Clone)] pub struct XsaveState { - #[serde_as(as = "[_; 1024usize]")] pub region: [u32; 1024usize], } @@ -325,3 +325,26 @@ impl Default for XsaveState { unsafe { ::std::mem::zeroed() } } } + +impl<'de> serde::Deserialize<'de> for XsaveState { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + let region: Vec = Vec::deserialize(deserializer)?; + let mut val: XsaveState = XsaveState::default(); + // This panics if the source and destination have different lengths. + val.region.copy_from_slice(®ion[..]); + Ok(val) + } +} + +impl serde::Serialize for XsaveState { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let region = &self.region[..]; + region.serialize(serializer) + } +}