From 3db9daa3bda5053fdbda248263f0b8fa46bdba0d Mon Sep 17 00:00:00 2001 From: Ac_K Date: Mon, 17 Jun 2019 01:56:46 +0200 Subject: time: Implement GetSharedMemoryNativeHandle (#705) - Implement Time SharedMemory - Implement GetSharedMemoryNativeHandle - Cleanup IStaticService --- Ryujinx.HLE/HOS/Services/Time/IStaticService.cs | 51 ++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) (limited to 'Ryujinx.HLE/HOS/Services/Time') diff --git a/Ryujinx.HLE/HOS/Services/Time/IStaticService.cs b/Ryujinx.HLE/HOS/Services/Time/IStaticService.cs index fcbaa492..107d0578 100644 --- a/Ryujinx.HLE/HOS/Services/Time/IStaticService.cs +++ b/Ryujinx.HLE/HOS/Services/Time/IStaticService.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Ipc; +using Ryujinx.HLE.HOS.Kernel.Common; using System; using System.Collections.Generic; @@ -6,6 +7,8 @@ namespace Ryujinx.HLE.HOS.Services.Time { class IStaticService : IpcService { + private int _timeSharedMemoryNativeHandle = 0; + private Dictionary _commands; public override IReadOnlyDictionary Commands => _commands; @@ -16,15 +19,30 @@ namespace Ryujinx.HLE.HOS.Services.Time { _commands = new Dictionary { - { 0, GetStandardUserSystemClock }, - { 1, GetStandardNetworkSystemClock }, - { 2, GetStandardSteadyClock }, - { 3, GetTimeZoneService }, - { 4, GetStandardLocalSystemClock }, - { 300, CalculateMonotonicSystemClockBaseTimePoint } + { 0, GetStandardUserSystemClock }, + { 1, GetStandardNetworkSystemClock }, + { 2, GetStandardSteadyClock }, + { 3, GetTimeZoneService }, + { 4, GetStandardLocalSystemClock }, + //{ 5, GetEphemeralNetworkSystemClock }, // 4.0.0+ + { 20, GetSharedMemoryNativeHandle }, // 6.0.0+ + //{ 30, GetStandardNetworkClockOperationEventReadableHandle }, // 6.0.0+ + //{ 31, GetEphemeralNetworkClockOperationEventReadableHandle }, // 6.0.0+ + //{ 50, SetStandardSteadyClockInternalOffset }, // 4.0.0+ + //{ 100, IsStandardUserSystemClockAutomaticCorrectionEnabled }, + //{ 101, SetStandardUserSystemClockAutomaticCorrectionEnabled }, + //{ 102, GetStandardUserSystemClockInitialYear }, // 5.0.0+ + //{ 200, IsStandardNetworkSystemClockAccuracySufficient }, // 3.0.0+ + //{ 201, GetStandardUserSystemClockAutomaticCorrectionUpdatedTime }, // 6.0.0+ + { 300, CalculateMonotonicSystemClockBaseTimePoint }, // 4.0.0+ + //{ 400, GetClockSnapshot }, // 4.0.0+ + //{ 401, GetClockSnapshotFromSystemClockContext }, // 4.0.0+ + //{ 500, CalculateStandardUserSystemClockDifferenceByUser }, // 4.0.0+ + //{ 501, CalculateSpanBetween }, // 4.0.0+ }; } + // GetStandardUserSystemClock() -> object public long GetStandardUserSystemClock(ServiceCtx context) { MakeObject(context, new ISystemClock(SystemClockType.User)); @@ -32,6 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Time return 0; } + // GetStandardNetworkSystemClock() -> object public long GetStandardNetworkSystemClock(ServiceCtx context) { MakeObject(context, new ISystemClock(SystemClockType.Network)); @@ -39,6 +58,7 @@ namespace Ryujinx.HLE.HOS.Services.Time return 0; } + // GetStandardSteadyClock() -> object public long GetStandardSteadyClock(ServiceCtx context) { MakeObject(context, new ISteadyClock()); @@ -46,6 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Time return 0; } + // GetTimeZoneService() -> object public long GetTimeZoneService(ServiceCtx context) { MakeObject(context, new ITimeZoneService()); @@ -53,6 +74,7 @@ namespace Ryujinx.HLE.HOS.Services.Time return 0; } + // GetStandardLocalSystemClock() -> object public long GetStandardLocalSystemClock(ServiceCtx context) { MakeObject(context, new ISystemClock(SystemClockType.Local)); @@ -60,6 +82,23 @@ namespace Ryujinx.HLE.HOS.Services.Time return 0; } + // GetSharedMemoryNativeHandle() -> handle + public long GetSharedMemoryNativeHandle(ServiceCtx context) + { + if (_timeSharedMemoryNativeHandle == 0) + { + if (context.Process.HandleTable.GenerateHandle(context.Device.System.TimeSharedMem, out _timeSharedMemoryNativeHandle) != KernelResult.Success) + { + throw new InvalidOperationException("Out of handles!"); + } + } + + context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_timeSharedMemoryNativeHandle); + + return 0; + } + + // CalculateMonotonicSystemClockBaseTimePoint(nn::time::SystemClockContext) -> u64 public long CalculateMonotonicSystemClockBaseTimePoint(ServiceCtx context) { long timeOffset = (long)(DateTime.UtcNow - StartupDate).TotalSeconds; -- cgit v1.2.3