rustubs/machine/
time.rs

1//! system level timer
2
3use core::sync::atomic::{AtomicU64, Ordering};
4// using PIT: this is not really accurate
5// 64 bit nanosecond timer takes hundreds of years to wrap around.
6pub static HW_NS: AtomicU64 = AtomicU64::new(0);
7// TODO remove hardcode
8pub static HW_INCREMENT: u64 = 19999708;
9
10// call this in the timer interrupt prologue
11pub fn tick() -> u64 { HW_NS.fetch_add(HW_INCREMENT, Ordering::Relaxed) }
12
13pub fn sec() -> u64 {
14	let ns = HW_NS.load(Ordering::Relaxed);
15	ns / 1_000_000_000
16}
17
18pub fn msec() -> u64 {
19	let ns = HW_NS.load(Ordering::Relaxed);
20	ns / 1_000_000
21}
22
23pub fn nsec() -> u64 { HW_NS.load(Ordering::Relaxed) }