aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/ServiceUtil.cs
blob: fe6fcce157b69d5084b2441560b540ee10401dc2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Sdk.Sf.Cmif;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
using System;

namespace Ryujinx.Horizon.Sdk
{
    static class ServiceUtil
    {
        public static Result SendRequest(out CmifResponse response, int sessionHandle, uint requestId, bool sendPid, scoped ReadOnlySpan<byte> data)
        {
            ulong tlsAddress = HorizonStatic.ThreadContext.TlsAddress;
            int   tlsSize    = Api.TlsMessageBufferSize;

            using (var tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize))
            {
                CmifRequest request = CmifMessage.CreateRequest(tlsRegion.Memory.Span, new CmifRequestFormat()
                {
                    DataSize  = data.Length,
                    RequestId = requestId,
                    SendPid   = sendPid
                });

                data.CopyTo(request.Data);
            }

            Result result = HorizonStatic.Syscall.SendSyncRequest(sessionHandle);

            if (result.IsFailure)
            {
                response = default;

                return result;
            }

            return CmifMessage.ParseResponse(out response, HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize).Memory.Span, false, 0);
        }
    }
}