aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs')
-rw-r--r--Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs81
1 files changed, 44 insertions, 37 deletions
diff --git a/Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs b/Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs
index 781452e3..0d23d33b 100644
--- a/Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs
+++ b/Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
{
static class CmifMessage
{
- public const uint CmifInHeaderMagic = 0x49434653; // SFCI
+ public const uint CmifInHeaderMagic = 0x49434653; // SFCI
public const uint CmifOutHeaderMagic = 0x4f434653; // SFCO
public static CmifRequest CreateRequest(Span<byte> output, CmifRequestFormat format)
@@ -21,27 +21,31 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
}
totalSize += Unsafe.SizeOf<CmifInHeader>() + format.DataSize;
- totalSize = (totalSize + 1) & ~1;
+ totalSize = (totalSize + 1) & ~1;
+
int outPointerSizeTableOffset = totalSize;
- int outPointerSizeTableSize = format.OutAutoBuffersCount + format.OutPointersCount;
+ int outPointerSizeTableSize = format.OutAutoBuffersCount + format.OutPointersCount;
+
totalSize += sizeof(ushort) * outPointerSizeTableSize;
- int rawDataSizeInWords = (totalSize + sizeof(uint) - 1) / sizeof(uint);
- CmifRequest request = new CmifRequest();
+ int rawDataSizeInWords = (totalSize + sizeof(uint) - 1) / sizeof(uint);
- request.Hipc = HipcMessage.WriteMessage(output, new HipcMetadata()
+ CmifRequest request = new()
{
- Type = format.Context != 0 ? (int)CommandType.RequestWithContext : (int)CommandType.Request,
- SendStaticsCount = format.InAutoBuffersCount + format.InPointersCount,
- SendBuffersCount = format.InAutoBuffersCount + format.InBuffersCount,
- ReceiveBuffersCount = format.OutAutoBuffersCount + format.OutBuffersCount,
- ExchangeBuffersCount = format.InOutBuffersCount,
- DataWordsCount = rawDataSizeInWords,
- ReceiveStaticsCount = outPointerSizeTableSize + format.OutFixedPointersCount,
- SendPid = format.SendPid,
- CopyHandlesCount = format.HandlesCount,
- MoveHandlesCount = 0
- });
+ Hipc = HipcMessage.WriteMessage(output, new HipcMetadata()
+ {
+ Type = format.Context != 0 ? (int)CommandType.RequestWithContext : (int)CommandType.Request,
+ SendStaticsCount = format.InAutoBuffersCount + format.InPointersCount,
+ SendBuffersCount = format.InAutoBuffersCount + format.InBuffersCount,
+ ReceiveBuffersCount = format.OutAutoBuffersCount + format.OutBuffersCount,
+ ExchangeBuffersCount = format.InOutBuffersCount,
+ DataWordsCount = rawDataSizeInWords,
+ ReceiveStaticsCount = outPointerSizeTableSize + format.OutFixedPointersCount,
+ SendPid = format.SendPid,
+ CopyHandlesCount = format.HandlesCount,
+ MoveHandlesCount = 0
+ })
+ };
Span<uint> data = request.Hipc.DataWords;
@@ -53,35 +57,36 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
domainHeader = new CmifDomainInHeader()
{
- Type = CmifDomainRequestType.SendMessage,
+ Type = CmifDomainRequestType.SendMessage,
ObjectsCount = (byte)format.ObjectsCount,
- DataSize = (ushort)payloadSize,
- ObjectId = format.ObjectId,
- Padding = 0,
- Token = format.Context
+ DataSize = (ushort)payloadSize,
+ ObjectId = format.ObjectId,
+ Padding = 0,
+ Token = format.Context
};
- data = data.Slice(Unsafe.SizeOf<CmifDomainInHeader>() / sizeof(uint));
+ data = data[(Unsafe.SizeOf<CmifDomainInHeader>() / sizeof(uint))..];
- request.Objects = data.Slice((payloadSize + sizeof(uint) - 1) / sizeof(uint));
+ request.Objects = data[((payloadSize + sizeof(uint) - 1) / sizeof(uint))..];
}
ref CmifInHeader header = ref MemoryMarshal.Cast<uint, CmifInHeader>(data)[0];
header = new CmifInHeader()
{
- Magic = CmifInHeaderMagic,
- Version = format.Context != 0 ? 1u : 0u,
+ Magic = CmifInHeaderMagic,
+ Version = format.Context != 0 ? 1u : 0u,
CommandId = format.RequestId,
- Token = format.ObjectId != 0 ? 0u : format.Context
+ Token = format.ObjectId != 0 ? 0u : format.Context
};
- request.Data = MemoryMarshal.Cast<uint, byte>(data).Slice(Unsafe.SizeOf<CmifInHeader>());
+ request.Data = MemoryMarshal.Cast<uint, byte>(data)[Unsafe.SizeOf<CmifInHeader>()..];
int paddingSizeBefore = (rawDataSizeInWords - request.Hipc.DataWords.Length) * sizeof(uint);
- Span<byte> outPointerTable = MemoryMarshal.Cast<uint, byte>(request.Hipc.DataWords).Slice(outPointerSizeTableOffset - paddingSizeBefore);
- request.OutPointerSizes = MemoryMarshal.Cast<byte, ushort>(outPointerTable);
+ Span<byte> outPointerTable = MemoryMarshal.Cast<uint, byte>(request.Hipc.DataWords)[(outPointerSizeTableOffset - paddingSizeBefore)..];
+
+ request.OutPointerSizes = MemoryMarshal.Cast<byte, ushort>(outPointerTable);
request.ServerPointerSize = format.ServerPointerSize;
return request;
@@ -89,15 +94,15 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
public static Result ParseResponse(out CmifResponse response, Span<byte> input, bool isDomain, int size)
{
- HipcMessage responseMessage = new HipcMessage(input);
+ HipcMessage responseMessage = new(input);
- Span<byte> data = MemoryMarshal.Cast<uint, byte>(responseMessage.Data.DataWords);
+ Span<byte> data = MemoryMarshal.Cast<uint, byte>(responseMessage.Data.DataWords);
Span<uint> objects = Span<uint>.Empty;
if (isDomain)
{
- data = data.Slice(Unsafe.SizeOf<CmifDomainOutHeader>());
- objects = MemoryMarshal.Cast<byte, uint>(data.Slice(Unsafe.SizeOf<CmifOutHeader>() + size));
+ data = data[Unsafe.SizeOf<CmifDomainOutHeader>()..];
+ objects = MemoryMarshal.Cast<byte, uint>(data[(Unsafe.SizeOf<CmifOutHeader>() + size)..]);
}
CmifOutHeader header = MemoryMarshal.Cast<byte, CmifOutHeader>(data)[0];
@@ -105,19 +110,21 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
if (header.Magic != CmifOutHeaderMagic)
{
response = default;
+
return SfResult.InvalidOutHeader;
}
if (header.Result.IsFailure)
{
response = default;
+
return header.Result;
}
response = new CmifResponse()
{
- Data = data.Slice(Unsafe.SizeOf<CmifOutHeader>()),
- Objects = objects,
+ Data = data[Unsafe.SizeOf<CmifOutHeader>()..],
+ Objects = objects,
CopyHandles = responseMessage.Data.CopyHandles,
MoveHandles = responseMessage.Data.MoveHandles
};
@@ -125,4 +132,4 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
return Result.Success;
}
}
-}
+} \ No newline at end of file