From e1a70f676a822a051df207ffede287a81f034277 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 28 Jul 2022 11:18:08 +0000 Subject: [PATCH] hypervisor: use serde_with with LapicState Drop the hand-rolled serializer and deserializer. Signed-off-by: Wei Liu --- Cargo.lock | 70 ++++++++++++++++++++++++++++++++++ hypervisor/Cargo.toml | 1 + hypervisor/src/arch/x86/mod.rs | 27 ++----------- 3 files changed, 74 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8f727ae6..87e2edfbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -195,6 +195,41 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55626594feae15d266d52440b26ff77de0e22230cf0c113abe619084c1ddc910" +[[package]] +name = "darling" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "devices" version = "0.1.0" @@ -273,6 +308,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b643857cf70949306b81d7e92cb9d47add673868edac9863c4a49c42feaf3f1e" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "gdbstub" version = "0.6.2" @@ -350,6 +391,7 @@ dependencies = [ "mshv-bindings", "mshv-ioctls", "serde", + "serde_with", "thiserror", "vfio-ioctls", "vm-memory", @@ -366,6 +408,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indexmap" version = "1.9.1" @@ -939,6 +987,28 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89df7a26519371a3cce44fbb914c2819c84d9b897890987fa3ab096491cc0ea8" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de337f322382fcdfbb21a014f7c224ee041a23785651db67b9827403178f698f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "signal-hook" version = "0.3.14" diff --git a/hypervisor/Cargo.toml b/hypervisor/Cargo.toml index c36d63c4d..416e0ddfa 100644 --- a/hypervisor/Cargo.toml +++ b/hypervisor/Cargo.toml @@ -21,6 +21,7 @@ kvm-bindings = { git = "https://github.com/cloud-hypervisor/kvm-bindings", branc mshv-bindings = { git = "https://github.com/rust-vmm/mshv", branch = "main", features = ["with-serde", "fam-wrappers"], optional = true } mshv-ioctls = { git = "https://github.com/rust-vmm/mshv", branch = "main", optional = true} serde = { version = "1.0.140", features = ["rc", "derive"] } +serde_with = { version = "2.0.0", default-features = false, features = ["macros"] } vfio-ioctls = { git = "https://github.com/rust-vmm/vfio", branch = "main", default-features = false } vm-memory = { version = "0.8.0", features = ["backend-mmap", "backend-atomic"] } vmm-sys-util = { version = "0.10.0", features = ["with-serde"] } diff --git a/hypervisor/src/arch/x86/mod.rs b/hypervisor/src/arch/x86/mod.rs index 8bf0843cc..79d672284 100644 --- a/hypervisor/src/arch/x86/mod.rs +++ b/hypervisor/src/arch/x86/mod.rs @@ -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(deserializer: D) -> std::result::Result - 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(®s[..]); - Ok(val) - } -} - -impl serde::Serialize for LapicState { - fn serialize(&self, serializer: S) -> std::result::Result - 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};