1#![cfg_attr(not(feature = "std"), no_std)]
11
12use num_enum::TryFromPrimitive;
14
15pub mod parameters;
16
17pub use memory_addresses::{PhysAddr as GuestPhysAddr, VirtAddr as GuestVirtAddr};
18
19#[cfg(not(target_pointer_width = "64"))]
20compile_error!("Using uhyve-interface on a non-64-bit system is not (yet?) supported");
21use parameters::*;
22
23pub const UHYVE_INTERFACE_VERSION: u32 = 1;
26
27#[non_exhaustive]
32#[repr(u16)]
33#[derive(Debug, Eq, PartialEq, TryFromPrimitive, Clone, Copy, Hash)]
34pub enum HypercallAddress {
35 FileWrite = 0x400,
37 FileOpen = 0x440,
39 FileClose = 0x480,
41 FileRead = 0x500,
43 Exit = 0x540,
45 FileLseek = 0x580,
47 #[deprecated = "was never really in use"]
48 Netwrite = 0x640,
50 #[deprecated = "was never really in use"]
51 Netread = 0x680,
53 #[deprecated = "was never really in use"]
54 Netstat = 0x700,
56 Cmdsize = 0x740,
58 Cmdval = 0x780,
60 Uart = 0x800,
62 FileUnlink = 0x840,
64 SerialBufferWrite = 0x880,
66}
67impl From<Hypercall<'_>> for HypercallAddress {
69 fn from(value: Hypercall) -> Self {
70 match value {
71 Hypercall::Cmdsize(_) => Self::Cmdsize,
72 Hypercall::Cmdval(_) => Self::Cmdval,
73 Hypercall::Exit(_) => Self::Exit,
74 Hypercall::FileClose(_) => Self::FileClose,
75 Hypercall::FileLseek(_) => Self::FileLseek,
76 Hypercall::FileOpen(_) => Self::FileOpen,
77 Hypercall::FileRead(_) => Self::FileRead,
78 Hypercall::FileWrite(_) => Self::FileWrite,
79 Hypercall::FileUnlink(_) => Self::FileUnlink,
80 Hypercall::SerialWriteByte(_) => Self::Uart,
81 Hypercall::SerialWriteBuffer(_) => Self::SerialBufferWrite,
82 }
83 }
84}
85impl From<&Hypercall<'_>> for HypercallAddress {
86 fn from(value: &Hypercall) -> Self {
87 match value {
88 Hypercall::Cmdsize(_) => Self::Cmdsize,
89 Hypercall::Cmdval(_) => Self::Cmdval,
90 Hypercall::Exit(_) => Self::Exit,
91 Hypercall::FileClose(_) => Self::FileClose,
92 Hypercall::FileLseek(_) => Self::FileLseek,
93 Hypercall::FileOpen(_) => Self::FileOpen,
94 Hypercall::FileRead(_) => Self::FileRead,
95 Hypercall::FileWrite(_) => Self::FileWrite,
96 Hypercall::FileUnlink(_) => Self::FileUnlink,
97 Hypercall::SerialWriteByte(_) => Self::Uart,
98 Hypercall::SerialWriteBuffer(_) => Self::SerialBufferWrite,
99 }
100 }
101}
102
103#[non_exhaustive]
105#[derive(Debug)]
106pub enum Hypercall<'a> {
107 Cmdsize(&'a mut CmdsizeParams),
110 Cmdval(&'a CmdvalParams),
113 Exit(&'a ExitParams),
115 FileClose(&'a mut CloseParams),
116 FileLseek(&'a mut LseekParams),
117 FileOpen(&'a mut OpenParams),
118 FileRead(&'a mut ReadParams),
119 FileWrite(&'a WriteParams),
120 FileUnlink(&'a mut UnlinkParams),
121 SerialWriteByte(u8),
123 SerialWriteBuffer(&'a SerialWriteBufferParams),
125}
126impl Hypercall<'_> {
127 pub fn port(&self) -> u16 {
130 HypercallAddress::from(self) as u16
131 }
132}
133
134pub const UHYVE_PORT_NETWRITE: u16 = 0x640;
137
138pub const MAX_ARGC_ENVC: usize = 128;