From 0746b83edf49d1fd668dd337264e942f361b675c Mon Sep 17 00:00:00 2001
From: Mary <me@thog.eu>
Date: Wed, 14 Apr 2021 00:01:24 +0200
Subject: Initial support for the new 12.x IPC system (#2182)

* Rename CommandAttribute as CommandHIpcAttribute to prepare for 12.x changes

* Implement inital support for TIPC and adds SM command ids

* *Ipc to *ipc

* Missed a ref in last commit...

* CommandAttributeTIpc to CommandAttributeTipc

* Addresses comment and fixes some bugs around

TIPC doesn't have any padding requirements as buffer C isn't a thing
Fix for RegisterService inverting two argument only on TIPC
---
 Ryujinx.HLE/HOS/Services/ServerBase.cs | 41 +++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 8 deletions(-)

(limited to 'Ryujinx.HLE/HOS/Services/ServerBase.cs')

diff --git a/Ryujinx.HLE/HOS/Services/ServerBase.cs b/Ryujinx.HLE/HOS/Services/ServerBase.cs
index 3161e689..bf638800 100644
--- a/Ryujinx.HLE/HOS/Services/ServerBase.cs
+++ b/Ryujinx.HLE/HOS/Services/ServerBase.cs
@@ -196,10 +196,10 @@ namespace Ryujinx.HLE.HOS.Services
             {
                 BinaryReader reqReader = new BinaryReader(raw);
 
-                if (request.Type == IpcMessageType.Request ||
-                    request.Type == IpcMessageType.RequestWithContext)
+                if (request.Type == IpcMessageType.HipcRequest ||
+                    request.Type == IpcMessageType.HipcRequestWithContext)
                 {
-                    response.Type = IpcMessageType.Response;
+                    response.Type = IpcMessageType.HipcResponse;
 
                     using (MemoryStream resMs = new MemoryStream())
                     {
@@ -215,13 +215,13 @@ namespace Ryujinx.HLE.HOS.Services
                             reqReader,
                             resWriter);
 
-                        _sessions[serverSessionHandle].CallMethod(context);
+                        _sessions[serverSessionHandle].CallHipcMethod(context);
 
                         response.RawData = resMs.ToArray();
                     }
                 }
-                else if (request.Type == IpcMessageType.Control ||
-                         request.Type == IpcMessageType.ControlWithContext)
+                else if (request.Type == IpcMessageType.HipcControl ||
+                         request.Type == IpcMessageType.HipcControlWithContext)
                 {
                     uint magic = (uint)reqReader.ReadUInt64();
                     uint cmdId = (uint)reqReader.ReadUInt64();
@@ -254,7 +254,7 @@ namespace Ryujinx.HLE.HOS.Services
                         default: throw new NotImplementedException(cmdId.ToString());
                     }
                 }
-                else if (request.Type == IpcMessageType.CloseSession)
+                else if (request.Type == IpcMessageType.HipcCloseSession || request.Type == IpcMessageType.TipcCloseSession)
                 {
                     _context.Syscall.CloseHandle(serverSessionHandle);
                     _sessionHandles.Remove(serverSessionHandle);
@@ -266,6 +266,31 @@ namespace Ryujinx.HLE.HOS.Services
                     _sessions.Remove(serverSessionHandle);
                     shouldReply = false;
                 }
+                // If the type is past 0xF, we are using TIPC
+                else if (request.Type > IpcMessageType.TipcCloseSession)
+                {
+                    // Response type is always the same as request on TIPC.
+                    response.Type = request.Type;
+
+                    using (MemoryStream resMs = new MemoryStream())
+                    {
+                        BinaryWriter resWriter = new BinaryWriter(resMs);
+
+                        ServiceCtx context = new ServiceCtx(
+                            _context.Device,
+                            process,
+                            process.CpuMemory,
+                            thread,
+                            request,
+                            response,
+                            reqReader,
+                            resWriter);
+
+                        _sessions[serverSessionHandle].CallTipcMethod(context);
+
+                        response.RawData = resMs.ToArray();
+                    }
+                }
                 else
                 {
                     throw new NotImplementedException(request.Type.ToString());
@@ -293,7 +318,7 @@ namespace Ryujinx.HLE.HOS.Services
 
         private static IpcMessage FillResponse(IpcMessage response, long result, byte[] data = null)
         {
-            response.Type = IpcMessageType.Response;
+            response.Type = IpcMessageType.HipcResponse;
 
             using (MemoryStream ms = new MemoryStream())
             {
-- 
cgit v1.2.3-70-g09d2