1use crate::{sched, sync::spinlock::SpinLocked};
2use hal::Schedable;
3
4static TIME: SpinLocked<u64> = SpinLocked::new(0);
6
7fn tick() {
8 {
10 let mut time = TIME.lock();
11 *time += 1;
12 }
13}
14
15pub fn time() -> u64 {
20 if !hal::asm::are_interrupts_enabled() {
21 return *TIME.lock();
23 } else {
24 let time;
25 hal::asm::disable_interrupts();
27 {
29 time = *TIME.lock();
30 }
31 hal::asm::enable_interrupts();
32 time
34 }
35}
36
37#[unsafe(no_mangle)]
40pub extern "C" fn systick_hndlr() {
41 tick();
42
43 let resched = { sched::tick_scheduler() };
44
45 if resched {
46 hal::Machine::trigger_reschedule();
47 }
48}