vmm_core_defs/
debug_rpc.rs1use mesh::payload::Protobuf;
8pub use virt::x86::BreakpointSize;
9pub use virt::x86::BreakpointType;
10pub use virt::x86::DebugState;
11pub use virt::x86::HardwareBreakpoint;
12
13use mesh::MeshPayload;
14use mesh::rpc::FailableRpc;
15use virt::x86::SegmentRegister;
16
17#[derive(Debug, MeshPayload)]
18pub enum DebugRequest {
19 Attach,
21 Detach,
23 Resume {
25 response: mesh::OneshotSender<DebugStopReason>,
26 },
27 Break,
29 SetDebugState { vp: u32, state: DebugState },
31 GetVpState(FailableRpc<u32, Box<DebuggerVpState>>),
33 SetVpState(FailableRpc<(u32, Box<DebuggerVpState>), ()>),
35 ReadMemory(FailableRpc<(GuestAddress, usize), Vec<u8>>),
37 WriteMemory(FailableRpc<(GuestAddress, Vec<u8>), ()>),
39}
40
41#[derive(Debug, Protobuf)]
46pub enum DebuggerVpState {
47 X86_64(X86VpState),
48 Aarch64(Aarch64VpState),
49}
50
51#[derive(Debug, PartialEq, Eq, Protobuf)]
53pub struct X86VpState {
54 pub gp: [u64; 16],
55 pub rip: u64,
56 pub rflags: u64,
57 pub cr0: u64,
58 pub cr2: u64,
59 pub cr3: u64,
60 pub cr4: u64,
61 pub cr8: u64,
62 pub efer: u64,
63 pub kernel_gs_base: u64,
64 pub es: SegmentRegister,
65 pub cs: SegmentRegister,
66 pub ss: SegmentRegister,
67 pub ds: SegmentRegister,
68 pub fs: SegmentRegister,
69 pub gs: SegmentRegister,
70}
71
72#[derive(Debug, PartialEq, Eq, Protobuf)]
73pub struct Aarch64VpState {
74 pub x: [u64; 31],
75 pub sp_el0: u64,
76 pub sp_el1: u64,
77 pub pc: u64,
78 pub cpsr: u64,
79 pub sctlr_el1: u64,
80 pub tcr_el1: u64,
81 pub ttbr0_el1: u64,
82 pub ttbr1_el1: u64,
83}
84
85#[derive(Debug, MeshPayload)]
87pub enum GuestAddress {
88 Gva { vp: u32, gva: u64 },
90 Gpa(u64),
92}
93
94#[derive(MeshPayload, Debug)]
95pub enum DebugStopReason {
96 Break,
98 PowerOff,
100 Reset,
102 TripleFault { vp: u32 },
104 SingleStep { vp: u32 },
106 HwBreakpoint {
108 vp: u32,
109 breakpoint: HardwareBreakpoint,
110 },
111}