Api.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Ryujinx.Horizon.Common;
  2. using System;
  3. namespace Ryujinx.Horizon.Sdk.Sf.Hipc
  4. {
  5. static class Api
  6. {
  7. public const int TlsMessageBufferSize = 0x100;
  8. public static Result Receive(out ReceiveResult recvResult, int sessionHandle, Span<byte> messageBuffer)
  9. {
  10. Result result = ReceiveImpl(sessionHandle, messageBuffer);
  11. if (result == KernelResult.PortRemoteClosed)
  12. {
  13. recvResult = ReceiveResult.Closed;
  14. return Result.Success;
  15. }
  16. else if (result == KernelResult.ReceiveListBroken)
  17. {
  18. recvResult = ReceiveResult.NeedsRetry;
  19. return Result.Success;
  20. }
  21. recvResult = ReceiveResult.Success;
  22. return result;
  23. }
  24. private static Result ReceiveImpl(int sessionHandle, Span<byte> messageBuffer)
  25. {
  26. Span<int> handles = stackalloc int[1];
  27. handles[0] = sessionHandle;
  28. var tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize);
  29. if (messageBuffer == tlsSpan)
  30. {
  31. return HorizonStatic.Syscall.ReplyAndReceive(out _, handles, 0, -1L);
  32. }
  33. else
  34. {
  35. throw new NotImplementedException();
  36. }
  37. }
  38. public static Result Reply(int sessionHandle, ReadOnlySpan<byte> messageBuffer)
  39. {
  40. Result result = ReplyImpl(sessionHandle, messageBuffer);
  41. result.AbortUnless(KernelResult.TimedOut, KernelResult.PortRemoteClosed);
  42. return Result.Success;
  43. }
  44. private static Result ReplyImpl(int sessionHandle, ReadOnlySpan<byte> messageBuffer)
  45. {
  46. var tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize);
  47. if (messageBuffer == tlsSpan)
  48. {
  49. return HorizonStatic.Syscall.ReplyAndReceive(out _, ReadOnlySpan<int>.Empty, sessionHandle, 0);
  50. }
  51. else
  52. {
  53. throw new NotImplementedException();
  54. }
  55. }
  56. public static Result CreateSession(out int serverHandle, out int clientHandle)
  57. {
  58. Result result = HorizonStatic.Syscall.CreateSession(out serverHandle, out clientHandle, false, null);
  59. if (result == KernelResult.OutOfResource)
  60. {
  61. return HipcResult.OutOfSessions;
  62. }
  63. return result;
  64. }
  65. }
  66. }