diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Time/Clock')
6 files changed, 38 insertions, 57 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardNetworkSystemClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardNetworkSystemClockCore.cs index b86f703d..aec03485 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardNetworkSystemClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardNetworkSystemClockCore.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Cpu; namespace Ryujinx.HLE.HOS.Services.Time.Clock { @@ -11,14 +11,14 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock _standardNetworkClockSufficientAccuracy = new TimeSpanType(0); } - public bool IsStandardNetworkSystemClockAccuracySufficient(KThread thread) + public bool IsStandardNetworkSystemClockAccuracySufficient(ITickSource tickSource) { SteadyClockCore steadyClockCore = GetSteadyClockCore(); - SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(thread); + SteadyClockTimePoint currentTimePoint = steadyClockCore.GetCurrentTimePoint(tickSource); bool isStandardNetworkClockSufficientAccuracy = false; - ResultCode result = GetClockContext(thread, out SystemClockContext context); + ResultCode result = GetClockContext(tickSource, out SystemClockContext context); if (result == ResultCode.Success && context.SteadyTimePoint.GetSpanBetween(currentTimePoint, out long outSpan) == ResultCode.Success) { diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardSteadyClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardSteadyClockCore.cs index 370e7d73..8392c4b5 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardSteadyClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardSteadyClockCore.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Cpu; namespace Ryujinx.HLE.HOS.Services.Time.Clock { @@ -17,11 +17,11 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock _cachedRawTimePoint = TimeSpanType.Zero; } - public override SteadyClockTimePoint GetTimePoint(KThread thread) + public override SteadyClockTimePoint GetTimePoint(ITickSource tickSource) { SteadyClockTimePoint result = new SteadyClockTimePoint { - TimePoint = GetCurrentRawTimePoint(thread).ToSeconds(), + TimePoint = GetCurrentRawTimePoint(tickSource).ToSeconds(), ClockSourceId = GetClockSourceId() }; @@ -48,19 +48,9 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock _internalOffset = internalOffset; } - public override TimeSpanType GetCurrentRawTimePoint(KThread thread) + public override TimeSpanType GetCurrentRawTimePoint(ITickSource tickSource) { - TimeSpanType ticksTimeSpan; - - // As this may be called before the guest code, we support passing a null thread to make this api usable. - if (thread == null) - { - ticksTimeSpan = TimeSpanType.FromSeconds(0); - } - else - { - ticksTimeSpan = TimeSpanType.FromTicks(thread.Context.CntpctEl0, thread.Context.CntfrqEl0); - } + TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(tickSource.Counter, tickSource.Frequency); TimeSpanType rawTimePoint = new TimeSpanType(_setupValue.NanoSeconds + ticksTimeSpan.NanoSeconds); diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs index 2499b549..fa485437 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs @@ -1,4 +1,5 @@ -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Cpu; +using Ryujinx.HLE.HOS.Kernel.Threading; using System; namespace Ryujinx.HLE.HOS.Services.Time.Clock @@ -26,15 +27,15 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock throw new NotImplementedException(); } - public override ResultCode GetClockContext(KThread thread, out SystemClockContext context) + public override ResultCode GetClockContext(ITickSource tickSource, out SystemClockContext context) { - ResultCode result = ApplyAutomaticCorrection(thread, false); + ResultCode result = ApplyAutomaticCorrection(tickSource, false); context = new SystemClockContext(); if (result == ResultCode.Success) { - return _localSystemClockCore.GetClockContext(thread, out context); + return _localSystemClockCore.GetClockContext(tickSource, out context); } return result; @@ -45,13 +46,13 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock return ResultCode.NotImplemented; } - private ResultCode ApplyAutomaticCorrection(KThread thread, bool autoCorrectionEnabled) + private ResultCode ApplyAutomaticCorrection(ITickSource tickSource, bool autoCorrectionEnabled) { ResultCode result = ResultCode.Success; - if (_autoCorrectionEnabled != autoCorrectionEnabled && _networkSystemClockCore.IsClockSetup(thread)) + if (_autoCorrectionEnabled != autoCorrectionEnabled && _networkSystemClockCore.IsClockSetup(tickSource)) { - result = _networkSystemClockCore.GetClockContext(thread, out SystemClockContext context); + result = _networkSystemClockCore.GetClockContext(tickSource, out SystemClockContext context); if (result == ResultCode.Success) { @@ -67,9 +68,9 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock _autoCorrectionEvent = new KEvent(system.KernelContext); } - public ResultCode SetAutomaticCorrectionEnabled(KThread thread, bool autoCorrectionEnabled) + public ResultCode SetAutomaticCorrectionEnabled(ITickSource tickSource, bool autoCorrectionEnabled) { - ResultCode result = ApplyAutomaticCorrection(thread, autoCorrectionEnabled); + ResultCode result = ApplyAutomaticCorrection(tickSource, autoCorrectionEnabled); if (result == ResultCode.Success) { diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/SteadyClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/SteadyClockCore.cs index 83ace981..4bb19e75 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/SteadyClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/SteadyClockCore.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Cpu; using Ryujinx.HLE.Utilities; using System; @@ -63,21 +63,21 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock public virtual void SetInternalOffset(TimeSpanType internalOffset) {} - public virtual SteadyClockTimePoint GetTimePoint(KThread thread) + public virtual SteadyClockTimePoint GetTimePoint(ITickSource tickSource) { throw new NotImplementedException(); } - public virtual TimeSpanType GetCurrentRawTimePoint(KThread thread) + public virtual TimeSpanType GetCurrentRawTimePoint(ITickSource tickSource) { - SteadyClockTimePoint timePoint = GetTimePoint(thread); + SteadyClockTimePoint timePoint = GetTimePoint(tickSource); return TimeSpanType.FromSeconds(timePoint.TimePoint); } - public SteadyClockTimePoint GetCurrentTimePoint(KThread thread) + public SteadyClockTimePoint GetCurrentTimePoint(ITickSource tickSource) { - SteadyClockTimePoint result = GetTimePoint(thread); + SteadyClockTimePoint result = GetTimePoint(tickSource); result.TimePoint += GetTestOffset().ToSeconds(); result.TimePoint += GetInternalOffset().ToSeconds(); diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockCore.cs index 865b1c09..f4bbaa60 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockCore.cs @@ -1,4 +1,4 @@ -using System; +using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Kernel.Threading; namespace Ryujinx.HLE.HOS.Services.Time.Clock @@ -25,13 +25,13 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock return _steadyClockCore; } - public ResultCode GetCurrentTime(KThread thread, out long posixTime) + public ResultCode GetCurrentTime(ITickSource tickSource, out long posixTime) { posixTime = 0; - SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(thread); + SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(tickSource); - ResultCode result = GetClockContext(thread, out SystemClockContext clockContext); + ResultCode result = GetClockContext(tickSource, out SystemClockContext clockContext); if (result == ResultCode.Success) { @@ -48,9 +48,9 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock return result; } - public ResultCode SetCurrentTime(KThread thread, long posixTime) + public ResultCode SetCurrentTime(ITickSource tickSource, long posixTime) { - SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(thread); + SteadyClockTimePoint currentTimePoint = _steadyClockCore.GetCurrentTimePoint(tickSource); SystemClockContext clockContext = new SystemClockContext() { @@ -68,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock return result; } - public virtual ResultCode GetClockContext(KThread thread, out SystemClockContext context) + public virtual ResultCode GetClockContext(ITickSource tickSource, out SystemClockContext context) { context = _context; @@ -127,13 +127,13 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock _isInitialized = true; } - public bool IsClockSetup(KThread thread) + public bool IsClockSetup(ITickSource tickSource) { - ResultCode result = GetClockContext(thread, out SystemClockContext context); + ResultCode result = GetClockContext(tickSource, out SystemClockContext context); if (result == ResultCode.Success) { - SteadyClockTimePoint steadyClockTimePoint = _steadyClockCore.GetCurrentTimePoint(thread); + SteadyClockTimePoint steadyClockTimePoint = _steadyClockCore.GetCurrentTimePoint(tickSource); return steadyClockTimePoint.ClockSourceId == context.SteadyTimePoint.ClockSourceId; } diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/TickBasedSteadyClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/TickBasedSteadyClockCore.cs index 06502082..fe74da7e 100644 --- a/Ryujinx.HLE/HOS/Services/Time/Clock/TickBasedSteadyClockCore.cs +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/TickBasedSteadyClockCore.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Cpu; namespace Ryujinx.HLE.HOS.Services.Time.Clock { @@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock { public TickBasedSteadyClockCore() {} - public override SteadyClockTimePoint GetTimePoint(KThread thread) + public override SteadyClockTimePoint GetTimePoint(ITickSource tickSource) { SteadyClockTimePoint result = new SteadyClockTimePoint { @@ -14,17 +14,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock ClockSourceId = GetClockSourceId() }; - TimeSpanType ticksTimeSpan; - - // As this may be called before the guest code, we support passing a null thread to make this api usable. - if (thread == null) - { - ticksTimeSpan = TimeSpanType.FromSeconds(0); - } - else - { - ticksTimeSpan = TimeSpanType.FromTicks(thread.Context.CntpctEl0, thread.Context.CntfrqEl0); - } + TimeSpanType ticksTimeSpan = TimeSpanType.FromTicks(tickSource.Counter, tickSource.Frequency); result.TimePoint = ticksTimeSpan.ToSeconds(); |
