1use crate::config::DeviceVtl;
7use guid::Guid;
8use mesh::CancelContext;
9use mesh::MeshPayload;
10use mesh::error::RemoteError;
11use mesh::payload::message::ProtobufMessage;
12use mesh::rpc::FailableRpc;
13use mesh::rpc::Rpc;
14use std::fmt;
15use std::fs::File;
16use vm_resource::Resource;
17use vm_resource::kind::VmbusDeviceHandleKind;
18
19#[derive(MeshPayload)]
20pub enum VmRpc {
21 Save(FailableRpc<(), ProtobufMessage>),
22 Resume(Rpc<(), bool>),
23 Pause(Rpc<(), bool>),
24 ClearHalt(Rpc<(), bool>),
25 Reset(FailableRpc<(), ()>),
26 Nmi(Rpc<u32, ()>),
27 AddVmbusDevice(FailableRpc<(DeviceVtl, Resource<VmbusDeviceHandleKind>), ()>),
28 ConnectHvsock(FailableRpc<(CancelContext, Guid, DeviceVtl), unix_socket::UnixStream>),
29 PulseSaveRestore(Rpc<(), Result<(), PulseSaveRestoreError>>),
30 StartReloadIgvm(FailableRpc<File, ()>),
31 CompleteReloadIgvm(FailableRpc<bool, ()>),
32 ReadMemory(FailableRpc<(u64, usize), Vec<u8>>),
33 WriteMemory(FailableRpc<(u64, Vec<u8>), ()>),
34}
35
36#[derive(Debug, MeshPayload, thiserror::Error)]
37pub enum PulseSaveRestoreError {
38 #[error("reset not supported")]
39 ResetNotSupported,
40 #[error("pulse save+restore failed")]
41 Other(#[source] RemoteError),
42}
43
44impl From<anyhow::Error> for PulseSaveRestoreError {
45 fn from(err: anyhow::Error) -> Self {
46 Self::Other(RemoteError::new(err))
47 }
48}
49
50impl fmt::Debug for VmRpc {
51 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52 let s = match self {
53 VmRpc::Reset(_) => "Reset",
54 VmRpc::Save(_) => "Save",
55 VmRpc::Resume(_) => "Resume",
56 VmRpc::Pause(_) => "Pause",
57 VmRpc::ClearHalt(_) => "ClearHalt",
58 VmRpc::Nmi(_) => "Nmi",
59 VmRpc::AddVmbusDevice(_) => "AddVmbusDevice",
60 VmRpc::ConnectHvsock(_) => "ConnectHvsock",
61 VmRpc::PulseSaveRestore(_) => "PulseSaveRestore",
62 VmRpc::StartReloadIgvm(_) => "StartReloadIgvm",
63 VmRpc::CompleteReloadIgvm(_) => "CompleteReloadIgvm",
64 VmRpc::ReadMemory(_) => "ReadMemory",
65 VmRpc::WriteMemory(_) => "WriteMemory",
66 };
67 f.pad(s)
68 }
69}