From fe2bd8e3ddcc833c39f0a7a8b52b6c2345a691a8 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 23 Sep 2022 11:41:59 +0300 Subject: [PATCH] Kernel: Move x86-specific timer code handling to Arch/x86/Time directory The APICTimer, HPET and RTC (the RTC timer is in the context of the PC RTC here) are timers that exist only in x86 platforms, therefore, we move the handling code and the initialization code to the Arch/x86/Time directory. Other related code patterns in the TimeManagement singleton and in the Random.cpp file are guarded with #ifdef to ensure they are only compiled for x86 builds. --- Kernel/{ => Arch/x86}/Time/APICTimer.cpp | 2 +- Kernel/{ => Arch/x86}/Time/APICTimer.h | 1 + Kernel/{ => Arch/x86}/Time/HPET.cpp | 4 +-- Kernel/{ => Arch/x86}/Time/HPET.h | 0 Kernel/{ => Arch/x86}/Time/HPETComparator.cpp | 2 +- Kernel/{ => Arch/x86}/Time/HPETComparator.h | 2 +- Kernel/{ => Arch/x86}/Time/PIT.cpp | 2 +- Kernel/{ => Arch/x86}/Time/PIT.h | 0 Kernel/{ => Arch/x86}/Time/RTC.cpp | 2 +- Kernel/{ => Arch/x86}/Time/RTC.h | 0 Kernel/Arch/x86/common/Interrupts/APIC.cpp | 2 +- Kernel/Arch/x86/common/PCSpeaker.cpp | 2 +- Kernel/CMakeLists.txt | 11 +++--- Kernel/Random.cpp | 11 ++++-- Kernel/Time/TimeManagement.cpp | 36 +++++++++++-------- Kernel/Time/TimeManagement.h | 7 ++-- 16 files changed, 51 insertions(+), 33 deletions(-) rename Kernel/{ => Arch/x86}/Time/APICTimer.cpp (99%) rename Kernel/{ => Arch/x86}/Time/APICTimer.h (96%) rename Kernel/{ => Arch/x86}/Time/HPET.cpp (99%) rename Kernel/{ => Arch/x86}/Time/HPET.h (100%) rename Kernel/{ => Arch/x86}/Time/HPETComparator.cpp (98%) rename Kernel/{ => Arch/x86}/Time/HPETComparator.h (98%) rename Kernel/{ => Arch/x86}/Time/PIT.cpp (98%) rename Kernel/{ => Arch/x86}/Time/PIT.h (100%) rename Kernel/{ => Arch/x86}/Time/RTC.cpp (98%) rename Kernel/{ => Arch/x86}/Time/RTC.h (100%) diff --git a/Kernel/Time/APICTimer.cpp b/Kernel/Arch/x86/Time/APICTimer.cpp similarity index 99% rename from Kernel/Time/APICTimer.cpp rename to Kernel/Arch/x86/Time/APICTimer.cpp index 30a4652280..25381238c0 100644 --- a/Kernel/Time/APICTimer.cpp +++ b/Kernel/Arch/x86/Time/APICTimer.cpp @@ -4,10 +4,10 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include -#include #include namespace Kernel { diff --git a/Kernel/Time/APICTimer.h b/Kernel/Arch/x86/Time/APICTimer.h similarity index 96% rename from Kernel/Time/APICTimer.h rename to Kernel/Arch/x86/Time/APICTimer.h index 88d51c6e90..4474875538 100644 --- a/Kernel/Time/APICTimer.h +++ b/Kernel/Arch/x86/Time/APICTimer.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include diff --git a/Kernel/Time/HPET.cpp b/Kernel/Arch/x86/Time/HPET.cpp similarity index 99% rename from Kernel/Time/HPET.cpp rename to Kernel/Arch/x86/Time/HPET.cpp index 4e363c7c97..725d767bd5 100644 --- a/Kernel/Time/HPET.cpp +++ b/Kernel/Arch/x86/Time/HPET.cpp @@ -5,13 +5,13 @@ */ #include +#include +#include #include #include #include #include #include -#include -#include #include namespace Kernel { diff --git a/Kernel/Time/HPET.h b/Kernel/Arch/x86/Time/HPET.h similarity index 100% rename from Kernel/Time/HPET.h rename to Kernel/Arch/x86/Time/HPET.h diff --git a/Kernel/Time/HPETComparator.cpp b/Kernel/Arch/x86/Time/HPETComparator.cpp similarity index 98% rename from Kernel/Time/HPETComparator.cpp rename to Kernel/Arch/x86/Time/HPETComparator.cpp index 6d4a3aea73..007d99a4e8 100644 --- a/Kernel/Time/HPETComparator.cpp +++ b/Kernel/Arch/x86/Time/HPETComparator.cpp @@ -5,10 +5,10 @@ */ #include +#include #include #include #include -#include #include namespace Kernel { diff --git a/Kernel/Time/HPETComparator.h b/Kernel/Arch/x86/Time/HPETComparator.h similarity index 98% rename from Kernel/Time/HPETComparator.h rename to Kernel/Arch/x86/Time/HPETComparator.h index 2bbbfcb709..cfcb70581f 100644 --- a/Kernel/Time/HPETComparator.h +++ b/Kernel/Arch/x86/Time/HPETComparator.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include namespace Kernel { diff --git a/Kernel/Time/PIT.cpp b/Kernel/Arch/x86/Time/PIT.cpp similarity index 98% rename from Kernel/Time/PIT.cpp rename to Kernel/Arch/x86/Time/PIT.cpp index d2796fb8f6..7a2708d0f1 100644 --- a/Kernel/Time/PIT.cpp +++ b/Kernel/Arch/x86/Time/PIT.cpp @@ -6,11 +6,11 @@ #include #include +#include #include #include #include #include -#include #include #define IRQ_TIMER 0 diff --git a/Kernel/Time/PIT.h b/Kernel/Arch/x86/Time/PIT.h similarity index 100% rename from Kernel/Time/PIT.h rename to Kernel/Arch/x86/Time/PIT.h diff --git a/Kernel/Time/RTC.cpp b/Kernel/Arch/x86/Time/RTC.cpp similarity index 98% rename from Kernel/Time/RTC.cpp rename to Kernel/Arch/x86/Time/RTC.cpp index f0dd9cef14..d3c524adf1 100644 --- a/Kernel/Time/RTC.cpp +++ b/Kernel/Arch/x86/Time/RTC.cpp @@ -7,8 +7,8 @@ #include #include #include +#include #include -#include #include namespace Kernel { diff --git a/Kernel/Time/RTC.h b/Kernel/Arch/x86/Time/RTC.h similarity index 100% rename from Kernel/Time/RTC.h rename to Kernel/Arch/x86/Time/RTC.h diff --git a/Kernel/Arch/x86/common/Interrupts/APIC.cpp b/Kernel/Arch/x86/common/Interrupts/APIC.cpp index fc873aa470..492137ec3c 100644 --- a/Kernel/Arch/x86/common/Interrupts/APIC.cpp +++ b/Kernel/Arch/x86/common/Interrupts/APIC.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -23,7 +24,6 @@ #include #include #include -#include #define IRQ_APIC_TIMER (0xfc - IRQ_VECTOR_BASE) #define IRQ_APIC_IPI (0xfd - IRQ_VECTOR_BASE) diff --git a/Kernel/Arch/x86/common/PCSpeaker.cpp b/Kernel/Arch/x86/common/PCSpeaker.cpp index ac2fdfd364..7c4bac5ebb 100644 --- a/Kernel/Arch/x86/common/PCSpeaker.cpp +++ b/Kernel/Arch/x86/common/PCSpeaker.cpp @@ -5,8 +5,8 @@ */ #include +#include #include -#include void PCSpeaker::tone_on(int frequency) { diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 6960f979b2..73661b8f9d 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -298,11 +298,6 @@ set(KERNEL_SOURCES Thread.cpp ThreadBlockers.cpp ThreadTracer.cpp - Time/APICTimer.cpp - Time/HPET.cpp - Time/HPETComparator.cpp - Time/PIT.cpp - Time/RTC.cpp Time/TimeManagement.cpp TimerQueue.cpp UBSanitizer.cpp @@ -345,6 +340,12 @@ if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64") Arch/x86/PCI/IDELegacyModeController.cpp Arch/x86/PCI/Initializer.cpp + Arch/x86/Time/APICTimer.cpp + Arch/x86/Time/HPET.cpp + Arch/x86/Time/HPETComparator.cpp + Arch/x86/Time/PIT.cpp + Arch/x86/Time/RTC.cpp + Arch/x86/VGA/IOArbiter.cpp ) diff --git a/Kernel/Random.cpp b/Kernel/Random.cpp index 6d87ddfa8f..dd6dc742ea 100644 --- a/Kernel/Random.cpp +++ b/Kernel/Random.cpp @@ -7,11 +7,13 @@ #include #include +#if ARCH(I386) || ARCH(X86_64) +# include +# include +#endif #include #include #include -#include -#include #include namespace Kernel { @@ -48,7 +50,9 @@ UNMAP_AFTER_INIT KernelRng::KernelRng() add_random_event(value, i % 32); } - } else if (TimeManagement::the().can_query_precise_time()) { + } +#if ARCH(I386) || ARCH(X86_64) + else if (TimeManagement::the().can_query_precise_time()) { // Add HPET as entropy source if we don't have anything better. dmesgln("KernelRng: Using HPET as entropy source"); @@ -66,6 +70,7 @@ UNMAP_AFTER_INIT KernelRng::KernelRng() current_time += 0x40b2u; } } +#endif } void KernelRng::wait_for_entropy() diff --git a/Kernel/Time/TimeManagement.cpp b/Kernel/Time/TimeManagement.cpp index 66a336f546..4bf25c7e20 100644 --- a/Kernel/Time/TimeManagement.cpp +++ b/Kernel/Time/TimeManagement.cpp @@ -7,20 +7,22 @@ #include #include #include -#include -#include -#include +#if ARCH(I386) || ARCH(X86_64) +# include +# include +# include +# include +# include +# include +# include +# include +#endif #include #include #include #include #include -#include -#include -#include #include -#include -#include #include #include @@ -137,8 +139,9 @@ u64 TimeManagement::uptime_ms() const return ms; } -UNMAP_AFTER_INIT void TimeManagement::initialize(u32 cpu) +UNMAP_AFTER_INIT void TimeManagement::initialize([[maybe_unused]] u32 cpu) { +#if ARCH(I386) || ARCH(X86_64) if (cpu == 0) { VERIFY(!s_the.is_initialized()); s_the.ensure_instance(); @@ -160,6 +163,7 @@ UNMAP_AFTER_INIT void TimeManagement::initialize(u32 cpu) apic_timer->enable_local_timer(); } } +#endif } void TimeManagement::set_system_timer(HardwareTimerBase& timer) @@ -184,6 +188,7 @@ time_t TimeManagement::boot_time() UNMAP_AFTER_INIT TimeManagement::TimeManagement() : m_time_page_region(MM.allocate_kernel_region(PAGE_SIZE, "Time page"sv, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow).release_value_but_fixme_should_propagate_errors()) { +#if ARCH(I386) || ARCH(X86_64) bool probe_non_legacy_hardware_timers = !(kernel_command_line().is_legacy_time_enabled()); if (ACPI::is_enabled()) { if (!ACPI::Parser::the()->x86_specific_flags().cmos_rtc_not_present) { @@ -198,12 +203,13 @@ UNMAP_AFTER_INIT TimeManagement::TimeManagement() m_epoch_time.tv_sec += boot_time(); } if (probe_non_legacy_hardware_timers) { - if (!probe_and_set_non_legacy_hardware_timers()) - if (!probe_and_set_legacy_hardware_timers()) + if (!probe_and_set_x86_non_legacy_hardware_timers()) + if (!probe_and_set_x86_legacy_hardware_timers()) VERIFY_NOT_REACHED(); - } else if (!probe_and_set_legacy_hardware_timers()) { + } else if (!probe_and_set_x86_legacy_hardware_timers()) { VERIFY_NOT_REACHED(); } +#endif } Time TimeManagement::now() @@ -249,7 +255,8 @@ bool TimeManagement::is_hpet_periodic_mode_allowed() } } -UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_non_legacy_hardware_timers() +#if ARCH(I386) || ARCH(X86_64) +UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_x86_non_legacy_hardware_timers() { if (!ACPI::is_enabled()) return false; @@ -323,7 +330,7 @@ UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_non_legacy_hardware_timers() return true; } -UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_legacy_hardware_timers() +UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_x86_legacy_hardware_timers() { if (ACPI::is_enabled()) { if (ACPI::Parser::the()->x86_specific_flags().cmos_rtc_not_present) { @@ -343,6 +350,7 @@ UNMAP_AFTER_INIT bool TimeManagement::probe_and_set_legacy_hardware_timers() m_time_ticks_per_second = m_time_keeper_timer->ticks_per_second(); return true; } +#endif void TimeManagement::update_time(RegisterState const&) { diff --git a/Kernel/Time/TimeManagement.h b/Kernel/Time/TimeManagement.h index 967c4eec88..d2973f6f86 100644 --- a/Kernel/Time/TimeManagement.h +++ b/Kernel/Time/TimeManagement.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -79,8 +80,10 @@ private: TimePage& time_page(); void update_time_page(); - bool probe_and_set_legacy_hardware_timers(); - bool probe_and_set_non_legacy_hardware_timers(); +#if ARCH(I386) || ARCH(X86_64) + bool probe_and_set_x86_legacy_hardware_timers(); + bool probe_and_set_x86_non_legacy_hardware_timers(); +#endif Vector scan_and_initialize_periodic_timers(); Vector scan_for_non_periodic_timers(); NonnullLockRefPtrVector m_hardware_timers;