diff options
Diffstat (limited to 'Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs')
-rw-r--r-- | Ryujinx.Horizon/Sdk/Sf/Cmif/CmifMessage.cs | 81 |
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 |