From de6d6f255873f3a018bc33e59a5829ec09191a97 Mon Sep 17 00:00:00 2001 From: Bo Chen Date: Mon, 11 Mar 2024 15:05:17 -0700 Subject: [PATCH] hypervisor: Make (de)serialize for XsaveState backward compatible Signed-off-by: Bo Chen --- hypervisor/src/arch/x86/mod.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) 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) + } +}