1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:27:44 +00:00

Kernel: Correctly calculate delta_ticks when 64-bit counter wraps around

We never caught this bug in the HPET, since it takes ages for a 64-bit
counter to wrap around. Also remove an unnecessary if check.
This commit is contained in:
Timon Kruiper 2022-10-17 19:04:41 +02:00 committed by Gunnar Beutner
parent 6680241773
commit de0bb99893

View file

@ -262,18 +262,18 @@ u64 HPET::update_time(u64& seconds_since_boot, u32& ticks_this_second, bool quer
delta_ticks += current_value - m_main_counter_last_read;
} else {
// the counter wrapped around
delta_ticks += m_main_counter_last_read - current_value;
if (!m_main_counter_64bits)
if (m_main_counter_64bits) {
delta_ticks += (NumericLimits<u64>::max() - m_main_counter_last_read + 1) + current_value;
} else {
delta_ticks += (NumericLimits<u32>::max() - m_main_counter_last_read + 1) + current_value;
m_32bit_main_counter_wraps++;
}
}
u64 ticks_since_last_second = (u64)ticks_this_second + delta_ticks;
auto ticks_per_second = frequency();
if (ticks_since_last_second >= ticks_per_second) {
seconds_since_boot += ticks_since_last_second / ticks_per_second;
ticks_this_second = ticks_since_last_second % ticks_per_second;
} else {
ticks_this_second = ticks_since_last_second;
}
seconds_since_boot += ticks_since_last_second / ticks_per_second;
ticks_this_second = ticks_since_last_second % ticks_per_second;
if (!query_only) {
m_main_counter_drift = 0;