IPC refactor part 3+4: New server HIPC message processor (#4188)
* IPC refactor part 3 + 4: New server HIPC message processor with source generator based serialization * Make types match on calls to AlignUp/AlignDown * Formatting * Address some PR feedback * Move BitfieldExtensions to Ryujinx.Common.Utilities and consolidate implementations * Rename Reader/Writer to SpanReader/SpanWriter and move to Ryujinx.Common.Memory * Implement EventType * Address more PR feedback * Log request processing errors since they are not normal * Rename waitable to multiwait and add missing lock * PR feedback * Ac_K PR feedback
This commit is contained in:
parent
c6a139a6e7
commit
08831eecf7
213 changed files with 9762 additions and 1010 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue