diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs | 62 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs | 15 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs | 13 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs | 21 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs | 77 |
5 files changed, 96 insertions, 92 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs index 5726299b..593d2c9d 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs @@ -1,6 +1,6 @@ using Ryujinx.Common; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.Horizon.Common; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -20,38 +20,38 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _exchangeBufferDescriptors = new List<KBufferDescriptor>(MaxInternalBuffersCount); } - public KernelResult AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_sendBufferDescriptors, src, dst, size, state); } - public KernelResult AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_receiveBufferDescriptors, src, dst, size, state); } - public KernelResult AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_exchangeBufferDescriptors, src, dst, size, state); } - private KernelResult Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state) + private Result Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state) { if (list.Count < MaxInternalBuffersCount) { list.Add(new KBufferDescriptor(src, dst, size, state)); - return KernelResult.Success; + return Result.Success; } return KernelResult.OutOfMemory; } - public KernelResult CopyBuffersToClient(KPageTableBase memoryManager) + public Result CopyBuffersToClient(KPageTableBase memoryManager) { - KernelResult result = CopyToClient(memoryManager, _receiveBufferDescriptors); + Result result = CopyToClient(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return CopyToClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor desc in list) { @@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc copySize = desc.Size; } - KernelResult result = memoryManager.CopyDataFromCurrentProcess( + Result result = memoryManager.CopyDataFromCurrentProcess( desc.ClientAddress, copySize, stateMask, @@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, desc.ServerAddress); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (clientEndAddrTruncated < clientEndAddrRounded && (clientAddrTruncated == clientAddrRounded || clientAddrTruncated < clientEndAddrTruncated)) { - KernelResult result = memoryManager.CopyDataFromCurrentProcess( + Result result = memoryManager.CopyDataFromCurrentProcess( clientEndAddrTruncated, clientEndAddr - clientEndAddrTruncated, stateMask, @@ -130,28 +130,28 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, serverEndAddrTruncated); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } } - return KernelResult.Success; + return Result.Success; } - public KernelResult UnmapServerBuffers(KPageTableBase memoryManager) + public Result UnmapServerBuffers(KPageTableBase memoryManager) { - KernelResult result = UnmapServer(memoryManager, _sendBufferDescriptors); + Result result = UnmapServer(memoryManager, _sendBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = UnmapServer(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -159,36 +159,36 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return UnmapServer(memoryManager, _exchangeBufferDescriptors); } - private KernelResult UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { - KernelResult result = memoryManager.UnmapNoAttributeIfStateEquals( + Result result = memoryManager.UnmapNoAttributeIfStateEquals( descriptor.ServerAddress, descriptor.Size, descriptor.State); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } - return KernelResult.Success; + return Result.Success; } - public KernelResult RestoreClientBuffers(KPageTableBase memoryManager) + public Result RestoreClientBuffers(KPageTableBase memoryManager) { - KernelResult result = RestoreClient(memoryManager, _sendBufferDescriptors); + Result result = RestoreClient(memoryManager, _sendBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = RestoreClient(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -196,22 +196,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return RestoreClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { - KernelResult result = memoryManager.UnmapIpcRestorePermission( + Result result = memoryManager.UnmapIpcRestorePermission( descriptor.ClientAddress, descriptor.Size, descriptor.State); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } - return KernelResult.Success; + return Result.Success; } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs index 6e935077..eb7c5a41 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -19,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _parent = parent; } - public KernelResult Connect(out KClientSession clientSession) + public Result Connect(out KClientSession clientSession) { clientSession = null; @@ -40,9 +41,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KSession session = new KSession(KernelContext, this); - KernelResult result = _parent.EnqueueIncomingSession(session.ServerSession); + Result result = _parent.EnqueueIncomingSession(session.ServerSession); - if (result != KernelResult.Success) + if (result != Result.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); @@ -55,7 +56,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult ConnectLight(out KLightClientSession clientSession) + public Result ConnectLight(out KLightClientSession clientSession) { clientSession = null; @@ -76,9 +77,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KLightSession session = new KLightSession(KernelContext); - KernelResult result = _parent.EnqueueIncomingLightSession(session.ServerSession); + Result result = _parent.EnqueueIncomingLightSession(session.ServerSession); - if (result != KernelResult.Success) + if (result != Result.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); @@ -128,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - public new static KernelResult RemoveName(KernelContext context, string name) + public new static Result RemoveName(KernelContext context, string name) { KAutoObject foundObj = FindNamedObject(context, name); diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs index 7bbc3ba2..a24bcc31 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs @@ -1,6 +1,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Ipc { @@ -27,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc CreatorProcess.IncrementReferenceCount(); } - public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -36,13 +37,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Enter(); currentThread.SignaledObj = null; - currentThread.ObjSyncResult = KernelResult.Success; + currentThread.ObjSyncResult = Result.Success; - KernelResult result = _parent.ServerSession.EnqueueRequest(request); + Result result = _parent.ServerSession.EnqueueRequest(request); KernelContext.CriticalSection.Leave(); - if (result == KernelResult.Success) + if (result == Result.Success) { result = currentThread.ObjSyncResult; } @@ -50,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -58,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Enter(); - KernelResult result = _parent.ServerSession.EnqueueRequest(request); + Result result = _parent.ServerSession.EnqueueRequest(request); KernelContext.CriticalSection.Leave(); diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs index 2f67aeae..93f0f34c 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Ipc { @@ -7,26 +8,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc public KServerPort ServerPort { get; } public KClientPort ClientPort { get; } - private long _nameAddress; + private string _name; private ChannelState _state; public bool IsLight { get; private set; } - public KPort(KernelContext context, int maxSessions, bool isLight, long nameAddress) : base(context) + public KPort(KernelContext context, int maxSessions, bool isLight, string name) : base(context) { ServerPort = new KServerPort(context, this); ClientPort = new KClientPort(context, this, maxSessions); - IsLight = isLight; - _nameAddress = nameAddress; + IsLight = isLight; + _name = name; _state = ChannelState.Open; } - public KernelResult EnqueueIncomingSession(KServerSession session) + public Result EnqueueIncomingSession(KServerSession session) { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -34,7 +35,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ServerPort.EnqueueIncomingSession(session); - result = KernelResult.Success; + result = Result.Success; } else { @@ -46,9 +47,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult EnqueueIncomingLightSession(KLightServerSession session) + public Result EnqueueIncomingLightSession(KLightServerSession session) { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -56,7 +57,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ServerPort.EnqueueIncomingLightSession(session); - result = KernelResult.Success; + result = Result.Success; } else { diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index 199e78dc..9c2184d9 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -3,6 +3,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -178,7 +179,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _requests = new LinkedList<KSessionRequest>(); } - public KernelResult EnqueueRequest(KSessionRequest request) + public Result EnqueueRequest(KSessionRequest request) { if (_parent.ClientSession.State != ChannelState.Open) { @@ -203,10 +204,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc Signal(); } - return KernelResult.Success; + return Result.Success; } - public KernelResult Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; @@ -249,12 +250,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); - KernelResult serverResult = KernelResult.NotFound; - KernelResult clientResult = KernelResult.Success; + Result serverResult = KernelResult.NotFound; + Result clientResult = Result.Success; void CleanUpForError() { - if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == KernelResult.Success) + if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == Result.Success) { request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager); } @@ -348,7 +349,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc int newHandle = 0; int handle = clientProcess.CpuMemory.Read<int>(clientMsg.Address + offset * 4); - if (clientResult == KernelResult.Success && handle != 0) + if (clientResult == Result.Success && handle != 0) { clientResult = GetCopyObjectHandle(clientThread, serverProcess, handle, out newHandle); } @@ -365,7 +366,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (handle != 0) { - if (clientResult == KernelResult.Success) + if (clientResult == Result.Success) { clientResult = GetMoveObjectHandle(clientProcess, serverProcess, handle, out newHandle); } @@ -380,7 +381,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc offset++; } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -412,7 +413,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ref recvListDstOffset, out ulong recvListBufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -429,7 +430,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.Uncached, MemoryAttribute.None); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -498,7 +499,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc notReceiveDesc, out dstAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -518,7 +519,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc clientResult = request.BufferDescriptorTable.AddExchangeBuffer(bufferAddress, dstAddress, bufferSize, state); } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -573,7 +574,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc serverProcess.CpuMemory.Write(copyDst, clientProcess.CpuMemory.GetSpan(copySrc, (int)copySize)); } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -581,10 +582,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - return KernelResult.Success; + return Result.Success; } - public KernelResult Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; @@ -618,8 +619,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); - KernelResult clientResult = KernelResult.Success; - KernelResult serverResult = KernelResult.Success; + Result clientResult = Result.Success; + Result serverResult = Result.Success; void CleanUpForError() { @@ -683,7 +684,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc // Copy receive and exchange buffers. clientResult = request.BufferDescriptorTable.CopyBuffersToClient(clientProcess.MemoryManager); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -734,7 +735,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (handle != 0) { - if (clientResult == KernelResult.Success) + if (clientResult == Result.Success) { clientResult = GetMoveObjectHandle(serverProcess, clientProcess, handle, out newHandle); } @@ -776,7 +777,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ref recvListDstOffset, out recvListBufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -793,7 +794,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, descriptor.BufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -888,7 +889,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return new MessageHeader(word0, word1, word2); } - private KernelResult GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) + private Result GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -919,7 +920,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private KernelResult GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) + private Result GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -927,7 +928,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (obj != null) { - KernelResult result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle); + Result result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle); srcProcess.HandleTable.CloseHandle(srcHandle); @@ -964,7 +965,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return receiveList; } - private KernelResult GetReceiveListAddress( + private Result GetReceiveListAddress( PointerBufferDesc descriptor, Message message, uint recvListType, @@ -1038,7 +1039,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc address = recvListBufferAddress; - return KernelResult.Success; + return Result.Success; } private void CloseAllHandles(Message message, MessageHeader header, KProcess process) @@ -1166,19 +1167,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return hasRequest; } - private void FinishRequest(KSessionRequest request, KernelResult result) + private void FinishRequest(KSessionRequest request, Result result) { KProcess clientProcess = request.ClientThread.Owner; KProcess serverProcess = request.ServerProcess; - KernelResult unmapResult = KernelResult.Success; + Result unmapResult = Result.Success; if (serverProcess != null) { unmapResult = request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager); } - if (unmapResult == KernelResult.Success) + if (unmapResult == Result.Success) { request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager); } @@ -1186,7 +1187,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc WakeClientThread(request, result); } - private void WakeClientThread(KSessionRequest request, KernelResult result) + private void WakeClientThread(KSessionRequest request, Result result) { // Wait client thread waiting for a response for the given request. if (request.AsyncEvent != null) @@ -1203,16 +1204,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private void SendResultToAsyncRequestClient(KSessionRequest request, KernelResult result) + private void SendResultToAsyncRequestClient(KSessionRequest request, Result result) { KProcess clientProcess = request.ClientThread.Owner; - if (result != KernelResult.Success) + if (result != Result.Success) { ulong address = request.CustomCmdBuffAddr; clientProcess.CpuMemory.Write<ulong>(address, 0); - clientProcess.CpuMemory.Write(address + 8, (int)result); + clientProcess.CpuMemory.Write(address + 8, result.ErrorCode); } clientProcess.MemoryManager.UnborrowIpcBuffer(request.CustomCmdBuffAddr, request.CustomCmdBuffSize); @@ -1220,24 +1221,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc request.AsyncEvent.Signal(); } - private void WakeServerThreads(KernelResult result) + private void WakeServerThreads(Result result) { // Wake all server threads waiting for requests. KernelContext.CriticalSection.Enter(); foreach (KThread thread in WaitingThreads) { - WakeAndSetResult(thread, result); + WakeAndSetResult(thread, result, this); } KernelContext.CriticalSection.Leave(); } - private void WakeAndSetResult(KThread thread, KernelResult result) + private void WakeAndSetResult(KThread thread, Result result, KSynchronizationObject signaledObj = null) { if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused) { - thread.SignaledObj = null; + thread.SignaledObj = signaledObj; thread.ObjSyncResult = result; thread.Reschedule(ThreadSchedState.Running); |