aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Ipc/IpcMessage.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-10 21:46:42 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-10 21:46:42 -0300
commit76f3b1b3a4637ec72abfbb8cbc0679f2e0ca838f (patch)
tree0411b709de31c1c0517763512df8eeb9f7491bc9 /Ryujinx.Core/OsHle/Ipc/IpcMessage.cs
parent518fe799da6dd4f12c58c9e6e174767effb0b868 (diff)
Rename Ryujinx.Core to Ryujinx.HLE and add a separate project for a future LLE implementation
Diffstat (limited to 'Ryujinx.Core/OsHle/Ipc/IpcMessage.cs')
-rw-r--r--Ryujinx.Core/OsHle/Ipc/IpcMessage.cs215
1 files changed, 0 insertions, 215 deletions
diff --git a/Ryujinx.Core/OsHle/Ipc/IpcMessage.cs b/Ryujinx.Core/OsHle/Ipc/IpcMessage.cs
deleted file mode 100644
index c03874fb..00000000
--- a/Ryujinx.Core/OsHle/Ipc/IpcMessage.cs
+++ /dev/null
@@ -1,215 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-
-namespace Ryujinx.Core.OsHle.Ipc
-{
- class IpcMessage
- {
- public IpcMessageType Type { get; set; }
-
- 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<IpcRecvListBuffDesc> RecvListBuff { get; private set; }
-
- public List<int> ResponseObjIds { get; private set; }
-
- public byte[] RawData { get; set; }
-
- public IpcMessage()
- {
- PtrBuff = new List<IpcPtrBuffDesc>();
- SendBuff = new List<IpcBuffDesc>();
- ReceiveBuff = new List<IpcBuffDesc>();
- ExchangeBuff = new List<IpcBuffDesc>();
- RecvListBuff = new List<IpcRecvListBuffDesc>();
-
- ResponseObjIds = new List<int>();
- }
-
- public IpcMessage(byte[] Data, long CmdPtr) : this()
- {
- using (MemoryStream MS = new MemoryStream(Data))
- {
- BinaryReader Reader = new BinaryReader(MS);
-
- Initialize(Reader, CmdPtr);
- }
- }
-
- private void Initialize(BinaryReader Reader, long CmdPtr)
- {
- int Word0 = Reader.ReadInt32();
- int Word1 = Reader.ReadInt32();
-
- Type = (IpcMessageType)(Word0 & 0xffff);
-
- int PtrBuffCount = (Word0 >> 16) & 0xf;
- int SendBuffCount = (Word0 >> 20) & 0xf;
- int RecvBuffCount = (Word0 >> 24) & 0xf;
- int XchgBuffCount = (Word0 >> 28) & 0xf;
-
- int RawDataSize = (Word1 >> 0) & 0x3ff;
- int RecvListFlags = (Word1 >> 10) & 0xf;
- bool HndDescEnable = ((Word1 >> 31) & 0x1) != 0;
-
- if (HndDescEnable)
- {
- HandleDesc = new IpcHandleDesc(Reader);
- }
-
- for (int Index = 0; Index < PtrBuffCount; Index++)
- {
- PtrBuff.Add(new IpcPtrBuffDesc(Reader));
- }
-
- void ReadBuff(List<IpcBuffDesc> Buff, int Count)
- {
- for (int Index = 0; Index < Count; Index++)
- {
- Buff.Add(new IpcBuffDesc(Reader));
- }
- }
-
- ReadBuff(SendBuff, SendBuffCount);
- ReadBuff(ReceiveBuff, RecvBuffCount);
- ReadBuff(ExchangeBuff, XchgBuffCount);
-
- RawDataSize *= 4;
-
- long RecvListPos = Reader.BaseStream.Position + RawDataSize;
-
- long Pad0 = GetPadSize16(Reader.BaseStream.Position + CmdPtr);
-
- Reader.BaseStream.Seek(Pad0, SeekOrigin.Current);
-
- int RecvListCount = RecvListFlags - 2;
-
- if (RecvListCount == 0)
- {
- RecvListCount = 1;
- }
- else if (RecvListCount < 0)
- {
- RecvListCount = 0;
- }
-
- RawData = Reader.ReadBytes(RawDataSize);
-
- Reader.BaseStream.Seek(RecvListPos, SeekOrigin.Begin);
-
- for (int Index = 0; Index < RecvListCount; Index++)
- {
- RecvListBuff.Add(new IpcRecvListBuffDesc(Reader));
- }
- }
-
- public byte[] GetBytes(long CmdPtr)
- {
- using (MemoryStream MS = new MemoryStream())
- {
- BinaryWriter Writer = new BinaryWriter(MS);
-
- int Word0;
- int Word1;
-
- Word0 = (int)Type;
- Word0 |= (PtrBuff.Count & 0xf) << 16;
- Word0 |= (SendBuff.Count & 0xf) << 20;
- Word0 |= (ReceiveBuff.Count & 0xf) << 24;
- Word0 |= (ExchangeBuff.Count & 0xf) << 28;
-
- byte[] HandleData = new byte[0];
-
- if (HandleDesc != null)
- {
- HandleData = HandleDesc.GetBytes();
- }
-
- int DataLength = RawData?.Length ?? 0;
-
- int Pad0 = (int)GetPadSize16(CmdPtr + 8 + HandleData.Length);
-
- //Apparently, padding after Raw Data is 16 bytes, however when there is
- //padding before Raw Data too, we need to subtract the size of this padding.
- //This is the weirdest padding I've seen so far...
- int Pad1 = 0x10 - Pad0;
-
- DataLength = (DataLength + Pad0 + Pad1) / 4;
-
- Word1 = DataLength & 0x3ff;
-
- if (HandleDesc != null)
- {
- Word1 |= 1 << 31;
- }
-
- Writer.Write(Word0);
- Writer.Write(Word1);
- Writer.Write(HandleData);
-
- MS.Seek(Pad0, SeekOrigin.Current);
-
- if (RawData != null)
- {
- Writer.Write(RawData);
- }
-
- Writer.Write(new byte[Pad1]);
-
- return MS.ToArray();
- }
- }
-
- private long GetPadSize16(long Position)
- {
- if ((Position & 0xf) != 0)
- {
- return 0x10 - (Position & 0xf);
- }
-
- return 0;
- }
-
- public (long Position, long Size) GetBufferType0x21()
- {
- if (PtrBuff.Count != 0 &&
- PtrBuff[0].Position != 0 &&
- PtrBuff[0].Size != 0)
- {
- return (PtrBuff[0].Position, PtrBuff[0].Size);
- }
-
- if (SendBuff.Count != 0 &&
- SendBuff[0].Position != 0 &&
- SendBuff[0].Size != 0)
- {
- return (SendBuff[0].Position, SendBuff[0].Size);
- }
-
- return (0, 0);
- }
-
- public (long Position, long Size) GetBufferType0x22()
- {
- if (RecvListBuff.Count != 0 &&
- RecvListBuff[0].Position != 0 &&
- RecvListBuff[0].Size != 0)
- {
- return (RecvListBuff[0].Position, RecvListBuff[0].Size);
- }
-
- if (ReceiveBuff.Count != 0 &&
- ReceiveBuff[0].Position != 0 &&
- ReceiveBuff[0].Size != 0)
- {
- return (ReceiveBuff[0].Position, ReceiveBuff[0].Size);
- }
-
- return (0, 0);
- }
- }
-}