mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
hypervisor: Make (de)serialize for XsaveState backward compatible
Signed-off-by: Bo Chen <chen.bo@intel.com>
This commit is contained in:
@@ -312,10 +312,10 @@ pub struct MsrEntry {
|
|||||||
pub data: u64,
|
pub data: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
#[serde_with::serde_as]
|
#[serde_with::serde_as]
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct XsaveState {
|
pub struct XsaveState {
|
||||||
#[serde_as(as = "[_; 1024usize]")]
|
|
||||||
pub region: [u32; 1024usize],
|
pub region: [u32; 1024usize],
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,3 +325,26 @@ impl Default for XsaveState {
|
|||||||
unsafe { ::std::mem::zeroed() }
|
unsafe { ::std::mem::zeroed() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'de> serde::Deserialize<'de> for XsaveState {
|
||||||
|
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let region: Vec<u32> = 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<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
let region = &self.region[..];
|
||||||
|
region.serialize(serializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user