aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs90
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);