summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/svc.cpp23
-rw-r--r--src/core/hle/kernel/svc_wrap.h4
2 files changed, 23 insertions, 4 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 699d842fd..74643f598 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -520,8 +520,27 @@ static ResultCode WaitProcessWideKeyAtomic(VAddr mutex_addr, VAddr semaphore_add
}
/// Signal process wide key
-static ResultCode SignalProcessWideKey(VAddr addr, u32 target) {
- LOG_WARNING(Kernel_SVC, "(STUBBED) called, address=0x%llx, target=0x%08x", addr, target);
+static ResultCode SignalProcessWideKey(VAddr semaphore_addr, s32 target) {
+ LOG_TRACE(Kernel_SVC, "called, semaphore_addr=0x%llx, target=0x%08x", semaphore_addr, target);
+
+ // Wakeup all or one thread - Any other value is unimplemented
+ ASSERT(target == -1 || target == 1);
+
+ SharedPtr<Semaphore> semaphore = g_object_address_table.Get<Semaphore>(semaphore_addr);
+ if (!semaphore) {
+ // Create a new semaphore for the specified address if one does not already exist
+ semaphore = Semaphore::Create(semaphore_addr).Unwrap();
+ semaphore->name = Common::StringFromFormat("semaphore-%llx", semaphore_addr);
+ }
+
+ CASCADE_CODE(semaphore->Release(target));
+
+ if (semaphore->mutex_addr) {
+ // If a mutex was created for this semaphore, wait the current thread on it
+ SharedPtr<Mutex> mutex = g_object_address_table.Get<Mutex>(semaphore->mutex_addr);
+ return WaitSynchronization1(mutex, GetCurrentThread());
+ }
+
return RESULT_SUCCESS;
}
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h
index f8e50a24f..4798ce733 100644
--- a/src/core/hle/kernel/svc_wrap.h
+++ b/src/core/hle/kernel/svc_wrap.h
@@ -57,9 +57,9 @@ void SvcWrap() {
FuncReturn(retval);
}
-template <ResultCode func(u64, u32)>
+template <ResultCode func(u64, s32)>
void SvcWrap() {
- FuncReturn(func(PARAM(0), (u32)PARAM(1)).raw);
+ FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
}
template <ResultCode func(u64*, u64)>