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;