From 916dfb56f0d5bd00c6ef0c72c4951258bc5c64e7 Mon Sep 17 00:00:00 2001 From: plutoo Date: Mon, 1 Jan 2018 23:32:44 +0100 Subject: [PATCH] More threading functionality --- nx/include/switch/kernel/thread.h | 3 +++ nx/include/switch/svc.h | 4 +++- nx/source/kernel/svc.s | 5 +++++ nx/source/kernel/thread.c | 8 ++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/nx/include/switch/kernel/thread.h b/nx/include/switch/kernel/thread.h index ae80db52..dea17bc0 100644 --- a/nx/include/switch/kernel/thread.h +++ b/nx/include/switch/kernel/thread.h @@ -12,3 +12,6 @@ Result threadCreate( Result threadStart(Thread* t); Result threadWaitForExit(Thread* t); Result threadClose(Thread* t); + +Result threadPause(Thread* t); +Result threadResume(Thread* t); diff --git a/nx/include/switch/svc.h b/nx/include/switch/svc.h index 29001dc4..67aff4f7 100644 --- a/nx/include/switch/svc.h +++ b/nx/include/switch/svc.h @@ -43,6 +43,7 @@ Result svcMapSharedMemory(Handle handle, void* addr, size_t size, u32 perm); Result svcUnmapSharedMemory(Handle handle, void* addr, size_t size); Result svcCreateTransferMemory(Handle* out, void* addr, size_t size, u32 perm); Result svcWaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); +Result svcCancelSynchronization(Handle thread); Result svcArbitrateLock(u32 wait_tag, u32* tag_location, u32 self_tag); Result svcArbitrateUnlock(u32* tag_location); Result svcConnectToNamedPort(Handle* session, const char* name); @@ -52,6 +53,7 @@ Result svcGetProcessId(u64 *processID, Handle handle); Result svcBreak(u32 breakReason, u64 inval1, u64 inval2); Result svcOutputDebugString(const char *str, u64 size); Result svcGetInfo(u64* out, u64 id0, Handle handle, u64 id1); +Result svcSetThreadActivity(Handle thread, bool paused); Result svcCreateSession(Handle *server_handle, Handle *client_handle, u32 unk0, u64 unk1);//unk* are normally 0? Result svcAcceptSession(Handle *session_handle, Handle port_handle); Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); @@ -78,4 +80,4 @@ Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions) Result svcMapProcessMemory(void* dst, Handle proc, u64 src, u64 size); Result svcCreateProcess(Handle* out, void* proc_info, u32* caps, u64 cap_num); Result svcStartProcess(Handle proc, s32 main_prio, s32 default_cpu, u32 stack_size); -u64 svcCallSecureMonitor(SecmonArgs* regs); +u64 svcCallSecureMonitor(SecmonArgs* regs); diff --git a/nx/source/kernel/svc.s b/nx/source/kernel/svc.s index cbfb7fe3..06979ba7 100644 --- a/nx/source/kernel/svc.s +++ b/nx/source/kernel/svc.s @@ -166,6 +166,11 @@ SVC_BEGIN svcGetInfo ret SVC_END +SVC_BEGIN svcSetThreadActivity + svc 0x32 + ret +SVC_END + SVC_BEGIN svcCreateSession stp x0, x1, [sp, #-16]! svc 0x40 diff --git a/nx/source/kernel/thread.c b/nx/source/kernel/thread.c index cb4edbd6..34ee124a 100644 --- a/nx/source/kernel/thread.c +++ b/nx/source/kernel/thread.c @@ -124,3 +124,11 @@ Result threadClose(Thread* t) { return rc; } + +Result threadPause(Thread* t) { + return svcSetThreadActivity(t->handle, 1); +} + +Result threadResume(Thread* t) { + return svcSetThreadActivity(t->handle, 0); +}