diff --git a/kernel/src/arch/x86_64/driver/hpet.rs b/kernel/src/arch/x86_64/driver/hpet.rs index f19f50fa..36202dbf 100644 --- a/kernel/src/arch/x86_64/driver/hpet.rs +++ b/kernel/src/arch/x86_64/driver/hpet.rs @@ -19,7 +19,6 @@ use crate::{ irqdata::IrqHandlerData, irqdesc::{IrqHandleFlags, IrqHandler, IrqReturn}, manage::irq_manager, - softirq::{softirq_vectors, SoftirqNumber}, InterruptArch, IrqNumber, }, kdebug, kerror, kinfo, @@ -33,7 +32,7 @@ use crate::{ }, time::{ jiffies::NSEC_PER_JIFFY, - timer::{clock, timer_get_first_expire, update_timer_jiffies}, + timer::{try_raise_timer_softirq, update_timer_jiffies}, }, }; @@ -252,11 +251,7 @@ impl Hpet { assert!(!CurrentIrqArch::is_irq_enabled()); update_timer_jiffies(1, Self::HPET0_INTERVAL_USEC as i64); - if let Ok(first_expire) = timer_get_first_expire() { - if first_expire <= clock() { - softirq_vectors().raise_softirq(SoftirqNumber::TIMER); - } - } + try_raise_timer_softirq(); } } } diff --git a/kernel/src/driver/clocksource/timer_riscv.rs b/kernel/src/driver/clocksource/timer_riscv.rs index 9d522146..3975296c 100644 --- a/kernel/src/driver/clocksource/timer_riscv.rs +++ b/kernel/src/driver/clocksource/timer_riscv.rs @@ -1,4 +1,4 @@ -use core::sync::atomic::{fence, Ordering}; +use core::sync::atomic::{compiler_fence, fence, Ordering}; use alloc::{string::ToString, sync::Arc}; use bitmap::{traits::BitMapOps, StaticBitmap}; @@ -19,7 +19,12 @@ use crate::{ mm::percpu::PerCpu, process::ProcessManager, smp::core::smp_get_processor_id, - time::{clocksource::HZ, TimeArch}, + time::{ + clocksource::HZ, + jiffies::NSEC_PER_JIFFY, + timer::{try_raise_timer_softirq, update_timer_jiffies}, + TimeArch, + }, }; pub struct RiscVSbiTimer; @@ -29,6 +34,13 @@ static SBI_TIMER_INIT_BMP: SpinLock Result { return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); } +/// 检查是否需要触发定时器软中断,如果需要则触发 +pub fn try_raise_timer_softirq() { + if let Ok(first_expire) = timer_get_first_expire() { + if first_expire <= clock() { + softirq_vectors().raise_softirq(SoftirqNumber::TIMER); + } + } +} + /// 更新系统时间片 pub fn update_timer_jiffies(add_jiffies: u64, time_us: i64) -> u64 { let prev = TIMER_JIFFIES.fetch_add(add_jiffies, Ordering::SeqCst);