-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
moved present uhyve interface into v1 folder
- Loading branch information
1 parent
c0a8bac
commit 5f26fb2
Showing
9 changed files
with
138 additions
and
146 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
//! # Uhyve Hypervisor Interface V1 | ||
//! | ||
//! The Uhyve hypercall interface works as follows: | ||
//! | ||
//! - On `x86_64` you use an out port instruction. The address of the `out`-port corresponds to the | ||
//! hypercall you want to use. You can obtain it from the [`HypercallAddress`](v1::HypercallAddress) enum. The data send to | ||
//! that port is the physical memory address (of the VM) of the parameters of that hypercall. | ||
//! - On `aarch64` you write to the respective [`HypercallAddress`](v1::HypercallAddress). The 64-bit value written to that location is the guest's physical memory address of the hypercall's parameter. | ||
// TODO: Throw this out, once https://github.com/rust-lang/rfcs/issues/2783 or https://github.com/rust-lang/rust/issues/86772 is resolved | ||
|
||
use num_enum::TryFromPrimitive; | ||
|
||
pub mod parameters; | ||
use crate::v1::parameters::*; | ||
|
||
/// Enum containing all valid port mappings for hypercalls. | ||
/// | ||
/// The discriminants of this enum are the respective ports, so one can get the code by calling | ||
/// e.g., `HypercallPorts::FileWrite as u16`. | ||
#[non_exhaustive] | ||
#[repr(u16)] | ||
#[derive(Debug, Eq, PartialEq, TryFromPrimitive)] | ||
pub enum HypercallAddress { | ||
/// Port address = `0x400` | ||
FileWrite = 0x400, | ||
/// Port address = `0x440` | ||
FileOpen = 0x440, | ||
/// Port address = `0x480` | ||
FileClose = 0x480, | ||
/// Port address = `0x500` | ||
FileRead = 0x500, | ||
/// Port address = `0x540` | ||
Exit = 0x540, | ||
/// Port address = `0x580` | ||
FileLseek = 0x580, | ||
#[deprecated = "was never really in use"] | ||
/// Port address = `0x640` | ||
Netwrite = 0x640, | ||
#[deprecated = "was never really in use"] | ||
/// Port address = `0x680` | ||
Netread = 0x680, | ||
#[deprecated = "was never really in use"] | ||
/// Port address = `0x700` | ||
Netstat = 0x700, | ||
/// Port address = `0x740` | ||
Cmdsize = 0x740, | ||
/// Port address = `0x780` | ||
Cmdval = 0x780, | ||
/// Port address = `0x800` | ||
Uart = 0x800, | ||
/// Port address = `0x840` | ||
FileUnlink = 0x840, | ||
/// Port address = `0x880` | ||
SerialBufferWrite = 0x880, | ||
} | ||
impl From<Hypercall<'_>> for HypercallAddress { | ||
fn from(value: Hypercall) -> Self { | ||
match value { | ||
Hypercall::Cmdsize(_) => Self::Cmdsize, | ||
Hypercall::Cmdval(_) => Self::Cmdval, | ||
Hypercall::Exit(_) => Self::Exit, | ||
Hypercall::FileClose(_) => Self::FileClose, | ||
Hypercall::FileLseek(_) => Self::FileLseek, | ||
Hypercall::FileOpen(_) => Self::FileOpen, | ||
Hypercall::FileRead(_) => Self::FileRead, | ||
Hypercall::FileWrite(_) => Self::FileWrite, | ||
Hypercall::FileUnlink(_) => Self::FileUnlink, | ||
Hypercall::SerialWriteByte(_) => Self::Uart, | ||
Hypercall::SerialWriteBuffer(_) => Self::SerialBufferWrite, | ||
} | ||
} | ||
} | ||
|
||
/// Hypervisor calls available in Uhyve with their respective parameters. See the [module level documentation](crate) on how to invoke them. | ||
#[non_exhaustive] | ||
#[derive(Debug)] | ||
pub enum Hypercall<'a> { | ||
/// Get the size of the argument and environment strings. Used to allocate memory for | ||
/// [`Hypercall::Cmdval`]. | ||
Cmdsize(&'a mut CmdsizeParams), | ||
/// Copy the argument and environment strings into the VM. Usually preceeeded by | ||
/// [`Hypercall::Cmdsize`] so that the guest can allocate the memory for this call. | ||
Cmdval(&'a CmdvalParams), | ||
/// Exit the VM and return a status. | ||
Exit(&'a ExitParams), | ||
FileClose(&'a mut CloseParams), | ||
FileLseek(&'a mut LseekParams), | ||
FileOpen(&'a mut OpenParams), | ||
FileRead(&'a mut ReadParams), | ||
FileWrite(&'a WriteParams), | ||
FileUnlink(&'a mut UnlinkParams), | ||
/// Write a char to the terminal. | ||
SerialWriteByte(u8), | ||
/// Write a buffer to the terminal. | ||
SerialWriteBuffer(&'a SerialWriteBufferParams), | ||
} | ||
impl<'a> Hypercall<'a> { | ||
/// Get a hypercall's port address. | ||
pub fn port(self) -> u16 { | ||
HypercallAddress::from(self) as u16 | ||
} | ||
} | ||
|
||
// Networkports (not used at the moment) | ||
// TODO: Remove this | ||
pub const UHYVE_PORT_NETWRITE: u16 = 0x640; | ||
|
||
// FIXME: Do not use a fix number of arguments | ||
/// The maximum number of items in an argument of environment vector. | ||
pub const MAX_ARGC_ENVC: usize = 128; |
Oops, something went wrong.