From fa58c7a7d6e3323d093065a1be5a373e7708f96a Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 13 Aug 2023 23:32:07 +0300 Subject: [PATCH] OS Timers part 2 --- include/kernel/kernel_types.hpp | 11 +++++++++++ src/core/kernel/kernel.cpp | 1 + src/core/kernel/threads.cpp | 3 +++ src/core/kernel/timers.cpp | 19 ++++++++++++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/kernel/kernel_types.hpp b/include/kernel/kernel_types.hpp index 56bed359..abefbcd9 100644 --- a/include/kernel/kernel_types.hpp +++ b/include/kernel/kernel_types.hpp @@ -163,6 +163,17 @@ struct Semaphore { Semaphore(s32 initialCount, s32 maximumCount) : availableCount(initialCount), maximumCount(maximumCount), waitlist(0) {} }; +struct Timer { + u64 waitlist; // Refer to the getWaitlist function below for documentation + ResetType resetType = ResetType::OneShot; + + u64 initialDelay; // Number of ns until the timer fires for the first time + u64 interval; // Number of ns until the timer fires for the second and future times + bool fired; // Has this Timer been signalled? + + Timer(ResetType type) : resetType(type), initialDelay(0), interval(0), waitlist(0), fired(false) {} +}; + struct MemoryBlock { u32 addr = 0; u32 size = 0; diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index 900ad559..a80f4c7b 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -122,6 +122,7 @@ void Kernel::deleteObjectData(KernelObject& object) { case KernelObjectType::Session: delete object.getData(); return; case KernelObjectType::Mutex: delete object.getData(); return; case KernelObjectType::Semaphore: delete object.getData(); return; + case KernelObjectType::Timer: delete object.getData(); return; case KernelObjectType::Thread: return; case KernelObjectType::Dummy: return; default: [[unlikely]] Helpers::warn("unknown object type"); return; diff --git a/src/core/kernel/threads.cpp b/src/core/kernel/threads.cpp index 440045d3..08fc697d 100644 --- a/src/core/kernel/threads.cpp +++ b/src/core/kernel/threads.cpp @@ -612,6 +612,9 @@ bool Kernel::shouldWaitOnObject(KernelObject* object) { case KernelObjectType::Thread: // Waiting on a thread waits until it's dead. If it's dead then no need to wait return object->getData()->status != ThreadStatus::Dead; + case KernelObjectType::Timer: // We should wait on a timer only if it has not been signalled + return !object->getData()->fired; + case KernelObjectType::Semaphore: // Wait if the semaphore count <= 0 return object->getData()->availableCount <= 0; diff --git a/src/core/kernel/timers.cpp b/src/core/kernel/timers.cpp index f4a89407..6750bcc1 100644 --- a/src/core/kernel/timers.cpp +++ b/src/core/kernel/timers.cpp @@ -1,6 +1,23 @@ #include "kernel.hpp" -void Kernel::svcCreateTimer() { Helpers::panic("Kernel::CreateTimer"); } +Handle Kernel::makeTimer(ResetType type) { + Handle ret = makeObject(KernelObjectType::Timer); + objects[ret].data = new Timer(type); + + return ret; +} + +void Kernel::svcCreateTimer() { + const u32 resetType = regs[1]; + if (resetType > 2) { + Helpers::panic("Invalid reset type for event %d", resetType); + } + + logSVC("CreateTimer (resetType = %s)\n", resetTypeToString(resetType)); + regs[0] = Result::Success; + regs[1] = makeTimer(static_cast(resetType)); +} + void Kernel::svcSetTimer() { Helpers::panic("Kernel::SetTimer"); } void Kernel::svcClearTimer() { Helpers::panic("Kernel::ClearTimer"); } void Kernel::svcCancelTimer() { Helpers::panic("Kernel::CancelTimer"); } \ No newline at end of file