diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs | 22 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs | 90 |
2 files changed, 51 insertions, 61 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs index fbd32845..a4e7f589 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs @@ -47,7 +47,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.OutOfMemory; } - public KernelResult CopyBuffersToClient(KMemoryManager memoryManager) + public KernelResult CopyBuffersToClient(KPageTableBase memoryManager) { KernelResult result = CopyToClient(memoryManager, _receiveBufferDescriptors); @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return CopyToClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult CopyToClient(KMemoryManager memoryManager, List<KBufferDescriptor> list) + private KernelResult CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor desc in list) { @@ -81,8 +81,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc attributeMask |= MemoryAttribute.DeviceMapped; } - ulong clientAddrTruncated = BitUtils.AlignDown(desc.ClientAddress, KMemoryManager.PageSize); - ulong clientAddrRounded = BitUtils.AlignUp (desc.ClientAddress, KMemoryManager.PageSize); + ulong clientAddrTruncated = BitUtils.AlignDown(desc.ClientAddress, KPageTableBase.PageSize); + ulong clientAddrRounded = BitUtils.AlignUp (desc.ClientAddress, KPageTableBase.PageSize); // Check if address is not aligned, in this case we need to perform 2 copies. if (clientAddrTruncated != clientAddrRounded) @@ -113,9 +113,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ulong clientEndAddr = desc.ClientAddress + desc.Size; ulong serverEndAddr = desc.ServerAddress + desc.Size; - ulong clientEndAddrTruncated = BitUtils.AlignDown(clientEndAddr, KMemoryManager.PageSize); - ulong clientEndAddrRounded = BitUtils.AlignUp (clientEndAddr, KMemoryManager.PageSize); - ulong serverEndAddrTruncated = BitUtils.AlignDown(serverEndAddr, KMemoryManager.PageSize); + ulong clientEndAddrTruncated = BitUtils.AlignDown(clientEndAddr, KPageTableBase.PageSize); + ulong clientEndAddrRounded = BitUtils.AlignUp (clientEndAddr, KPageTableBase.PageSize); + ulong serverEndAddrTruncated = BitUtils.AlignDown(serverEndAddr, KPageTableBase.PageSize); if (clientEndAddrTruncated < clientEndAddrRounded && (clientAddrTruncated == clientAddrRounded || clientAddrTruncated < clientEndAddrTruncated)) @@ -140,7 +140,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.Success; } - public KernelResult UnmapServerBuffers(KMemoryManager memoryManager) + public KernelResult UnmapServerBuffers(KPageTableBase memoryManager) { KernelResult result = UnmapServer(memoryManager, _sendBufferDescriptors); @@ -159,7 +159,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return UnmapServer(memoryManager, _exchangeBufferDescriptors); } - private KernelResult UnmapServer(KMemoryManager memoryManager, List<KBufferDescriptor> list) + private KernelResult UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { @@ -177,7 +177,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.Success; } - public KernelResult RestoreClientBuffers(KMemoryManager memoryManager) + public KernelResult RestoreClientBuffers(KPageTableBase memoryManager) { KernelResult result = RestoreClient(memoryManager, _sendBufferDescriptors); @@ -196,7 +196,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return RestoreClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult RestoreClient(KMemoryManager memoryManager, List<KBufferDescriptor> list) + private KernelResult RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { 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); |
