summaryrefslogtreecommitdiff
path: root/Kernel/Time
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-10-10 17:36:18 +0300
committerLinus Groh <mail@linusgroh.de>2022-10-14 14:13:51 +0200
commit7520acd4ebd1f3c74b1f19c2cfba63d8a75a0a9c (patch)
treebfc1b68800ae67d6a50fac9a4f020cd8fd01a966 /Kernel/Time
parent3651d9701e2a91b5c13012bdd3fbcf333ae2369a (diff)
downloadserenity-7520acd4ebd1f3c74b1f19c2cfba63d8a75a0a9c.zip
Kernel: Move Scheduler current time method to the TimeManagement code
Diffstat (limited to 'Kernel/Time')
-rw-r--r--Kernel/Time/TimeManagement.cpp22
-rw-r--r--Kernel/Time/TimeManagement.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/Kernel/Time/TimeManagement.cpp b/Kernel/Time/TimeManagement.cpp
index 4bf25c7e20..99318a918e 100644
--- a/Kernel/Time/TimeManagement.cpp
+++ b/Kernel/Time/TimeManagement.cpp
@@ -17,6 +17,7 @@
# include <Kernel/Arch/x86/common/Interrupts/APIC.h>
# include <Kernel/Arch/x86/common/RTC.h>
#endif
+#include <Kernel/Arch/CurrentTime.h>
#include <Kernel/CommandLine.h>
#include <Kernel/Firmware/ACPI/Parser.h>
#include <Kernel/PerformanceManager.h>
@@ -40,6 +41,22 @@ TimeManagement& TimeManagement::the()
return *s_the;
}
+// The s_scheduler_specific_current_time function provides a current time for scheduling purposes,
+// which may not necessarily relate to wall time
+static u64 (*s_scheduler_current_time)();
+
+static u64 current_time_monotonic()
+{
+ // We always need a precise timestamp here, we cannot rely on a coarse timestamp
+ return (u64)TimeManagement::the().monotonic_time(TimePrecision::Precise).to_nanoseconds();
+}
+
+u64 TimeManagement::scheduler_current_time()
+{
+ VERIFY(s_scheduler_current_time);
+ return s_scheduler_current_time();
+}
+
ErrorOr<void> TimeManagement::validate_clock_id(clockid_t clock_id)
{
switch (clock_id) {
@@ -163,6 +180,11 @@ UNMAP_AFTER_INIT void TimeManagement::initialize([[maybe_unused]] u32 cpu)
apic_timer->enable_local_timer();
}
}
+ auto* possible_arch_specific_current_time_function = optional_current_time();
+ if (possible_arch_specific_current_time_function)
+ s_scheduler_current_time = possible_arch_specific_current_time_function;
+ else
+ s_scheduler_current_time = current_time_monotonic;
#endif
}
diff --git a/Kernel/Time/TimeManagement.h b/Kernel/Time/TimeManagement.h
index d2973f6f86..f5e20d0f66 100644
--- a/Kernel/Time/TimeManagement.h
+++ b/Kernel/Time/TimeManagement.h
@@ -37,6 +37,8 @@ public:
static bool is_initialized();
static TimeManagement& the();
+ static u64 scheduler_current_time();
+
static ErrorOr<void> validate_clock_id(clockid_t);
Time current_time(clockid_t) const;
Time monotonic_time(TimePrecision = TimePrecision::Coarse) const;