use crate::{call, sys, Error, Vm};
use std::sync::Arc;
#[cfg(target_arch = "x86_64")]
pub type Id = sys::hv_vcpuid_t;
#[cfg(target_arch = "aarch64")]
pub type Id = sys::hv_vcpu_t;
pub struct Vcpu {
#[allow(dead_code)] vm: Arc<Vm>,
pub(crate) id: Id,
#[cfg(target_arch = "aarch64")]
pub(crate) exit: *const sys::hv_vcpu_exit_t,
}
impl Vcpu {
pub(crate) fn new(vm: Arc<Vm>) -> Result<Vcpu, Error> {
#[cfg(target_arch = "x86_64")]
{
let mut id = 0;
call!(sys::hv_vcpu_create(&mut id, 0))?;
Ok(Vcpu { vm, id })
}
#[cfg(target_arch = "aarch64")]
{
let mut id = 0;
let mut exit = std::ptr::null_mut();
call!(sys::hv_vcpu_create(
&mut id,
&mut exit,
std::ptr::null_mut()
))?;
Ok(Vcpu { vm, id, exit })
}
}
pub fn run(&self) -> Result<(), Error> {
call!(sys::hv_vcpu_run(self.id))
}
pub fn exec_time(&self) -> Result<u64, Error> {
let mut out = 0_u64;
call!(sys::hv_vcpu_get_exec_time(self.id, &mut out))?;
Ok(out)
}
#[inline]
pub fn id(&self) -> Id {
self.id
}
}
impl Drop for Vcpu {
fn drop(&mut self) {
call!(sys::hv_vcpu_destroy(self.id)).unwrap()
}
}