use core::arch::x86_64::__rdtscp;
use core::arch::x86_64::_rdtsc;
use core::mem::MaybeUninit;
use serde::Deserialize;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Rdtsc {
Tsc,
Tscp,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct RdtscResult {
pub tsc: u64,
pub aux: Option<u32>,
}
impl RdtscResult {
pub fn new(request: Rdtsc) -> RdtscResult {
match request {
Rdtsc::Tsc => RdtscResult {
tsc: unsafe { _rdtsc() },
aux: None,
},
Rdtsc::Tscp => {
let mut aux_val = MaybeUninit::uninit();
let tsc = unsafe { __rdtscp(aux_val.as_mut_ptr()) };
RdtscResult {
tsc,
aux: Some(unsafe { aux_val.assume_init() }),
}
}
}
}
}