#![cfg(target_arch = "aarch64")]
use crate::arch::TscFrequency;
use crate::time::Instant;
use core::arch::asm;
#[inline(always)]
pub fn tick_frequency() -> TscFrequency {
let frequency: u64;
unsafe {
asm!(
"mrs {}, cntfrq_el0",
out(reg) frequency,
options(nomem, nostack, preserves_flags, pure),
);
}
TscFrequency::CpuMetadata(frequency)
}
pub fn is_hw_supported() -> bool {
cfg!(not(target_os = "ios"))
}
#[inline(always)]
pub fn clock_fence() {
unsafe {
asm!("isb", options(nostack, preserves_flags));
}
}
#[inline(always)]
pub fn ticks() -> u64 {
let ticks: u64;
unsafe {
asm!(
"mrs {}, cntvct_el0",
out(reg) ticks,
options(nostack, preserves_flags),
);
}
ticks
}
#[inline(always)]
pub fn now() -> Instant {
Instant::Ticks(ticks())
}