#![cfg_attr(substrate_runtime, no_std)]
mod forwarder;
mod host_functions;
pub mod tests;
pub use crate::tests::run as run_tests;
pub use forwarder::{Execution, Instance, Module};
#[cfg(not(substrate_runtime))]
pub use host_functions::{ExecBuffer, ExecStatus, VirtManagerBackend, VirtManagerExt};
#[cfg(not(substrate_runtime))]
#[doc(inline)]
pub use host_functions::virtualization::HostFunctions;
use num_enum::{IntoPrimitive, TryFromPrimitive};
pub const LOG_TARGET: &str = "virtualization";
pub const MAX_SYSCALL_SYMBOL_LEN: usize = 32;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(transparent)]
pub struct ModuleId(u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(transparent)]
pub struct InstanceId(u32);
#[derive(Debug, PartialEq, Eq)]
pub enum ExecResult<V, I> {
Finished {
instance: V,
gas_left: i64,
},
Syscall {
execution: I,
gas_left: i64,
syscall_symbol: SyscallSymbol,
a0: u64,
a1: u64,
a2: u64,
a3: u64,
a4: u64,
a5: u64,
},
Error {
instance: V,
error: ExecError,
},
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[repr(C)]
pub struct SyscallSymbol {
bytes: [u8; MAX_SYSCALL_SYMBOL_LEN],
len: u64,
}
impl SyscallSymbol {
pub fn new(bytes: &[u8]) -> Option<Self> {
if bytes.len() > MAX_SYSCALL_SYMBOL_LEN {
return None;
}
let mut buf = [0u8; MAX_SYSCALL_SYMBOL_LEN];
buf[..bytes.len()].copy_from_slice(bytes);
Some(Self { bytes: buf, len: bytes.len() as u64 })
}
}
impl AsRef<[u8]> for SyscallSymbol {
fn as_ref(&self) -> &[u8] {
&self.bytes[..self.len as usize]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, TryFromPrimitive, IntoPrimitive)]
#[repr(u8)]
pub enum CompileStatus {
Cached = 0,
Compiled = 1,
}
#[derive(TryFromPrimitive, IntoPrimitive, strum::EnumCount, Debug, PartialEq, Eq)]
#[repr(i32)]
pub enum ModuleError {
InvalidImage = -1,
NotCached = -2,
NotFound = -3,
}
#[derive(TryFromPrimitive, IntoPrimitive, strum::EnumCount, Debug, PartialEq, Eq)]
#[repr(i32)]
pub enum InstantiateError {
InvalidImage = -1,
InvalidModule = -2,
}
#[derive(TryFromPrimitive, IntoPrimitive, strum::EnumCount, Debug, PartialEq, Eq)]
#[repr(i32)]
pub enum ExecError {
InvalidInstance = -1,
InvalidImage = -2,
OutOfGas = -3,
Trap = -4,
}
#[derive(TryFromPrimitive, IntoPrimitive, strum::EnumCount, Debug, PartialEq, Eq)]
#[repr(i32)]
pub enum MemoryError {
InvalidInstance = -1,
OutOfBounds = -2,
}
#[derive(TryFromPrimitive, IntoPrimitive, strum::EnumCount, Debug, PartialEq, Eq)]
#[repr(i32)]
pub enum DestroyError {
InvalidInstance = -1,
}