aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-09-22 01:50:40 -0300
committerGitHub <noreply@github.com>2020-09-22 14:50:40 +1000
commit6c9565693fd87ae1af81ed63b5fbdde2a5dbecb8 (patch)
treef7d87a5e4aff1b3f0b446bbcc710fcb89ffc288f /Ryujinx.HLE/HOS/Ipc/IpcHandler.cs
parent5dd6f41ff456c2d9a72d9e6d88c4be851bac1f96 (diff)
IPC refactor part 1: Use explicit separate threads to process requests (#1447)
* Changes to allow explicit management of service threads * Remove now unused code * Remove ThreadCounter, its no longer needed * Allow and use separate server per service, also fix exit issues * New policy change: PTC version now uses PR number
Diffstat (limited to 'Ryujinx.HLE/HOS/Ipc/IpcHandler.cs')
-rw-r--r--Ryujinx.HLE/HOS/Ipc/IpcHandler.cs149
1 files changed, 0 insertions, 149 deletions
diff --git a/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs b/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs
deleted file mode 100644
index 43eb4a4e..00000000
--- a/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using Ryujinx.Cpu;
-using Ryujinx.HLE.HOS.Kernel.Common;
-using Ryujinx.HLE.HOS.Kernel.Ipc;
-using Ryujinx.HLE.HOS.Kernel.Process;
-using Ryujinx.HLE.HOS.Kernel.Threading;
-using System;
-using System.IO;
-
-namespace Ryujinx.HLE.HOS.Ipc
-{
- static class IpcHandler
- {
- public static KernelResult IpcCall(
- Switch device,
- KProcess process,
- MemoryManager memory,
- KThread thread,
- KClientSession session,
- IpcMessage request,
- long cmdPtr)
- {
- IpcMessage response = new IpcMessage();
-
- using (MemoryStream raw = new MemoryStream(request.RawData))
- {
- BinaryReader reqReader = new BinaryReader(raw);
-
- if (request.Type == IpcMessageType.Request ||
- request.Type == IpcMessageType.RequestWithContext)
- {
- response.Type = IpcMessageType.Response;
-
- using (MemoryStream resMs = new MemoryStream())
- {
- BinaryWriter resWriter = new BinaryWriter(resMs);
-
- ServiceCtx context = new ServiceCtx(
- device,
- process,
- memory,
- thread,
- session,
- request,
- response,
- reqReader,
- resWriter);
-
- session.Service.CallMethod(context);
-
- response.RawData = resMs.ToArray();
- }
- }
- else if (request.Type == IpcMessageType.Control ||
- request.Type == IpcMessageType.ControlWithContext)
- {
- uint magic = (uint)reqReader.ReadUInt64();
- uint cmdId = (uint)reqReader.ReadUInt64();
-
- switch (cmdId)
- {
- case 0:
- {
- request = FillResponse(response, 0, session.Service.ConvertToDomain());
-
- break;
- }
-
- case 3:
- {
- request = FillResponse(response, 0, 0x1000);
-
- break;
- }
-
- // TODO: Whats the difference between IpcDuplicateSession/Ex?
- case 2:
- case 4:
- {
- int unknown = reqReader.ReadInt32();
-
- if (process.HandleTable.GenerateHandle(session, out int handle) != KernelResult.Success)
- {
- throw new InvalidOperationException("Out of handles!");
- }
-
- response.HandleDesc = IpcHandleDesc.MakeMove(handle);
-
- request = FillResponse(response, 0);
-
- break;
- }
-
- default: throw new NotImplementedException(cmdId.ToString());
- }
- }
- else if (request.Type == IpcMessageType.CloseSession)
- {
- // TODO
- return KernelResult.PortRemoteClosed;
- }
- else
- {
- throw new NotImplementedException(request.Type.ToString());
- }
-
- memory.Write((ulong)cmdPtr, response.GetBytes(cmdPtr));
- }
-
- return KernelResult.Success;
- }
-
- private static IpcMessage FillResponse(IpcMessage response, long result, params int[] values)
- {
- using (MemoryStream ms = new MemoryStream())
- {
- BinaryWriter writer = new BinaryWriter(ms);
-
- foreach (int value in values)
- {
- writer.Write(value);
- }
-
- return FillResponse(response, result, ms.ToArray());
- }
- }
-
- private static IpcMessage FillResponse(IpcMessage response, long result, byte[] data = null)
- {
- response.Type = IpcMessageType.Response;
-
- using (MemoryStream ms = new MemoryStream())
- {
- BinaryWriter writer = new BinaryWriter(ms);
-
- writer.Write(IpcMagic.Sfco);
- writer.Write(result);
-
- if (data != null)
- {
- writer.Write(data);
- }
-
- response.RawData = ms.ToArray();
- }
-
- return response;
- }
- }
-}