ryujinx/Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs
gdkchan cf6cd71488
IPC refactor part 2: Use ReplyAndReceive on HLE services and remove special handling from kernel (#1458)
* IPC refactor part 2: Use ReplyAndReceive on HLE services and remove special handling from kernel

* Fix for applet transfer memory + some nits

* Keep handles if possible to avoid server handle table exhaustion

* Fix IPC ZeroFill bug

* am: Correctly implement CreateManagedDisplayLayer and implement CreateManagedDisplaySeparableLayer

CreateManagedDisplaySeparableLayer is requires since 10.x+ when appletResourceUserId != 0

* Make it exit properly

* Make ServiceNotImplementedException show the full message again

* Allow yielding execution to avoid starving other threads

* Only wait if active

* Merge IVirtualMemoryManager and IAddressSpaceManager

* Fix Ro loading data from the wrong process

Co-authored-by: Thog <me@thog.eu>
2020-12-02 00:23:43 +01:00

53 lines
1.3 KiB
C#

using System.IO;
namespace Ryujinx.HLE.HOS.Ipc
{
struct IpcPtrBuffDesc
{
public long Position { get; private set; }
public int Index { get; private set; }
public long Size { get; private set; }
public IpcPtrBuffDesc(long position, int index, long size)
{
Position = position;
Index = index;
Size = size;
}
public IpcPtrBuffDesc(BinaryReader reader)
{
long word0 = reader.ReadUInt32();
long word1 = reader.ReadUInt32();
Position = word1;
Position |= (word0 << 20) & 0x0f00000000;
Position |= (word0 << 30) & 0x7000000000;
Index = ((int)word0 >> 0) & 0x03f;
Index |= ((int)word0 >> 3) & 0x1c0;
Size = (ushort)(word0 >> 16);
}
public uint GetWord0()
{
uint word0;
word0 = (uint)((Position & 0x0f00000000) >> 20);
word0 |= (uint)((Position & 0x7000000000) >> 30);
word0 |= (uint)(Index & 0x03f) << 0;
word0 |= (uint)(Index & 0x1c0) << 3;
word0 |= (uint)Size << 16;
return word0;
}
public uint GetWord1()
{
return (uint)Position;
}
}
}