diff --git a/Cargo.lock b/Cargo.lock index 27e6b55..5e450dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1106,6 +1106,7 @@ dependencies = [ "vm-aarch64", "vm-fdt", "vm-mm", + "vm-snapshot", ] [[package]] @@ -1168,6 +1169,13 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "vm-snapshot" +version = "0.1.0" +dependencies = [ + "thiserror", +] + [[package]] name = "vm-virtio" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 8336c76..f347f89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ vm-device = { path = "crates/vm-device" } vm-fdt = "0.3.0" vm-mm = { path = "crates/vm-mm" } vm-pci = { path = "crates/vm-pci" } +vm-snapshot = { path = "crates/vm-snapshot" } vm-virtio = { path = "crates/vm-virtio" } vm-vmm = { path = "crates/vm-vmm" } zerocopy = { version = "0.8.33", features = ["derive"] } diff --git a/crates/vm-core/Cargo.toml b/crates/vm-core/Cargo.toml index 19a9a52..2070719 100644 --- a/crates/vm-core/Cargo.toml +++ b/crates/vm-core/Cargo.toml @@ -17,6 +17,7 @@ thiserror = { workspace = true } tokio = { workspace = true } vm-fdt = { workspace = true } vm-mm = { workspace = true } +vm-snapshot = { workspace = true } [target.'cfg(target_arch = "aarch64")'.dependencies] vm-aarch64 = { workspace = true } diff --git a/crates/vm-core/src/device.rs b/crates/vm-core/src/device.rs index 169ef88..2ddd5ed 100644 --- a/crates/vm-core/src/device.rs +++ b/crates/vm-core/src/device.rs @@ -1,6 +1,17 @@ +use vm_snapshot::ops::Pausable; +use vm_snapshot::ops::Snapshotable; + pub mod mmio; pub mod pio; pub trait Device: Send + Sync { fn name(&self) -> String; + + fn support_pause(&mut self) -> Option<&mut dyn Pausable> { + None + } + + fn support_snapshot(&mut self) -> Option<&mut dyn Snapshotable> { + None + } } diff --git a/crates/vm-snapshot/Cargo.toml b/crates/vm-snapshot/Cargo.toml new file mode 100644 index 0000000..4d1750e --- /dev/null +++ b/crates/vm-snapshot/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "vm-snapshot" +version = "0.1.0" +edition = "2024" + +[dependencies] +thiserror = { workspace = true } diff --git a/crates/vm-snapshot/src/lib.rs b/crates/vm-snapshot/src/lib.rs new file mode 100644 index 0000000..af83854 --- /dev/null +++ b/crates/vm-snapshot/src/lib.rs @@ -0,0 +1,3 @@ +#![deny(warnings)] + +pub mod ops; diff --git a/crates/vm-snapshot/src/ops.rs b/crates/vm-snapshot/src/ops.rs new file mode 100644 index 0000000..10c6ee8 --- /dev/null +++ b/crates/vm-snapshot/src/ops.rs @@ -0,0 +1,22 @@ +use std::io::Read; +use std::io::Write; + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum Error { + #[error("IO error: {0}")] + Io(#[from] std::io::Error), +} + +pub trait Pausable { + fn pause(&mut self) -> Result<(), Error>; + + fn resume(&mut self) -> Result<(), Error>; +} + +pub trait Snapshotable { + fn save(&self, writer: &mut dyn Write) -> Result, Error>; + + fn restore(&mut self, reader: &mut dyn Read) -> Result<(), Error>; +}