mirror of
https://github.com/edera-dev/sprout.git
synced 2026-11-04 18:42:21 +00:00
fix(timer): don't panic when the timer frequency is zero
PlatformTimer::start panicked if the timer frequency was zero. On aarch64 the frequency comes from CNTFRQ_EL0, which some firmware leaves unprogrammed, and on x86_64 a Stall that returns immediately measures zero. The timer is only used for bootloader interface timestamps, so log a warning and report zero durations instead.
This commit is contained in:
1 parent
afbba2c6d3
commit
69fd8a0064
1 file changed
+8
-2
@@ -2,6 +2,7 @@
|
|||||||
// Architecturally modified to support UEFI and remove x86 (32-bit) support.
|
// Architecturally modified to support UEFI and remove x86 (32-bit) support.
|
||||||
|
|
||||||
use core::time::Duration;
|
use core::time::Duration;
|
||||||
|
use log::warn;
|
||||||
|
|
||||||
/// Support for aarch64 timers.
|
/// Support for aarch64 timers.
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
@@ -35,7 +36,11 @@ impl TickFrequency {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Produce a duration from the provided elapsed `ticks` value.
|
/// Produce a duration from the provided elapsed `ticks` value.
|
||||||
|
/// If the frequency is unknown, the duration is zero.
|
||||||
fn duration(&self, ticks: u64) -> Duration {
|
fn duration(&self, ticks: u64) -> Duration {
|
||||||
|
if self.ticks() == 0 {
|
||||||
|
return Duration::ZERO;
|
||||||
|
}
|
||||||
let accuracy = self.nanos();
|
let accuracy = self.nanos();
|
||||||
let nanos = ticks as f64 * accuracy;
|
let nanos = ticks as f64 * accuracy;
|
||||||
Duration::from_nanos(nanos as u64)
|
Duration::from_nanos(nanos as u64)
|
||||||
@@ -56,9 +61,10 @@ fn arch_frequency() -> TickFrequency {
|
|||||||
let frequency = aarch64::frequency();
|
let frequency = aarch64::frequency();
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
let frequency = x86_64::frequency();
|
let frequency = x86_64::frequency();
|
||||||
// If the frequency is 0, then something went very wrong and we should panic.
|
// Some firmware does not program the timer frequency. The timer is only used to report
|
||||||
|
// timestamps to the bootloader interface, so this should not prevent booting.
|
||||||
if frequency.ticks() == 0 {
|
if frequency.ticks() == 0 {
|
||||||
panic!("timer frequency is zero");
|
warn!("timer frequency is zero, timestamps will not be reported");
|
||||||
}
|
}
|
||||||
frequency
|
frequency
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user