aboutsummaryrefslogtreecommitdiff
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
parent70bfc01e5feb3d951043313c255b5e992518711c (diff)
time: Implement GetSharedMemoryNativeHandle (#705)
- Implement Time SharedMemory - Implement GetSharedMemoryNativeHandle - Cleanup IStaticService
-rw-r--r--Ryujinx.HLE/HOS/Horizon.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Time/IStaticService.cs51
2 files changed, 52 insertions, 7 deletions
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs
index 51db8884..95cd30f0 100644
--- a/Ryujinx.HLE/HOS/Horizon.cs
+++ b/Ryujinx.HLE/HOS/Horizon.cs
@@ -32,6 +32,7 @@ namespace Ryujinx.HLE.HOS
internal const int HidSize = 0x40000;
internal const int FontSize = 0x1100000;
internal const int IirsSize = 0x8000;
+ internal const int TimeSize = 0x1000;
private const int MemoryBlockAllocatorSize = 0x2710;
@@ -84,6 +85,7 @@ namespace Ryujinx.HLE.HOS
internal KSharedMemory HidSharedMem { get; private set; }
internal KSharedMemory FontSharedMem { get; private set; }
internal KSharedMemory IirsSharedMem { get; private set; }
+ internal KSharedMemory TimeSharedMem { get; private set; }
internal SharedFontManager Font { get; private set; }
@@ -161,20 +163,24 @@ namespace Ryujinx.HLE.HOS
ulong hidPa = region.Address;
ulong fontPa = region.Address + HidSize;
ulong iirsPa = region.Address + HidSize + FontSize;
+ ulong timePa = region.Address + HidSize + FontSize + IirsSize;
HidBaseAddress = (long)(hidPa - DramMemoryMap.DramBase);
KPageList hidPageList = new KPageList();
KPageList fontPageList = new KPageList();
KPageList iirsPageList = new KPageList();
+ KPageList timePageList = new KPageList();
hidPageList .AddRange(hidPa, HidSize / KMemoryManager.PageSize);
fontPageList.AddRange(fontPa, FontSize / KMemoryManager.PageSize);
iirsPageList.AddRange(iirsPa, IirsSize / KMemoryManager.PageSize);
+ timePageList.AddRange(timePa, TimeSize / KMemoryManager.PageSize);
HidSharedMem = new KSharedMemory(this, hidPageList, 0, 0, MemoryPermission.Read);
FontSharedMem = new KSharedMemory(this, fontPageList, 0, 0, MemoryPermission.Read);
IirsSharedMem = new KSharedMemory(this, iirsPageList, 0, 0, MemoryPermission.Read);
+ TimeSharedMem = new KSharedMemory(this, timePageList, 0, 0, MemoryPermission.Read);
AppletState = new AppletStateMgr(this);
@@ -676,4 +682,4 @@ namespace Ryujinx.HLE.HOS
}
}
}
-}
+} \ No newline at end of file
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;