aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Time/IStaticService.cs
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2019-06-17 01:56:46 +0200
committerThomas Guillemard <me@thog.eu>2019-06-17 01:56:46 +0200
commit3db9daa3bda5053fdbda248263f0b8fa46bdba0d (patch)
tree72fff7925e6e26d47f82324a8993c485075c21f9 /Ryujinx.HLE/HOS/Services/Time/IStaticService.cs
parent70bfc01e5feb3d951043313c255b5e992518711c (diff)
time: Implement GetSharedMemoryNativeHandle (#705)
- Implement Time SharedMemory - Implement GetSharedMemoryNativeHandle - Cleanup IStaticService
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Time/IStaticService.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Time/IStaticService.cs51
1 files changed, 45 insertions, 6 deletions
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<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
@@ -16,15 +19,30 @@ namespace Ryujinx.HLE.HOS.Services.Time
{
_commands = new Dictionary<int, ServiceProcessRequest>
{
- { 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<nn::timesrv::detail::service::ISystemClock>
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<nn::timesrv::detail::service::ISystemClock>
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<nn::timesrv::detail::service::ISteadyClock>
public long GetStandardSteadyClock(ServiceCtx context)
{
MakeObject(context, new ISteadyClock());
@@ -46,6 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Time
return 0;
}
+ // GetTimeZoneService() -> object<nn::timesrv::detail::service::ITimeZoneService>
public long GetTimeZoneService(ServiceCtx context)
{
MakeObject(context, new ITimeZoneService());
@@ -53,6 +74,7 @@ namespace Ryujinx.HLE.HOS.Services.Time
return 0;
}
+ // GetStandardLocalSystemClock() -> object<nn::timesrv::detail::service::ISystemClock>
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<copy>
+ 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;