From f77694e4f774c9391aad5344e70a7c8721cfedc6 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 3 May 2020 19:54:50 -0300 Subject: Implement a new physical memory manager and replace DeviceMemory (#856) * Implement a new physical memory manager and replace DeviceMemory * Proper generic constraints * Fix debug build * Add memory tests * New CPU memory manager and general code cleanup * Remove host memory management from CPU project, use Ryujinx.Memory instead * Fix tests * Document exceptions on MemoryBlock * Fix leak on unix memory allocation * Proper disposal of some objects on tests * Fix JitCache not being set as initialized * GetRef without checks for 8-bits and 16-bits CAS * Add MemoryBlock destructor * Throw in separate method to improve codegen * Address PR feedback * QueryModified improvements * Fix memory write tracking not marking all pages as modified in some cases * Simplify MarkRegionAsModified * Remove XML doc for ghost param * Add back optimization to avoid useless buffer updates * Add Ryujinx.Cpu project, move MemoryManager there and remove MemoryBlockWrapper * Some nits * Do not perform address translation when size is 0 * Address PR feedback and format NativeInterface class * Remove ghost parameter description * Update Ryujinx.Cpu to .NET Core 3.1 * Address PR feedback * Fix build * Return a well defined value for GetPhysicalAddress with invalid VA, and do not return unmapped ranges as modified * Typo --- Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs | 88 ++++++++++++++-------------- 1 file changed, 44 insertions(+), 44 deletions(-) (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc') diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index 7fba645f..201b0bec 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -322,8 +322,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc serverHeader.ReceiveListType, serverHeader.ReceiveListOffset); - serverProcess.CpuMemory.WriteUInt32((long)serverMsg.Address + 0, clientHeader.Word0); - serverProcess.CpuMemory.WriteUInt32((long)serverMsg.Address + 4, clientHeader.Word1); + serverProcess.CpuMemory.Write(serverMsg.Address + 0, clientHeader.Word0); + serverProcess.CpuMemory.Write(serverMsg.Address + 4, clientHeader.Word1); uint offset; @@ -337,13 +337,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return KernelResult.InvalidCombination; } - serverProcess.CpuMemory.WriteUInt32((long)serverMsg.Address + 8, clientHeader.Word2); + serverProcess.CpuMemory.Write(serverMsg.Address + 8, clientHeader.Word2); offset = 3; if (clientHeader.HasPid) { - serverProcess.CpuMemory.WriteInt64((long)serverMsg.Address + offset * 4, clientProcess.Pid); + serverProcess.CpuMemory.Write(serverMsg.Address + offset * 4, clientProcess.Pid); offset += 2; } @@ -352,14 +352,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { int newHandle = 0; - int handle = System.Device.Memory.ReadInt32((long)clientMsg.DramAddress + offset * 4); + int handle = System.Device.Memory.Read(clientMsg.DramAddress + offset * 4); if (clientResult == KernelResult.Success && handle != 0) { clientResult = GetCopyObjectHandle(clientThread, serverProcess, handle, out newHandle); } - serverProcess.CpuMemory.WriteInt32((long)serverMsg.Address + offset * 4, newHandle); + serverProcess.CpuMemory.Write(serverMsg.Address + offset * 4, newHandle); offset++; } @@ -368,7 +368,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { int newHandle = 0; - int handle = System.Device.Memory.ReadInt32((long)clientMsg.DramAddress + offset * 4); + int handle = System.Device.Memory.Read(clientMsg.DramAddress + offset * 4); if (handle != 0) { @@ -382,7 +382,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - serverProcess.CpuMemory.WriteInt32((long)serverMsg.Address + offset * 4, newHandle); + serverProcess.CpuMemory.Write(serverMsg.Address + offset * 4, newHandle); offset++; } @@ -404,7 +404,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < clientHeader.PointerBuffersCount; index++) { - ulong pointerDesc = System.Device.Memory.ReadUInt64((long)clientMsg.DramAddress + offset * 4); + ulong pointerDesc = System.Device.Memory.Read(clientMsg.DramAddress + offset * 4); PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc); @@ -450,7 +450,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc descriptor.BufferAddress = 0; } - serverProcess.CpuMemory.WriteUInt64((long)serverMsg.Address + offset * 4, descriptor.Pack()); + serverProcess.CpuMemory.Write(serverMsg.Address + offset * 4, descriptor.Pack()); offset += 2; } @@ -463,11 +463,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < totalBuffersCount; index++) { - long clientDescAddress = (long)clientMsg.DramAddress + offset * 4; + ulong clientDescAddress = clientMsg.DramAddress + offset * 4; - uint descWord0 = System.Device.Memory.ReadUInt32(clientDescAddress + 0); - uint descWord1 = System.Device.Memory.ReadUInt32(clientDescAddress + 4); - uint descWord2 = System.Device.Memory.ReadUInt32(clientDescAddress + 8); + uint descWord0 = System.Device.Memory.Read(clientDescAddress + 0); + uint descWord1 = System.Device.Memory.Read(clientDescAddress + 4); + uint descWord2 = System.Device.Memory.Read(clientDescAddress + 8); bool isSendDesc = index < clientHeader.SendBuffersCount; bool isExchangeDesc = index >= clientHeader.SendBuffersCount + clientHeader.ReceiveBuffersCount; @@ -542,11 +542,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc descWord2 |= (uint)(dstAddress >> 34) & 0x3ffffffc; descWord2 |= (uint)(dstAddress >> 4) & 0xf0000000; - long serverDescAddress = (long)serverMsg.Address + offset * 4; + ulong serverDescAddress = serverMsg.Address + offset * 4; - serverProcess.CpuMemory.WriteUInt32(serverDescAddress + 0, descWord0); - serverProcess.CpuMemory.WriteUInt32(serverDescAddress + 4, descWord1); - serverProcess.CpuMemory.WriteUInt32(serverDescAddress + 8, descWord2); + serverProcess.CpuMemory.Write(serverDescAddress + 0, descWord0); + serverProcess.CpuMemory.Write(serverDescAddress + 4, descWord1); + serverProcess.CpuMemory.Write(serverDescAddress + 8, descWord2); offset += 3; } @@ -700,8 +700,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } // Copy header. - System.Device.Memory.WriteUInt32((long)clientMsg.DramAddress + 0, serverHeader.Word0); - System.Device.Memory.WriteUInt32((long)clientMsg.DramAddress + 4, serverHeader.Word1); + System.Device.Memory.Write(clientMsg.DramAddress + 0, serverHeader.Word0); + System.Device.Memory.Write(clientMsg.DramAddress + 4, serverHeader.Word1); // Copy handles. uint offset; @@ -710,11 +710,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { offset = 3; - System.Device.Memory.WriteUInt32((long)clientMsg.DramAddress + 8, serverHeader.Word2); + System.Device.Memory.Write(clientMsg.DramAddress + 8, serverHeader.Word2); if (serverHeader.HasPid) { - System.Device.Memory.WriteInt64((long)clientMsg.DramAddress + offset * 4, serverProcess.Pid); + System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, serverProcess.Pid); offset += 2; } @@ -723,14 +723,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { int newHandle = 0; - int handle = serverProcess.CpuMemory.ReadInt32((long)serverMsg.Address + offset * 4); + int handle = serverProcess.CpuMemory.Read(serverMsg.Address + offset * 4); if (handle != 0) { GetCopyObjectHandle(serverThread, clientProcess, handle, out newHandle); } - System.Device.Memory.WriteInt32((long)clientMsg.DramAddress + offset * 4, newHandle); + System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle); offset++; } @@ -739,7 +739,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { int newHandle = 0; - int handle = serverProcess.CpuMemory.ReadInt32((long)serverMsg.Address + offset * 4); + int handle = serverProcess.CpuMemory.Read(serverMsg.Address + offset * 4); if (handle != 0) { @@ -753,7 +753,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - System.Device.Memory.WriteInt32((long)clientMsg.DramAddress + offset * 4, newHandle); + System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle); offset++; } @@ -768,7 +768,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < serverHeader.PointerBuffersCount; index++) { - ulong pointerDesc = serverProcess.CpuMemory.ReadUInt64((long)serverMsg.Address + offset * 4); + ulong pointerDesc = serverProcess.CpuMemory.Read(serverMsg.Address + offset * 4); PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc); @@ -819,11 +819,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc for (int index = 0; index < totalBuffersCount; index++) { - long dstDescAddress = (long)clientMsg.DramAddress + offset * 4; + ulong dstDescAddress = clientMsg.DramAddress + offset * 4; - System.Device.Memory.WriteUInt32(dstDescAddress + 0, 0); - System.Device.Memory.WriteUInt32(dstDescAddress + 4, 0); - System.Device.Memory.WriteUInt32(dstDescAddress + 8, 0); + System.Device.Memory.Write(dstDescAddress + 0, 0); + System.Device.Memory.Write(dstDescAddress + 4, 0); + System.Device.Memory.Write(dstDescAddress + 8, 0); offset += 3; } @@ -878,9 +878,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc private MessageHeader GetClientMessageHeader(Message clientMsg) { - uint word0 = System.Device.Memory.ReadUInt32((long)clientMsg.DramAddress + 0); - uint word1 = System.Device.Memory.ReadUInt32((long)clientMsg.DramAddress + 4); - uint word2 = System.Device.Memory.ReadUInt32((long)clientMsg.DramAddress + 8); + uint word0 = System.Device.Memory.Read(clientMsg.DramAddress + 0); + uint word1 = System.Device.Memory.Read(clientMsg.DramAddress + 4); + uint word2 = System.Device.Memory.Read(clientMsg.DramAddress + 8); return new MessageHeader(word0, word1, word2); } @@ -889,9 +889,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { KProcess currentProcess = System.Scheduler.GetCurrentProcess(); - uint word0 = currentProcess.CpuMemory.ReadUInt32((long)serverMsg.Address + 0); - uint word1 = currentProcess.CpuMemory.ReadUInt32((long)serverMsg.Address + 4); - uint word2 = currentProcess.CpuMemory.ReadUInt32((long)serverMsg.Address + 8); + uint word0 = currentProcess.CpuMemory.Read(serverMsg.Address + 0); + uint word1 = currentProcess.CpuMemory.Read(serverMsg.Address + 4); + uint word2 = currentProcess.CpuMemory.Read(serverMsg.Address + 8); return new MessageHeader(word0, word1, word2); } @@ -970,11 +970,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ulong[] receiveList = new ulong[recvListSize]; - long recvListAddress = (long)message.DramAddress + recvListOffset; + ulong recvListAddress = message.DramAddress + recvListOffset; for (int index = 0; index < recvListSize; index++) { - receiveList[index] = System.Device.Memory.ReadUInt64(recvListAddress + index * 8); + receiveList[index] = System.Device.Memory.Read(recvListAddress + (ulong)index * 8); } return receiveList; @@ -1067,20 +1067,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (header.HasPid) { - process.CpuMemory.WriteInt64((long)message.Address + offset * 4, 0); + process.CpuMemory.Write(message.Address + offset * 4, 0L); offset += 2; } for (int index = 0; index < totalHandeslCount; index++) { - int handle = process.CpuMemory.ReadInt32((long)message.Address + offset * 4); + int handle = process.CpuMemory.Read(message.Address + offset * 4); if (handle != 0) { process.HandleTable.CloseHandle(handle); - process.CpuMemory.WriteInt32((long)message.Address + offset * 4, 0); + process.CpuMemory.Write(message.Address + offset * 4, 0); } offset++; @@ -1225,8 +1225,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ulong address = clientProcess.MemoryManager.GetDramAddressFromVa(request.CustomCmdBuffAddr); - System.Device.Memory.WriteInt64((long)address + 0, 0); - System.Device.Memory.WriteInt32((long)address + 8, (int)result); + System.Device.Memory.Write(address, 0); + System.Device.Memory.Write(address + 8, (int)result); clientProcess.MemoryManager.UnborrowIpcBuffer( request.CustomCmdBuffAddr, -- cgit v1.2.3