#![allow(non_camel_case_types)]
#[cfg(target_arch = "x86_64")]
use crate::x86_64::*;
#[cfg(target_arch = "aarch64")]
use crate::aarch64::*;
#[derive(Debug)]
pub enum SchedOp {
r#yield,
block,
shutdown,
poll,
remote_shutdown,
shutdown_code,
watchdog,
pin_override,
}
#[derive(Debug)]
pub enum ConsoleIO {
Write,
Read,
}
macro_rules! hypercall {
($op:expr, $a1:expr) => {
$crate::hypercall_1($op, $a1 as u64)
};
($op:expr, $a1:expr, $a2:expr) => {
$crate::hypercall_2($op, $a1 as u64, $a2 as u64)
};
($op:expr, $a1:expr, $a2:expr, $a3:expr) => {
$crate::hypercall_3($op, $a1 as u64, $a2 as u64, $a3 as u64)
};
($op:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {
$crate::hypercall_4($op, $a1 as u64, $a2 as u64, $a3 as u64, $a4 as u64)
};
($op:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => {
$crate::hypercall_5(
$op, $a1 as u64, $a2 as u64, $a3 as u64, $a4 as u64, $a5 as u64,
)
};
}
pub unsafe fn console_io(mode: ConsoleIO, buf: &[u8]) -> i64 {
match mode {
ConsoleIO::Write => hypercall!(
__HYPERVISOR_console_io,
CONSOLEIO_write,
buf.len() as u64,
buf.as_ptr() as u64
),
ConsoleIO::Read => hypercall!(
__HYPERVISOR_console_io,
CONSOLEIO_read,
buf.len() as u64,
buf.as_ptr() as u64
),
}
}
#[cfg(target_arch = "x86_64")]
pub unsafe fn sched_op(mode: SchedOp, data: u32) {
match mode {
SchedOp::r#yield => hypercall!(__HYPERVISOR_sched_op, SCHEDOP_yield, data as u64),
SchedOp::shutdown => hypercall!(__HYPERVISOR_sched_op, SCHEDOP_shutdown, data as u64),
_ => panic!(),
};
}
#[cfg(target_arch = "aarch64")]
pub unsafe fn sched_op(mode: SchedOp, data: u32) {
let address = &data as *const u32;
match mode {
SchedOp::r#yield => hypercall!(__HYPERVISOR_sched_op, SCHEDOP_yield, address as u64),
SchedOp::shutdown => hypercall!(__HYPERVISOR_sched_op, SCHEDOP_shutdown, address as u64),
_ => panic!(),
};
}