diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs')
-rw-r--r-- | src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs | 147 |
1 files changed, 74 insertions, 73 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index 86469c03..7e41a3f3 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -10,19 +10,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { class KServerSession : KSynchronizationObject { - private static readonly MemoryState[] IpcMemoryStates = new MemoryState[] - { + private static readonly MemoryState[] _ipcMemoryStates = { MemoryState.IpcBuffer3, MemoryState.IpcBuffer0, MemoryState.IpcBuffer1, - (MemoryState)0xfffce5d4 //This is invalid, shouldn't be accessed. + (MemoryState)0xfffce5d4, //This is invalid, shouldn't be accessed. }; private readonly struct Message { - public ulong Address { get; } - public ulong Size { get; } - public bool IsCustom { get; } + public ulong Address { get; } + public ulong Size { get; } + public bool IsCustom { get; } public Message(KThread thread, ulong customCmdBuffAddress, ulong customCmdBuffSize) { @@ -31,19 +30,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (IsCustom) { Address = customCmdBuffAddress; - Size = customCmdBuffSize; + Size = customCmdBuffSize; } else { Address = thread.TlsAddress; - Size = 0x100; + Size = 0x100; } } public Message(KSessionRequest request) : this( request.ClientThread, request.CustomCmdBuffAddr, - request.CustomCmdBuffSize) { } + request.CustomCmdBuffSize) + { } } private readonly struct MessageHeader @@ -52,18 +52,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc public uint Word1 { get; } public uint Word2 { get; } - public uint PointerBuffersCount { get; } - public uint SendBuffersCount { get; } - public uint ReceiveBuffersCount { get; } + public uint PointerBuffersCount { get; } + public uint SendBuffersCount { get; } + public uint ReceiveBuffersCount { get; } public uint ExchangeBuffersCount { get; } public uint RawDataSizeInWords { get; } public uint ReceiveListType { get; } - public uint MessageSizeInWords { get; } + public uint MessageSizeInWords { get; } public uint ReceiveListOffsetInWords { get; } - public uint ReceiveListOffset { get; } + public uint ReceiveListOffset { get; } public bool HasHandles { get; } @@ -101,14 +101,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MoveHandlesCount = 0; } - PointerBuffersCount = (word0 >> 16) & 0xf; - SendBuffersCount = (word0 >> 20) & 0xf; - ReceiveBuffersCount = (word0 >> 24) & 0xf; - ExchangeBuffersCount = word0 >> 28; + PointerBuffersCount = (word0 >> 16) & 0xf; + SendBuffersCount = (word0 >> 20) & 0xf; + ReceiveBuffersCount = (word0 >> 24) & 0xf; + ExchangeBuffersCount = word0 >> 28; - uint pointerDescSizeInWords = PointerBuffersCount * 2; - uint sendDescSizeInWords = SendBuffersCount * 3; - uint receiveDescSizeInWords = ReceiveBuffersCount * 3; + uint pointerDescSizeInWords = PointerBuffersCount * 2; + uint sendDescSizeInWords = SendBuffersCount * 3; + uint receiveDescSizeInWords = ReceiveBuffersCount * 3; uint exchangeDescSizeInWords = ExchangeBuffersCount * 3; RawDataSizeInWords = word1 & 0x3ff; @@ -119,12 +119,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc uint paddingSizeInWords = HasHandles ? 3u : 2u; - MessageSizeInWords = pointerDescSizeInWords + - sendDescSizeInWords + - receiveDescSizeInWords + + MessageSizeInWords = pointerDescSizeInWords + + sendDescSizeInWords + + receiveDescSizeInWords + exchangeDescSizeInWords + - RawDataSizeInWords + - paddingSizeInWords + + RawDataSizeInWords + + paddingSizeInWords + handleDescSizeInWords; if (ReceiveListOffsetInWords == 0) @@ -140,25 +140,25 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { public uint ReceiveIndex { get; } - public uint BufferSize { get; } + public uint BufferSize { get; } public ulong BufferAddress { get; set; } public PointerBufferDesc(ulong dword) { ReceiveIndex = (uint)dword & 0xf; - BufferSize = (uint)dword >> 16; + BufferSize = (uint)dword >> 16; - BufferAddress = (dword >> 2) & 0x70; + BufferAddress = (dword >> 2) & 0x70; BufferAddress |= (dword >> 12) & 0xf; BufferAddress = (BufferAddress << 32) | (dword >> 32); } - public ulong Pack() + public readonly ulong Pack() { ulong dword = (ReceiveIndex & 0xf) | ((BufferSize & 0xffff) << 16); - dword |= BufferAddress << 32; + dword |= BufferAddress << 32; dword |= (BufferAddress >> 20) & 0xf000; dword |= (BufferAddress >> 30) & 0xffc0; @@ -166,9 +166,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private KSession _parent; + private readonly KSession _parent; - private LinkedList<KSessionRequest> _requests; + private readonly LinkedList<KSessionRequest> _requests; private KSessionRequest _activeRequest; @@ -208,7 +208,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc public Result Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { - KThread serverThread = KernelStatic.GetCurrentThread(); + KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; KernelContext.CriticalSection.Enter(); @@ -234,7 +234,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.PortRemoteClosed; } - KThread clientThread = request.ClientThread; + KThread clientThread = request.ClientThread; KProcess clientProcess = clientThread.Owner; KernelContext.CriticalSection.Leave(); @@ -243,8 +243,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc request.ServerProcess = serverProcess; - Message clientMsg = new Message(request); - Message serverMsg = new Message(serverThread, customCmdBuffAddr, customCmdBuffSize); + Message clientMsg = new(request); + Message serverMsg = new(serverThread, customCmdBuffAddr, customCmdBuffSize); MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); @@ -399,7 +399,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ulong pointerDesc = clientProcess.CpuMemory.Read<ulong>(clientMsg.Address + offset * 4); - PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc); + PointerBufferDesc descriptor = new(pointerDesc); if (descriptor.BufferSize != 0) { @@ -409,7 +409,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc serverHeader.ReceiveListType, clientHeader.MessageSizeInWords, receiveList, - ref recvListDstOffset, + ref recvListDstOffset, out ulong recvListBufferAddress); if (clientResult != Result.Success) @@ -450,7 +450,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc // Copy send, receive and exchange buffers. uint totalBuffersCount = - clientHeader.SendBuffersCount + + clientHeader.SendBuffersCount + clientHeader.ReceiveBuffersCount + clientHeader.ExchangeBuffersCount; @@ -462,11 +462,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc uint descWord1 = clientProcess.CpuMemory.Read<uint>(clientDescAddress + 4); uint descWord2 = clientProcess.CpuMemory.Read<uint>(clientDescAddress + 8); - bool isSendDesc = index < clientHeader.SendBuffersCount; + bool isSendDesc = index < clientHeader.SendBuffersCount; bool isExchangeDesc = index >= clientHeader.SendBuffersCount + clientHeader.ReceiveBuffersCount; bool notReceiveDesc = isSendDesc || isExchangeDesc; - bool isReceiveDesc = !notReceiveDesc; + bool isReceiveDesc = !notReceiveDesc; KMemoryPermission permission = index >= clientHeader.SendBuffersCount ? KMemoryPermission.ReadAndWrite @@ -482,12 +482,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ulong bufferAddress; - bufferAddress = descWord2 >> 28; + bufferAddress = descWord2 >> 28; bufferAddress |= ((descWord2 >> 2) & 7) << 4; bufferAddress = (bufferAddress << 32) | descWord1; - MemoryState state = IpcMemoryStates[(descWord2 + 1) & 3]; + MemoryState state = _ipcMemoryStates[(descWord2 + 1) & 3]; clientResult = serverProcess.MemoryManager.MapBufferFromClientProcess( bufferSize, @@ -533,7 +533,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc descWord2 |= sizeHigh4 << 24; descWord2 |= (uint)(dstAddress >> 34) & 0x3ffffffc; - descWord2 |= (uint)(dstAddress >> 4) & 0xf0000000; + descWord2 |= (uint)(dstAddress >> 4) & 0xf0000000; ulong serverDescAddress = serverMsg.Address + offset * 4; @@ -586,7 +586,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc public Result Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { - KThread serverThread = KernelStatic.GetCurrentThread(); + KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; KernelContext.CriticalSection.Enter(); @@ -609,11 +609,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Leave(); - KThread clientThread = request.ClientThread; + KThread clientThread = request.ClientThread; KProcess clientProcess = clientThread.Owner; - Message clientMsg = new Message(request); - Message serverMsg = new Message(serverThread, customCmdBuffAddr, customCmdBuffSize); + Message clientMsg = new(request); + Message serverMsg = new(serverThread, customCmdBuffAddr, customCmdBuffSize); MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); @@ -664,8 +664,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.CmdBufferTooSmall; } - if (serverHeader.SendBuffersCount != 0 || - serverHeader.ReceiveBuffersCount != 0 || + if (serverHeader.SendBuffersCount != 0 || + serverHeader.ReceiveBuffersCount != 0 || serverHeader.ExchangeBuffersCount != 0) { CleanUpForError(); @@ -761,7 +761,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ulong pointerDesc = serverProcess.CpuMemory.Read<ulong>(serverMsg.Address + offset * 4); - PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc); + PointerBufferDesc descriptor = new(pointerDesc); ulong recvListBufferAddress = 0; @@ -817,7 +817,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc // Set send, receive and exchange buffer descriptors to zero. uint totalBuffersCount = - serverHeader.SendBuffersCount + + serverHeader.SendBuffersCount + serverHeader.ReceiveBuffersCount + serverHeader.ExchangeBuffersCount; @@ -868,7 +868,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return serverResult; } - private MessageHeader GetClientMessageHeader(KProcess clientProcess, Message clientMsg) + private static MessageHeader GetClientMessageHeader(KProcess clientProcess, Message clientMsg) { uint word0 = clientProcess.CpuMemory.Read<uint>(clientMsg.Address + 0); uint word1 = clientProcess.CpuMemory.Read<uint>(clientMsg.Address + 4); @@ -877,7 +877,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return new MessageHeader(word0, word1, word2); } - private MessageHeader GetServerMessageHeader(Message serverMsg) + private static MessageHeader GetServerMessageHeader(Message serverMsg) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -888,7 +888,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return new MessageHeader(word0, word1, word2); } - private Result GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) + private static Result GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -919,7 +919,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private Result GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) + private static Result GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -939,7 +939,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private ulong[] GetReceiveList(KProcess ownerProcess, Message message, uint recvListType, uint recvListOffset) + private static ulong[] GetReceiveList(KProcess ownerProcess, Message message, uint recvListType, uint recvListOffset) { int recvListSize = 0; @@ -964,16 +964,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return receiveList; } - private Result GetReceiveListAddress( + private static Result GetReceiveListAddress( PointerBufferDesc descriptor, - Message message, - uint recvListType, - uint messageSizeInWords, - ulong[] receiveList, - ref uint dstOffset, - out ulong address) + Message message, + uint recvListType, + uint messageSizeInWords, + ulong[] receiveList, + ref uint dstOffset, + out ulong address) { - ulong recvListBufferAddress = address = 0; + ulong recvListBufferAddress; + address = 0; if (recvListType == 0) { @@ -987,7 +988,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (recvListType == 1) { recvListBaseAddr = message.Address + messageSizeInWords * 4; - recvListEndAddr = message.Address + message.Size; + recvListEndAddr = message.Address + message.Size; } else /* if (recvListType == 2) */ { @@ -1012,7 +1013,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc dstOffset = (uint)endAddress - (uint)recvListBaseAddr; if (recvListBufferAddress + descriptor.BufferSize <= recvListBufferAddress || - recvListBufferAddress + descriptor.BufferSize > recvListEndAddr) + recvListBufferAddress + descriptor.BufferSize > recvListEndAddr) { return KernelResult.OutOfResource; } @@ -1041,7 +1042,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return Result.Success; } - private void CloseAllHandles(Message message, MessageHeader header, KProcess process) + private static void CloseAllHandles(Message message, MessageHeader header, KProcess process) { if (header.HasHandles) { @@ -1202,7 +1203,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private void SendResultToAsyncRequestClient(KSessionRequest request, Result result) + private static void SendResultToAsyncRequestClient(KSessionRequest request, Result result) { KProcess clientProcess = request.ClientThread.Owner; @@ -1232,15 +1233,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Leave(); } - private void WakeAndSetResult(KThread thread, Result result, KSynchronizationObject signaledObj = null) + private static void WakeAndSetResult(KThread thread, Result result, KSynchronizationObject signaledObj = null) { if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused) { - thread.SignaledObj = signaledObj; + thread.SignaledObj = signaledObj; thread.ObjSyncResult = result; thread.Reschedule(ThreadSchedState.Running); } } } -}
\ No newline at end of file +} |