Set return value for SvcWaitProcessWideKeyAtomic

This commit is contained in:
roblabla 2017-12-10 21:46:27 +01:00
parent 713d2643fe
commit c586044616
2 changed files with 6 additions and 5 deletions

View file

@ -92,7 +92,7 @@ Svc::Svc(Ctu *_ctu) : ctu(_ctu) {
registerSvc_ret_X0( 0x19, CancelSynchronization, (ghandle) IX0);
registerSvc_ret_X0( 0x1A, LockMutex, (ghandle) IX0, IX1, (ghandle) IX2);
registerSvc( 0x1B, UnlockMutex, IX0);
registerSvc( 0x1C, WaitProcessWideKeyAtomic, IX0, IX1, (ghandle) IX2, IX3);
registerSvc_ret_X0( 0x1C, WaitProcessWideKeyAtomic, IX0, IX1, (ghandle) IX2, IX3);
registerSvc_ret_X0( 0x1D, SignalProcessWideKey, IX0, IX1);
registerSvc_ret_X0_X1( 0x1F, ConnectToPort, IX1);
registerSvc_ret_X0( 0x21, SendSyncRequest, (ghandle) IX0);
@ -388,7 +388,7 @@ shared_ptr<Semaphore> Svc::ensureSemaphore(gptr semaAddr) {
return semaphores[semaAddr];
}
void Svc::WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle threadHandle, guint timeout) {
guint Svc::WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle threadHandle, guint timeout) {
LOG_DEBUG(Svc[0x1C], "WaitProcessWideKeyAtomic 0x" LONGFMT " 0x" LONGFMT " 0x%x 0x" LONGFMT, mutexAddr, semaAddr, threadHandle, timeout);
auto mutex = ensureMutex(mutexAddr);
@ -398,7 +398,7 @@ void Svc::WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle thread
if(semaphore->value() > 0) {
semaphore->decrement();
return;
return 0;
}
auto thread = ctu->getHandle<Thread>(threadHandle);
@ -406,13 +406,14 @@ void Svc::WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle thread
semaphore->wait([=] {
semaphore->decrement();
thread->resume([=] {
LockMutex(0, mutexAddr, threadHandle);
thread->regs.X0 = LockMutex(0, mutexAddr, threadHandle);
});
return 1;
});
});
mutex->guestRelease();
return 0;
}
guint Svc::SignalProcessWideKey(gptr semaAddr, guint target) {

2
Svc.h
View file

@ -47,7 +47,7 @@ private:
guint CancelSynchronization(ghandle handle); // 0x19
guint LockMutex(ghandle curthread, gptr mutexAddr, ghandle reqthread); // 0x1A
void UnlockMutex(gptr mutexAddr); // 0x1B
void WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle threadHandle, guint timeout); // 0x1C
guint WaitProcessWideKeyAtomic(gptr mutexAddr, gptr semaAddr, ghandle threadHandle, guint timeout); // 0x1C
guint SignalProcessWideKey(gptr semaAddr, guint target); // 0x1D
tuple<guint, ghandle> ConnectToPort(guint name); // 0x1F
guint SendSyncRequest(ghandle handle); // 0x21