diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index f16a5cce..402c25f3 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -95,6 +95,7 @@ class Kernel { void getResourceLimitCurrentValues(); void getSystemTick(); void getThreadID(); + void getThreadPriority(); void releaseMutex(); void sendSyncRequest(); void signalEvent(); diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index 6cfc9ccd..e287c444 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -24,6 +24,7 @@ void Kernel::serviceSVC(u32 svc) { case 0x02: queryMemory(); break; case 0x08: createThread(); break; case 0x0A: svcSleepThread(); break; + case 0x0B: getThreadPriority(); 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 fa10a2ea..6158ff21 100644 --- a/src/core/kernel/threads.cpp +++ b/src/core/kernel/threads.cpp @@ -213,6 +213,24 @@ void Kernel::getThreadID() { regs[1] = thread->getData()->index; } +void Kernel::getThreadPriority() { + const Handle handle = regs[1]; + log("GetThreadPriority (handle = %X)\n", handle); + + if (handle == KernelHandles::CurrentThread) { + regs[0] = SVCResult::Success; + regs[1] = threads[currentThreadIndex].priority; + } else { + auto object = getObject(handle, KernelObjectType::Thread); + if (object == nullptr) [[unlikely]] { + regs[0] = SVCResult::BadHandle; + } else { + regs[0] = SVCResult::Success; + regs[1] = object->getData()->priority; + } + } +} + void Kernel::createMutex() { bool locked = regs[1] != 0; Helpers::panic("CreateMutex (initially locked: %s)\n", locked ? "yes" : "no");