#[cfg_attr(test, mockall::automock)]
pub trait ReadTsc {
fn read_tsc(&self) -> u64;
}
pub struct ReadTscImpl;
impl ReadTsc for ReadTscImpl {
fn read_tsc(&self) -> u64 {
read_timestamp_counter_begin()
}
}
#[cfg(target_arch = "aarch64")]
#[inline]
pub fn read_timestamp_counter_end() -> u64 {
use std::arch::asm;
let rv: u64;
unsafe {
asm!("isb; mrs {}, cntvct_el0; isb;", out(reg) rv);
}
rv
}
#[cfg(target_arch = "aarch64")]
#[inline]
pub fn read_timestamp_counter_begin() -> u64 {
use std::arch::asm;
let rv: u64;
unsafe {
asm!("isb; mrs {}, cntvct_el0; isb;", out(reg) rv);
}
rv
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn read_timestamp_counter_begin() -> u64 {
use core::arch::x86_64::{_mm_lfence, _rdtsc};
let tsc;
unsafe {
_mm_lfence();
tsc = _rdtsc();
_mm_lfence();
}
tsc
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn read_timestamp_counter_end() -> u64 {
use core::arch::x86_64::{__rdtscp, _mm_lfence};
let mut aux = 0u32;
let tsc;
unsafe {
tsc = __rdtscp(&raw mut aux);
_mm_lfence();
}
tsc
}