From de0bb998934c7b7a56b9de12e186d9824b6b1ea3 Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Mon, 17 Oct 2022 19:04:41 +0200 Subject: [PATCH] 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. --- Kernel/Arch/x86/Time/HPET.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Kernel/Arch/x86/Time/HPET.cpp b/Kernel/Arch/x86/Time/HPET.cpp index 725d767bd5..fc470a7a84 100644 --- a/Kernel/Arch/x86/Time/HPET.cpp +++ b/Kernel/Arch/x86/Time/HPET.cpp @@ -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::max() - m_main_counter_last_read + 1) + current_value; + } else { + delta_ticks += (NumericLimits::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;