hypervisor: use serde_with with LapicState

Drop the hand-rolled serializer and deserializer.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu
2022-07-28 11:18:08 +00:00
committed by Liu Wei
parent bec47ebcc9
commit e1a70f676a
3 changed files with 74 additions and 24 deletions

View File

@@ -252,8 +252,10 @@ pub struct FpuState {
pub mxcsr: u32,
}
#[derive(Debug, Clone)]
#[serde_with::serde_as]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct LapicState {
#[serde_as(as = "[_; 1024usize]")]
pub(crate) regs: [::std::os::raw::c_char; 1024usize],
}
@@ -264,29 +266,6 @@ impl Default for LapicState {
}
}
impl<'de> serde::Deserialize<'de> for LapicState {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let regs: Vec<::std::os::raw::c_char> = Vec::deserialize(deserializer)?;
let mut val = LapicState::default();
// This panics if the source and destination have different lengths.
val.regs.copy_from_slice(&regs[..]);
Ok(val)
}
}
impl serde::Serialize for LapicState {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let regs = &self.regs[..];
regs.serialize(serializer)
}
}
impl LapicState {
pub fn get_klapic_reg(&self, reg_offset: usize) -> u32 {
use byteorder::{LittleEndian, ReadBytesExt};