From 114782470954410905e6e62ee89f58bf8203ba67 Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Sun, 16 Oct 2022 01:21:33 +0300 Subject: [PATCH] [Kernel] Implement SetThreadPriority --- include/kernel/kernel.hpp | 1 + src/core/kernel/kernel.cpp | 1 + src/core/kernel/threads.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index 402c25f3..8e16b4fb 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -98,6 +98,7 @@ class Kernel { void getThreadPriority(); void releaseMutex(); void sendSyncRequest(); + void setThreadPriority(); void signalEvent(); void svcCloseHandle(); void svcSleepThread(); diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index e287c444..9552199d 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -25,6 +25,7 @@ void Kernel::serviceSVC(u32 svc) { case 0x08: createThread(); break; case 0x0A: svcSleepThread(); break; case 0x0B: getThreadPriority(); break; + case 0x0C: setThreadPriority(); break; case 0x13: createMutex(); break; case 0x14: releaseMutex(); break; case 0x17: createEvent(); break; diff --git a/src/core/kernel/threads.cpp b/src/core/kernel/threads.cpp index 6158ff21..94443af1 100644 --- a/src/core/kernel/threads.cpp +++ b/src/core/kernel/threads.cpp @@ -231,6 +231,33 @@ void Kernel::getThreadPriority() { } } +void Kernel::setThreadPriority() { + const Handle handle = regs[0]; + const u32 priority = regs[1]; + log("SetThreadPriority (handle = %X, priority = %X)\n", handle, priority); + + if (priority > 0x3F) { + regs[0] = SVCResult::BadThreadPriority; + return; + } + + if (handle == KernelHandles::CurrentThread) { + regs[0] = SVCResult::Success; + threads[currentThreadIndex].priority = priority; + } else { + auto object = getObject(handle, KernelObjectType::Thread); + if (object == nullptr) [[unlikely]] { + regs[0] = SVCResult::BadHandle; + return; + } else { + regs[0] = SVCResult::Success; + object->getData()->priority = priority; + } + } + + rescheduleThreads(); +} + void Kernel::createMutex() { bool locked = regs[1] != 0; Helpers::panic("CreateMutex (initially locked: %s)\n", locked ? "yes" : "no");