From a65176bc5741e2a9788cca4415ade756f93f6580 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 5 May 2024 15:38:41 +0800 Subject: [PATCH] feat: record time ticks --- kernel/src/arch/riscv/timer.rs | 4 ++-- kernel/src/arch/riscv/trap.rs | 4 +++- kernel/src/plat/timer.rs | 13 +++++++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/kernel/src/arch/riscv/timer.rs b/kernel/src/arch/riscv/timer.rs index c304ac3..77e9c75 100644 --- a/kernel/src/arch/riscv/timer.rs +++ b/kernel/src/arch/riscv/timer.rs @@ -13,7 +13,7 @@ impl TimerOps for Timer { // enable timer interrupt and set next tick unsafe { riscv::register::sie::set_stimer() } - Self::tick(); + Self::set_next(); info!("[Timer] begin to tick"); } @@ -21,7 +21,7 @@ impl TimerOps for Timer { riscv::register::time::read64() } - fn tick() { + fn set_next() { sbi_rt::set_timer(Self::read_cycle() + TIMER_TICKS); } } diff --git a/kernel/src/arch/riscv/trap.rs b/kernel/src/arch/riscv/trap.rs index c080f51..3fd8471 100644 --- a/kernel/src/arch/riscv/trap.rs +++ b/kernel/src/arch/riscv/trap.rs @@ -41,6 +41,8 @@ fn trap_handler(tf: &mut TrapContext, from_kernel: bool) { match scause.cause() { T::Interrupt(I::SupervisorTimer) => { + Timer::do_tick(); + if !from_kernel { SCHEDULER.schedule() } @@ -61,7 +63,7 @@ fn trap_handler(tf: &mut TrapContext, from_kernel: bool) { _ => panic_fatal!("Unhandled Trap"), } - Timer::tick(); + Timer::set_next(); trace!("[Trap] exiting..."); } diff --git a/kernel/src/plat/timer.rs b/kernel/src/plat/timer.rs index b5166bc..91f7f4c 100644 --- a/kernel/src/plat/timer.rs +++ b/kernel/src/plat/timer.rs @@ -1,7 +1,16 @@ -pub struct Timer; +use core::sync::atomic::{AtomicU64, Ordering}; + +#[thread_local] +pub static CURRENT_TICK: AtomicU64 = AtomicU64::new(0); + +pub struct Timer +where Self: TimerOps; pub trait TimerOps { fn init(); fn read_cycle() -> u64; - fn tick(); + fn set_next(); + fn do_tick() { + CURRENT_TICK.fetch_add(1, Ordering::Relaxed); + } }