Support for bolts::cpu::read_time_counter on arm64 (#790)
This commit is contained in:
parent
be0ae3a55e
commit
279bb77f30
@ -1,6 +1,9 @@
|
|||||||
//! Architecture agnostic processor features
|
//! Architecture agnostic processor features
|
||||||
|
|
||||||
#[cfg(not(any(target_arch = "x86_64", target_arch = "x86")))]
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
use core::arch::asm;
|
||||||
|
|
||||||
|
#[cfg(not(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64")))]
|
||||||
use crate::bolts::current_nanos;
|
use crate::bolts::current_nanos;
|
||||||
|
|
||||||
// TODO: Add more architectures, using C code, see
|
// TODO: Add more architectures, using C code, see
|
||||||
@ -26,13 +29,28 @@ pub fn read_time_counter() -> u64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Read a timestamp for measurements
|
||||||
|
///
|
||||||
|
/// Fetches the counter-virtual count register
|
||||||
|
/// as we do not need to remove the cntvct_el2 offset.
|
||||||
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
#[must_use]
|
||||||
|
pub fn read_time_counter() -> u64 {
|
||||||
|
let v: u64 = 0;
|
||||||
|
unsafe {
|
||||||
|
// TODO pushing a change in core::arch::aarch64 ?
|
||||||
|
asm!("mrs {v}, cntvct_el0", v = out(reg) _);
|
||||||
|
}
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
/// Read a timestamp for measurements.
|
/// Read a timestamp for measurements.
|
||||||
///
|
///
|
||||||
/// This function is a wrapper around different ways to get a timestamp, fast.
|
/// This function is a wrapper around different ways to get a timestamp, fast.
|
||||||
/// In this way, an experiment only has to
|
/// In this way, an experiment only has to
|
||||||
/// change this implementation rather than every instead of [`read_time_counter`]
|
/// change this implementation rather than every instead of [`read_time_counter`]
|
||||||
/// On unsupported architectures, it's falling back to normal system time, in millis.
|
/// On unsupported architectures, it's falling back to normal system time, in millis.
|
||||||
#[cfg(not(any(target_arch = "x86_64", target_arch = "x86")))]
|
#[cfg(not(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64")))]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn read_time_counter() -> u64 {
|
pub fn read_time_counter() -> u64 {
|
||||||
current_nanos()
|
current_nanos()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user