diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Ipc')
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcBuffDesc.cs | 12 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs | 2 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcMagic.cs | 2 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs | 142 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcMessageType.cs | 12 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs | 18 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/IpcRecvListBuffDesc.cs | 6 | ||||
-rw-r--r-- | src/Ryujinx.HLE/HOS/Ipc/ServiceProcessRequest.cs | 2 |
8 files changed, 96 insertions, 100 deletions
diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcBuffDesc.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcBuffDesc.cs index b61d5697..aa917435 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcBuffDesc.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcBuffDesc.cs @@ -5,8 +5,8 @@ namespace Ryujinx.HLE.HOS.Ipc struct IpcBuffDesc { public ulong Position { get; private set; } - public ulong Size { get; private set; } - public byte Flags { get; private set; } + public ulong Size { get; private set; } + public byte Flags { get; private set; } public IpcBuffDesc(BinaryReader reader) { @@ -14,14 +14,14 @@ namespace Ryujinx.HLE.HOS.Ipc ulong word1 = reader.ReadUInt32(); ulong word2 = reader.ReadUInt32(); - Position = word1; - Position |= (word2 << 4) & 0x0f00000000; + Position = word1; + Position |= (word2 << 4) & 0x0f00000000; Position |= (word2 << 34) & 0x7000000000; - Size = word0; + Size = word0; Size |= (word2 << 8) & 0xf00000000; Flags = (byte)(word2 & 3); } } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs index c7ef7e9c..887fe28e 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs @@ -90,4 +90,4 @@ namespace Ryujinx.HLE.HOS.Ipc return ms; } } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcMagic.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcMagic.cs index 72770b90..05d60907 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcMagic.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcMagic.cs @@ -5,4 +5,4 @@ namespace Ryujinx.HLE.HOS.Ipc public const long Sfci = 'S' << 0 | 'F' << 8 | 'C' << 16 | 'I' << 24; public const long Sfco = 'S' << 0 | 'F' << 8 | 'C' << 16 | 'O' << 24; } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs index 21630c42..feba09fe 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs @@ -2,7 +2,6 @@ using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Memory; using System; -using System.Buffers; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -15,10 +14,10 @@ namespace Ryujinx.HLE.HOS.Ipc public IpcHandleDesc HandleDesc { get; set; } - public List<IpcPtrBuffDesc> PtrBuff { get; private set; } - public List<IpcBuffDesc> SendBuff { get; private set; } - public List<IpcBuffDesc> ReceiveBuff { get; private set; } - public List<IpcBuffDesc> ExchangeBuff { get; private set; } + public List<IpcPtrBuffDesc> PtrBuff { get; private set; } + public List<IpcBuffDesc> SendBuff { get; private set; } + public List<IpcBuffDesc> ReceiveBuff { get; private set; } + public List<IpcBuffDesc> ExchangeBuff { get; private set; } public List<IpcRecvListBuffDesc> RecvListBuff { get; private set; } public List<int> ObjectIds { get; private set; } @@ -27,9 +26,9 @@ namespace Ryujinx.HLE.HOS.Ipc public IpcMessage() { - PtrBuff = new List<IpcPtrBuffDesc>(0); - SendBuff = new List<IpcBuffDesc>(0); - ReceiveBuff = new List<IpcBuffDesc>(0); + PtrBuff = new List<IpcPtrBuffDesc>(0); + SendBuff = new List<IpcBuffDesc>(0); + ReceiveBuff = new List<IpcBuffDesc>(0); ExchangeBuff = new List<IpcBuffDesc>(0); RecvListBuff = new List<IpcRecvListBuffDesc>(0); @@ -38,93 +37,92 @@ namespace Ryujinx.HLE.HOS.Ipc public IpcMessage(ReadOnlySpan<byte> data, long cmdPtr) { - using (RecyclableMemoryStream ms = MemoryStreamManager.Shared.GetStream(data)) - { - BinaryReader reader = new BinaryReader(ms); + using RecyclableMemoryStream ms = MemoryStreamManager.Shared.GetStream(data); - int word0 = reader.ReadInt32(); - int word1 = reader.ReadInt32(); + BinaryReader reader = new(ms); - Type = (IpcMessageType)(word0 & 0xffff); + int word0 = reader.ReadInt32(); + int word1 = reader.ReadInt32(); - int ptrBuffCount = (word0 >> 16) & 0xf; - int sendBuffCount = (word0 >> 20) & 0xf; - int recvBuffCount = (word0 >> 24) & 0xf; - int xchgBuffCount = (word0 >> 28) & 0xf; + Type = (IpcMessageType)(word0 & 0xffff); - int rawDataSize = (word1 >> 0) & 0x3ff; - int recvListFlags = (word1 >> 10) & 0xf; - bool hndDescEnable = ((word1 >> 31) & 0x1) != 0; + int ptrBuffCount = (word0 >> 16) & 0xf; + int sendBuffCount = (word0 >> 20) & 0xf; + int recvBuffCount = (word0 >> 24) & 0xf; + int xchgBuffCount = (word0 >> 28) & 0xf; - if (hndDescEnable) - { - HandleDesc = new IpcHandleDesc(reader); - } + int rawDataSize = (word1 >> 0) & 0x3ff; + int recvListFlags = (word1 >> 10) & 0xf; + bool hndDescEnable = ((word1 >> 31) & 0x1) != 0; - PtrBuff = new List<IpcPtrBuffDesc>(ptrBuffCount); + if (hndDescEnable) + { + HandleDesc = new IpcHandleDesc(reader); + } - for (int index = 0; index < ptrBuffCount; index++) - { - PtrBuff.Add(new IpcPtrBuffDesc(reader)); - } + PtrBuff = new List<IpcPtrBuffDesc>(ptrBuffCount); - static List<IpcBuffDesc> ReadBuff(BinaryReader reader, int count) + for (int index = 0; index < ptrBuffCount; index++) + { + PtrBuff.Add(new IpcPtrBuffDesc(reader)); + } + + static List<IpcBuffDesc> ReadBuff(BinaryReader reader, int count) + { + List<IpcBuffDesc> buff = new(count); + + for (int index = 0; index < count; index++) { - List<IpcBuffDesc> buff = new List<IpcBuffDesc>(count); - - for (int index = 0; index < count; index++) - { - buff.Add(new IpcBuffDesc(reader)); - } - - return buff; + buff.Add(new IpcBuffDesc(reader)); } - SendBuff = ReadBuff(reader, sendBuffCount); - ReceiveBuff = ReadBuff(reader, recvBuffCount); - ExchangeBuff = ReadBuff(reader, xchgBuffCount); + return buff; + } + + SendBuff = ReadBuff(reader, sendBuffCount); + ReceiveBuff = ReadBuff(reader, recvBuffCount); + ExchangeBuff = ReadBuff(reader, xchgBuffCount); - rawDataSize *= 4; + rawDataSize *= 4; - long recvListPos = reader.BaseStream.Position + rawDataSize; + long recvListPos = reader.BaseStream.Position + rawDataSize; // Only CMIF has the padding requirements. if (Type < IpcMessageType.TipcCloseSession) { long pad0 = GetPadSize16(reader.BaseStream.Position + cmdPtr); - if (rawDataSize != 0) - { - rawDataSize -= (int)pad0; - } - - reader.BaseStream.Seek(pad0, SeekOrigin.Current); + if (rawDataSize != 0) + { + rawDataSize -= (int)pad0; } - int recvListCount = recvListFlags - 2; + reader.BaseStream.Seek(pad0, SeekOrigin.Current); + } - if (recvListCount == 0) - { - recvListCount = 1; - } - else if (recvListCount < 0) - { - recvListCount = 0; - } + int recvListCount = recvListFlags - 2; - RawData = reader.ReadBytes(rawDataSize); + if (recvListCount == 0) + { + recvListCount = 1; + } + else if (recvListCount < 0) + { + recvListCount = 0; + } - reader.BaseStream.Seek(recvListPos, SeekOrigin.Begin); + RawData = reader.ReadBytes(rawDataSize); - RecvListBuff = new List<IpcRecvListBuffDesc>(recvListCount); + reader.BaseStream.Seek(recvListPos, SeekOrigin.Begin); - for (int index = 0; index < recvListCount; index++) - { - RecvListBuff.Add(new IpcRecvListBuffDesc(reader.ReadUInt64())); - } + RecvListBuff = new List<IpcRecvListBuffDesc>(recvListCount); - ObjectIds = new List<int>(0); + for (int index = 0; index < recvListCount; index++) + { + RecvListBuff.Add(new IpcRecvListBuffDesc(reader.ReadUInt64())); } + + ObjectIds = new List<int>(0); } public RecyclableMemoryStream GetStream(long cmdPtr, ulong recvListAddr) @@ -134,10 +132,10 @@ namespace Ryujinx.HLE.HOS.Ipc int word0; int word1; - word0 = (int)Type; - word0 |= (PtrBuff.Count & 0xf) << 16; - word0 |= (SendBuff.Count & 0xf) << 20; - word0 |= (ReceiveBuff.Count & 0xf) << 24; + word0 = (int)Type; + word0 |= (PtrBuff.Count & 0xf) << 16; + word0 |= (SendBuff.Count & 0xf) << 20; + word0 |= (ReceiveBuff.Count & 0xf) << 24; word0 |= (ExchangeBuff.Count & 0xf) << 28; using RecyclableMemoryStream handleDataStream = HandleDesc?.GetStream(); @@ -238,7 +236,7 @@ namespace Ryujinx.HLE.HOS.Ipc return ms; } - private long GetPadSize16(long position) + private static long GetPadSize16(long position) { if ((position & 0xf) != 0) { diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcMessageType.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcMessageType.cs index 1c862248..1391569c 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcMessageType.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcMessageType.cs @@ -2,12 +2,12 @@ namespace Ryujinx.HLE.HOS.Ipc { enum IpcMessageType { - CmifResponse = 0, - CmifCloseSession = 2, - CmifRequest = 4, - CmifControl = 5, + CmifResponse = 0, + CmifCloseSession = 2, + CmifRequest = 4, + CmifControl = 5, CmifRequestWithContext = 6, CmifControlWithContext = 7, - TipcCloseSession = 0xF + TipcCloseSession = 0xF, } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs index 05798fe1..7ea2af0a 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs @@ -5,8 +5,8 @@ namespace Ryujinx.HLE.HOS.Ipc struct IpcPtrBuffDesc { public ulong Position { get; private set; } - public uint Index { get; private set; } - public ulong Size { get; private set; } + public uint Index { get; private set; } + public ulong Size { get; private set; } public IpcPtrBuffDesc(ulong position, uint index, ulong size) { @@ -20,26 +20,26 @@ namespace Ryujinx.HLE.HOS.Ipc ulong word0 = reader.ReadUInt32(); ulong word1 = reader.ReadUInt32(); - Position = word1; + Position = word1; Position |= (word0 << 20) & 0x0f00000000; Position |= (word0 << 30) & 0x7000000000; - Index = ((uint)word0 >> 0) & 0x03f; + Index = ((uint)word0 >> 0) & 0x03f; Index |= ((uint)word0 >> 3) & 0x1c0; Size = (ushort)(word0 >> 16); } - public IpcPtrBuffDesc WithSize(ulong size) + public readonly IpcPtrBuffDesc WithSize(ulong size) { return new IpcPtrBuffDesc(Position, Index, size); } - public uint GetWord0() + public readonly uint GetWord0() { uint word0; - word0 = (uint)((Position & 0x0f00000000) >> 20); + word0 = (uint)((Position & 0x0f00000000) >> 20); word0 |= (uint)((Position & 0x7000000000) >> 30); word0 |= (Index & 0x03f) << 0; @@ -50,9 +50,9 @@ namespace Ryujinx.HLE.HOS.Ipc return word0; } - public uint GetWord1() + public readonly uint GetWord1() { return (uint)Position; } } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcRecvListBuffDesc.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcRecvListBuffDesc.cs index bcc9d8f8..f74f81c7 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcRecvListBuffDesc.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcRecvListBuffDesc.cs @@ -1,11 +1,9 @@ -using System.IO; - namespace Ryujinx.HLE.HOS.Ipc { struct IpcRecvListBuffDesc { public ulong Position { get; private set; } - public ulong Size { get; private set; } + public ulong Size { get; private set; } public IpcRecvListBuffDesc(ulong position, ulong size) { @@ -20,4 +18,4 @@ namespace Ryujinx.HLE.HOS.Ipc Size = (ushort)(packedValue >> 48); } } -}
\ No newline at end of file +} diff --git a/src/Ryujinx.HLE/HOS/Ipc/ServiceProcessRequest.cs b/src/Ryujinx.HLE/HOS/Ipc/ServiceProcessRequest.cs index b3aaa219..556b3df4 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/ServiceProcessRequest.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/ServiceProcessRequest.cs @@ -1,4 +1,4 @@ namespace Ryujinx.HLE.HOS.Ipc { delegate long ServiceProcessRequest(ServiceCtx context); -}
\ No newline at end of file +} |