aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/ServerBase.cs
diff options
context:
space:
mode:
authorMary <me@thog.eu>2021-04-14 00:01:24 +0200
committerGitHub <noreply@github.com>2021-04-14 00:01:24 +0200
commit0746b83edf49d1fd668dd337264e942f361b675c (patch)
tree37b71396036206252cdc42715d6a3046ee81c795 /Ryujinx.HLE/HOS/Services/ServerBase.cs
parentfaa654dbaf7cd5262c78c0961a5aa72b1ce8ac33 (diff)
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
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/ServerBase.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/ServerBase.cs41
1 files changed, 33 insertions, 8 deletions
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())
{