diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs | 90 |
1 files changed, 40 insertions, 50 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index e97309d9..e28677ff 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -19,10 +19,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc private struct Message { - public ulong Address { get; } - public ulong DramAddress { 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) { @@ -32,16 +31,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { Address = customCmdBuffAddress; Size = customCmdBuffSize; - - KProcess process = thread.Owner; - - DramAddress = process.MemoryManager.GetDramAddressFromVa(Address); } else { - Address = thread.TlsAddress; - DramAddress = thread.TlsDramAddress; - Size = 0x100; + Address = thread.TlsAddress; + Size = 0x100; } } @@ -252,7 +246,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc Message clientMsg = new Message(request); Message serverMsg = new Message(serverThread, customCmdBuffAddr, customCmdBuffSize); - MessageHeader clientHeader = GetClientMessageHeader(clientMsg); + MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); KernelResult serverResult = KernelResult.NotFound; @@ -318,6 +312,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } ulong[] receiveList = GetReceiveList( + serverProcess, serverMsg, serverHeader.ReceiveListType, serverHeader.ReceiveListOffset); @@ -351,7 +346,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < clientHeader.CopyHandlesCount; index++) { int newHandle = 0; - int handle = KernelContext.Memory.Read<int>(clientMsg.DramAddress + offset * 4); + int handle = clientProcess.CpuMemory.Read<int>(clientMsg.Address + offset * 4); if (clientResult == KernelResult.Success && handle != 0) { @@ -366,7 +361,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < clientHeader.MoveHandlesCount; index++) { int newHandle = 0; - int handle = KernelContext.Memory.Read<int>(clientMsg.DramAddress + offset * 4); + int handle = clientProcess.CpuMemory.Read<int>(clientMsg.Address + offset * 4); if (handle != 0) { @@ -402,7 +397,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < clientHeader.PointerBuffersCount; index++) { - ulong pointerDesc = KernelContext.Memory.Read<ulong>(clientMsg.DramAddress + offset * 4); + ulong pointerDesc = clientProcess.CpuMemory.Read<ulong>(clientMsg.Address + offset * 4); PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc); @@ -461,11 +456,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < totalBuffersCount; index++) { - ulong clientDescAddress = clientMsg.DramAddress + offset * 4; + ulong clientDescAddress = clientMsg.Address + offset * 4; - uint descWord0 = KernelContext.Memory.Read<uint>(clientDescAddress + 0); - uint descWord1 = KernelContext.Memory.Read<uint>(clientDescAddress + 4); - uint descWord2 = KernelContext.Memory.Read<uint>(clientDescAddress + 8); + uint descWord0 = clientProcess.CpuMemory.Read<uint>(clientDescAddress + 0); + uint descWord1 = clientProcess.CpuMemory.Read<uint>(clientDescAddress + 4); + uint descWord2 = clientProcess.CpuMemory.Read<uint>(clientDescAddress + 8); bool isSendDesc = index < clientHeader.SendBuffersCount; bool isExchangeDesc = index >= clientHeader.SendBuffersCount + clientHeader.ReceiveBuffersCount; @@ -575,10 +570,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } else { - copySrc = clientProcess.MemoryManager.GetDramAddressFromVa(copySrc); - copyDst = serverProcess.MemoryManager.GetDramAddressFromVa(copyDst); - - KernelContext.Memory.Copy(copyDst, copySrc, copySize); + serverProcess.CpuMemory.Write(copyDst, clientProcess.CpuMemory.GetSpan(copySrc, (int)copySize)); } if (clientResult != KernelResult.Success) @@ -623,7 +615,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc Message clientMsg = new Message(request); Message serverMsg = new Message(serverThread, customCmdBuffAddr, customCmdBuffSize); - MessageHeader clientHeader = GetClientMessageHeader(clientMsg); + MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); KernelResult clientResult = KernelResult.Success; @@ -683,6 +675,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc // Read receive list. ulong[] receiveList = GetReceiveList( + clientProcess, clientMsg, clientHeader.ReceiveListType, clientHeader.ReceiveListOffset); @@ -698,8 +691,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } // Copy header. - KernelContext.Memory.Write(clientMsg.DramAddress + 0, serverHeader.Word0); - KernelContext.Memory.Write(clientMsg.DramAddress + 4, serverHeader.Word1); + clientProcess.CpuMemory.Write(clientMsg.Address + 0, serverHeader.Word0); + clientProcess.CpuMemory.Write(clientMsg.Address + 4, serverHeader.Word1); // Copy handles. uint offset; @@ -708,11 +701,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { offset = 3; - KernelContext.Memory.Write(clientMsg.DramAddress + 8, serverHeader.Word2); + clientProcess.CpuMemory.Write(clientMsg.Address + 8, serverHeader.Word2); if (serverHeader.HasPid) { - KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, serverProcess.Pid); + clientProcess.CpuMemory.Write(clientMsg.Address + offset * 4, serverProcess.Pid); offset += 2; } @@ -728,7 +721,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc GetCopyObjectHandle(serverThread, clientProcess, handle, out newHandle); } - KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle); + clientProcess.CpuMemory.Write(clientMsg.Address + offset * 4, newHandle); offset++; } @@ -751,7 +744,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle); + clientProcess.CpuMemory.Write(clientMsg.Address + offset * 4, newHandle); offset++; } @@ -808,7 +801,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - ulong dstDescAddress = clientMsg.DramAddress + offset * 4; + ulong dstDescAddress = clientMsg.Address + offset * 4; ulong clientPointerDesc = (recvListBufferAddress << 32) | @@ -817,7 +810,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc clientPointerDesc |= pointerDesc & 0xffff000f; - KernelContext.Memory.Write(dstDescAddress + 0, clientPointerDesc); + clientProcess.CpuMemory.Write(dstDescAddress + 0, clientPointerDesc); offset += 2; } @@ -830,11 +823,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < totalBuffersCount; index++) { - ulong dstDescAddress = clientMsg.DramAddress + offset * 4; + ulong dstDescAddress = clientMsg.Address + offset * 4; - KernelContext.Memory.Write(dstDescAddress + 0, 0); - KernelContext.Memory.Write(dstDescAddress + 4, 0); - KernelContext.Memory.Write(dstDescAddress + 8, 0); + clientProcess.CpuMemory.Write(dstDescAddress + 0, 0); + clientProcess.CpuMemory.Write(dstDescAddress + 4, 0); + clientProcess.CpuMemory.Write(dstDescAddress + 8, 0); offset += 3; } @@ -865,10 +858,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } else { - copyDst = clientProcess.MemoryManager.GetDramAddressFromVa(copyDst); - copySrc = serverProcess.MemoryManager.GetDramAddressFromVa(copySrc); - - KernelContext.Memory.Copy(copyDst, copySrc, copySize); + clientProcess.CpuMemory.Write(copyDst, serverProcess.CpuMemory.GetSpan(copySrc, (int)copySize)); } } @@ -878,11 +868,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return serverResult; } - private MessageHeader GetClientMessageHeader(Message clientMsg) + private MessageHeader GetClientMessageHeader(KProcess clientProcess, Message clientMsg) { - uint word0 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 0); - uint word1 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 4); - uint word2 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 8); + uint word0 = clientProcess.CpuMemory.Read<uint>(clientMsg.Address + 0); + uint word1 = clientProcess.CpuMemory.Read<uint>(clientMsg.Address + 4); + uint word2 = clientProcess.CpuMemory.Read<uint>(clientMsg.Address + 8); return new MessageHeader(word0, word1, word2); } @@ -949,7 +939,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private ulong[] GetReceiveList(Message message, uint recvListType, uint recvListOffset) + private ulong[] GetReceiveList(KProcess ownerProcess, Message message, uint recvListType, uint recvListOffset) { int recvListSize = 0; @@ -964,11 +954,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ulong[] receiveList = new ulong[recvListSize]; - ulong recvListAddress = message.DramAddress + recvListOffset; + ulong recvListAddress = message.Address + recvListOffset; for (int index = 0; index < recvListSize; index++) { - receiveList[index] = KernelContext.Memory.Read<ulong>(recvListAddress + (ulong)index * 8); + receiveList[index] = ownerProcess.CpuMemory.Read<ulong>(recvListAddress + (ulong)index * 8); } return receiveList; @@ -1219,10 +1209,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (result != KernelResult.Success) { - ulong address = clientProcess.MemoryManager.GetDramAddressFromVa(request.CustomCmdBuffAddr); + ulong address = request.CustomCmdBuffAddr; - KernelContext.Memory.Write<ulong>(address, 0); - KernelContext.Memory.Write(address + 8, (int)result); + clientProcess.CpuMemory.Write<ulong>(address, 0); + clientProcess.CpuMemory.Write(address + 8, (int)result); } clientProcess.MemoryManager.UnborrowIpcBuffer(request.CustomCmdBuffAddr, request.CustomCmdBuffSize); |