diff options
author | Mary <me@thog.eu> | 2021-04-14 00:01:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-14 00:01:24 +0200 |
commit | 0746b83edf49d1fd668dd337264e942f361b675c (patch) | |
tree | 37b71396036206252cdc42715d6a3046ee81c795 /Ryujinx.HLE/HOS/Services/ServerBase.cs | |
parent | faa654dbaf7cd5262c78c0961a5aa72b1ce8ac33 (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.cs | 41 |
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()) { |