pub use crate::parameters::*;
use crate::{GuestPhysAddr, GuestVirtAddr, v1::MAX_ARGC_ENVC};
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct CmdsizeParams {
pub argc: i32,
pub argsz: [i32; MAX_ARGC_ENVC],
pub envc: i32,
pub envsz: [i32; MAX_ARGC_ENVC],
}
impl CmdsizeParams {
#[cfg(feature = "std")]
pub fn update(&mut self, path: &std::path::Path, args: &[String]) {
self.argc = 0;
self.argsz[0] = path.as_os_str().len() as i32 + 1;
self.argc += 1;
for argument in args {
self.argsz[(self.argc) as usize] = argument.len() as i32 + 1;
self.argc += 1;
}
self.envc = 0;
for (key, value) in std::env::vars_os() {
if self.envc < MAX_ARGC_ENVC.try_into().unwrap() {
self.envsz[self.envc as usize] = (key.len() + value.len()) as i32 + 2;
self.envc += 1;
} else {
log::warn!("Environment is too large! {key:?}={value:?} will not be passed!");
}
}
}
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct CmdvalParams {
pub argv: GuestPhysAddr,
pub envp: GuestPhysAddr,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct ExitParams {
pub arg: i32,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct UnlinkParams {
pub name: GuestPhysAddr,
pub ret: i32,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct WriteParams {
pub fd: i32,
pub buf: GuestVirtAddr,
pub len: usize,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct ReadParams {
pub fd: i32,
pub buf: GuestVirtAddr,
pub len: usize,
pub ret: isize,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct CloseParams {
pub fd: i32,
pub ret: i32,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct OpenParams {
pub name: GuestPhysAddr,
pub flags: i32,
pub mode: i32,
pub ret: i32,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct LseekParams {
pub fd: i32,
pub offset: isize,
pub whence: i32,
}
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
pub struct SerialWriteBufferParams {
pub buf: GuestPhysAddr,
pub len: usize,
}