ISystemClock.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Ryujinx.Common;
  2. using Ryujinx.HLE.HOS.Services.Time.Clock;
  3. namespace Ryujinx.HLE.HOS.Services.Time
  4. {
  5. class ISystemClock : IpcService
  6. {
  7. private SystemClockCore _clockCore;
  8. private bool _writePermission;
  9. public ISystemClock(SystemClockCore clockCore, bool writePermission)
  10. {
  11. _clockCore = clockCore;
  12. _writePermission = writePermission;
  13. }
  14. [Command(0)]
  15. // GetCurrentTime() -> nn::time::PosixTime
  16. public ResultCode GetCurrentTime(ServiceCtx context)
  17. {
  18. SteadyClockCore steadyClockCore = _clockCore.GetSteadyClockCore();
  19. SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(context.Thread);
  20. ResultCode result = _clockCore.GetSystemClockContext(context.Thread, out SystemClockContext clockContext);
  21. if (result == ResultCode.Success)
  22. {
  23. result = ResultCode.TimeMismatch;
  24. if (currentTimePoint.ClockSourceId == clockContext.SteadyTimePoint.ClockSourceId)
  25. {
  26. long posixTime = clockContext.Offset + currentTimePoint.TimePoint;
  27. context.ResponseData.Write(posixTime);
  28. result = 0;
  29. }
  30. }
  31. return result;
  32. }
  33. [Command(1)]
  34. // SetCurrentTime(nn::time::PosixTime)
  35. public ResultCode SetCurrentTime(ServiceCtx context)
  36. {
  37. if (!_writePermission)
  38. {
  39. return ResultCode.PermissionDenied;
  40. }
  41. long posixTime = context.RequestData.ReadInt64();
  42. SteadyClockCore steadyClockCore = _clockCore.GetSteadyClockCore();
  43. SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(context.Thread);
  44. SystemClockContext clockContext = new SystemClockContext()
  45. {
  46. Offset = posixTime - currentTimePoint.TimePoint,
  47. SteadyTimePoint = currentTimePoint
  48. };
  49. ResultCode result = _clockCore.SetSystemClockContext(clockContext);
  50. if (result == ResultCode.Success)
  51. {
  52. result = _clockCore.Flush(clockContext);
  53. }
  54. return result;
  55. }
  56. [Command(2)]
  57. // GetSystemClockContext() -> nn::time::SystemClockContext
  58. public ResultCode GetSystemClockContext(ServiceCtx context)
  59. {
  60. ResultCode result = _clockCore.GetSystemClockContext(context.Thread, out SystemClockContext clockContext);
  61. if (result == ResultCode.Success)
  62. {
  63. context.ResponseData.WriteStruct(clockContext);
  64. }
  65. return result;
  66. }
  67. [Command(3)]
  68. // SetSystemClockContext(nn::time::SystemClockContext)
  69. public ResultCode SetSystemClockContext(ServiceCtx context)
  70. {
  71. if (!_writePermission)
  72. {
  73. return ResultCode.PermissionDenied;
  74. }
  75. SystemClockContext clockContext = context.RequestData.ReadStruct<SystemClockContext>();
  76. ResultCode result = _clockCore.SetSystemClockContext(clockContext);
  77. if (result == ResultCode.Success)
  78. {
  79. result = _clockCore.Flush(clockContext);
  80. }
  81. return result;
  82. }
  83. }
  84. }