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