From d3a2591d19867e601fadaa67b04aad36f219ccfd Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Tue, 20 Sep 2022 19:02:52 +0300 Subject: [PATCH] [Kernel] Implement ClearEvent, stub WaitSynchronization1 --- include/kernel/kernel.hpp | 2 ++ include/kernel/kernel_types.hpp | 1 + src/core/kernel/events.cpp | 31 +++++++++++++++++++++++++++++++ src/core/kernel/kernel.cpp | 2 ++ src/core/kernel/threads.cpp | 2 +- 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index 74f078d2..502d812b 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -82,6 +82,7 @@ class Kernel { // SVC implementations void arbitrateAddress(); + void clearEvent(); void createAddressArbiter(); void createEvent(); void createThread(); @@ -95,6 +96,7 @@ class Kernel { void svcCloseHandle(); void connectToPort(); void outputDebugString(); + void waitSynchronization1(); public: Kernel(CPU& cpu, Memory& mem); diff --git a/include/kernel/kernel_types.hpp b/include/kernel/kernel_types.hpp index fcc96367..b772bed9 100644 --- a/include/kernel/kernel_types.hpp +++ b/include/kernel/kernel_types.hpp @@ -65,6 +65,7 @@ struct Process { struct Event { ResetType resetType = ResetType::OneShot; + bool fired = false; Event(ResetType resetType) : resetType(resetType) {} }; diff --git a/src/core/kernel/events.cpp b/src/core/kernel/events.cpp index 188edd81..0762cde2 100644 --- a/src/core/kernel/events.cpp +++ b/src/core/kernel/events.cpp @@ -27,4 +27,35 @@ void Kernel::createEvent() { regs[0] = SVCResult::Success; regs[1] = makeEvent(static_cast(resetType)); +} + +// Result ClearEvent(Handle event) +void Kernel::clearEvent() { + const Handle handle = regs[0]; + const auto event = getObject(handle, KernelObjectType::Event); + printf("ClearEvent(event handle = %d)\n", event); + + if (event == nullptr) [[unlikely]] { + regs[0] = SVCResult::BadHandle; + return; + } + + event->getData()->fired = false; + regs[0] = SVCResult::Success; +} + +// Result WaitSynchronization1(Handle handle, s64 timeout_nanoseconds) +void Kernel::waitSynchronization1() { + const Handle handle = regs[0]; + const s64 ns = s64(u64(regs[1]) | (u64(regs[2]) << 32)); + const auto event = getObject(handle, KernelObjectType::Event); + + if (event == nullptr) [[unlikely]] { + Helpers::panic("WaitSynchronization1: Bad event handle"); + regs[0] = SVCResult::BadHandle; + return; + } + + printf("WaitSynchronization1(handle = %X, ns = %lld) (STUBBED)\n", handle, ns); + regs[0] = SVCResult::Success; } \ No newline at end of file diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index cfda939e..fc511af9 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -20,10 +20,12 @@ void Kernel::serviceSVC(u32 svc) { case 0x02: queryMemory(); break; case 0x08: createThread(); break; case 0x17: createEvent(); break; + case 0x19: clearEvent(); break; case 0x1F: mapMemoryBlock(); break; case 0x21: createAddressArbiter(); break; case 0x22: arbitrateAddress(); break; case 0x23: svcCloseHandle(); break; + case 0x24: waitSynchronization1(); break; case 0x2D: connectToPort(); break; case 0x32: sendSyncRequest(); break; case 0x38: getResourceLimit(); break; diff --git a/src/core/kernel/threads.cpp b/src/core/kernel/threads.cpp index 56e60170..837898b0 100644 --- a/src/core/kernel/threads.cpp +++ b/src/core/kernel/threads.cpp @@ -92,5 +92,5 @@ void Kernel::sleepThreadOnArbiter(u32 waitingAddress) { t.status = ThreadStatus::WaitArbiter; t.waitingAddress = waitingAddress; - switchThread(1); + switchThread(1); // TODO: Properly change threads } \ No newline at end of file