forked from eden-emu/eden
		
	Merge pull request #6170 from Morph1984/more-time-fixes
service: time: Setup the network clock with the local clock context
This commit is contained in:
		
						commit
						da37f40047
					
				
					 6 changed files with 38 additions and 21 deletions
				
			
		|  | @ -12,6 +12,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace Service::Time::Clock { | namespace Service::Time::Clock { | ||||||
| 
 | 
 | ||||||
|  | enum class TimeType : u8 { | ||||||
|  |     UserSystemClock, | ||||||
|  |     NetworkSystemClock, | ||||||
|  |     LocalSystemClock, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /// https://switchbrew.org/wiki/Glue_services#SteadyClockTimePoint
 | /// https://switchbrew.org/wiki/Glue_services#SteadyClockTimePoint
 | ||||||
| struct SteadyClockTimePoint { | struct SteadyClockTimePoint { | ||||||
|     s64 time_point; |     s64 time_point; | ||||||
|  | @ -84,7 +90,7 @@ struct ClockSnapshot { | ||||||
|     SteadyClockTimePoint steady_clock_time_point; |     SteadyClockTimePoint steady_clock_time_point; | ||||||
|     TimeZone::LocationName location_name; |     TimeZone::LocationName location_name; | ||||||
|     u8 is_automatic_correction_enabled; |     u8 is_automatic_correction_enabled; | ||||||
|     u8 type; |     TimeType type; | ||||||
|     INSERT_PADDING_BYTES_NOINIT(0x2); |     INSERT_PADDING_BYTES_NOINIT(0x2); | ||||||
| 
 | 
 | ||||||
|     static ResultCode GetCurrentTime(s64& current_time, |     static ResultCode GetCurrentTime(s64& current_time, | ||||||
|  |  | ||||||
|  | @ -122,14 +122,16 @@ private: | ||||||
| 
 | 
 | ||||||
| ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal( | ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal( | ||||||
|     Kernel::KThread* thread, Clock::SystemClockContext user_context, |     Kernel::KThread* thread, Clock::SystemClockContext user_context, | ||||||
|     Clock::SystemClockContext network_context, u8 type, Clock::ClockSnapshot& clock_snapshot) { |     Clock::SystemClockContext network_context, Clock::TimeType type, | ||||||
|  |     Clock::ClockSnapshot& clock_snapshot) { | ||||||
| 
 | 
 | ||||||
|     auto& time_manager{system.GetTimeManager()}; |     auto& time_manager{system.GetTimeManager()}; | ||||||
| 
 | 
 | ||||||
|  |     clock_snapshot.steady_clock_time_point = | ||||||
|  |         time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(system); | ||||||
|     clock_snapshot.is_automatic_correction_enabled = |     clock_snapshot.is_automatic_correction_enabled = | ||||||
|         time_manager.GetStandardUserSystemClockCore().IsAutomaticCorrectionEnabled(); |         time_manager.GetStandardUserSystemClockCore().IsAutomaticCorrectionEnabled(); | ||||||
|     clock_snapshot.user_context = user_context; |     clock_snapshot.type = type; | ||||||
|     clock_snapshot.network_context = network_context; |  | ||||||
| 
 | 
 | ||||||
|     if (const ResultCode result{ |     if (const ResultCode result{ | ||||||
|             time_manager.GetTimeZoneContentManager().GetTimeZoneManager().GetDeviceLocationName( |             time_manager.GetTimeZoneContentManager().GetTimeZoneManager().GetDeviceLocationName( | ||||||
|  | @ -138,12 +140,11 @@ ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal( | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const auto current_time_point{ |     clock_snapshot.user_context = user_context; | ||||||
|         time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(system)}; |  | ||||||
|     clock_snapshot.steady_clock_time_point = current_time_point; |  | ||||||
| 
 | 
 | ||||||
|     if (const ResultCode result{Clock::ClockSnapshot::GetCurrentTime( |     if (const ResultCode result{Clock::ClockSnapshot::GetCurrentTime( | ||||||
|             clock_snapshot.user_time, current_time_point, clock_snapshot.user_context)}; |             clock_snapshot.user_time, clock_snapshot.steady_clock_time_point, | ||||||
|  |             clock_snapshot.user_context)}; | ||||||
|         result != RESULT_SUCCESS) { |         result != RESULT_SUCCESS) { | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  | @ -157,9 +158,12 @@ ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal( | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     clock_snapshot.user_calendar_time = userCalendarInfo.time; |     clock_snapshot.user_calendar_time = userCalendarInfo.time; | ||||||
|     clock_snapshot.user_calendar_additional_time = userCalendarInfo.additiona_info; |     clock_snapshot.user_calendar_additional_time = userCalendarInfo.additional_info; | ||||||
| 
 | 
 | ||||||
|     if (Clock::ClockSnapshot::GetCurrentTime(clock_snapshot.network_time, current_time_point, |     clock_snapshot.network_context = network_context; | ||||||
|  | 
 | ||||||
|  |     if (Clock::ClockSnapshot::GetCurrentTime(clock_snapshot.network_time, | ||||||
|  |                                              clock_snapshot.steady_clock_time_point, | ||||||
|                                              clock_snapshot.network_context) != RESULT_SUCCESS) { |                                              clock_snapshot.network_context) != RESULT_SUCCESS) { | ||||||
|         clock_snapshot.network_time = 0; |         clock_snapshot.network_time = 0; | ||||||
|     } |     } | ||||||
|  | @ -173,8 +177,7 @@ ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal( | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     clock_snapshot.network_calendar_time = networkCalendarInfo.time; |     clock_snapshot.network_calendar_time = networkCalendarInfo.time; | ||||||
|     clock_snapshot.network_calendar_additional_time = networkCalendarInfo.additiona_info; |     clock_snapshot.network_calendar_additional_time = networkCalendarInfo.additional_info; | ||||||
|     clock_snapshot.type = type; |  | ||||||
| 
 | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
|  | @ -257,9 +260,10 @@ void Module::Interface::CalculateMonotonicSystemClockBaseTimePoint(Kernel::HLERe | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | ||||||
|     LOG_DEBUG(Service_Time, "called"); |  | ||||||
|     IPC::RequestParser rp{ctx}; |     IPC::RequestParser rp{ctx}; | ||||||
|     const auto type{rp.PopRaw<u8>()}; |     const auto type{rp.PopEnum<Clock::TimeType>()}; | ||||||
|  | 
 | ||||||
|  |     LOG_DEBUG(Service_Time, "called, type={}", type); | ||||||
| 
 | 
 | ||||||
|     Clock::SystemClockContext user_context{}; |     Clock::SystemClockContext user_context{}; | ||||||
|     if (const ResultCode result{ |     if (const ResultCode result{ | ||||||
|  | @ -270,6 +274,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | ||||||
|         rb.Push(result); |         rb.Push(result); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     Clock::SystemClockContext network_context{}; |     Clock::SystemClockContext network_context{}; | ||||||
|     if (const ResultCode result{ |     if (const ResultCode result{ | ||||||
|             system.GetTimeManager().GetStandardNetworkSystemClockCore().GetClockContext( |             system.GetTimeManager().GetStandardNetworkSystemClockCore().GetClockContext( | ||||||
|  | @ -295,14 +300,16 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetClockSnapshotFromSystemClockContext(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetClockSnapshotFromSystemClockContext(Kernel::HLERequestContext& ctx) { | ||||||
|     LOG_DEBUG(Service_Time, "called"); |  | ||||||
|     IPC::RequestParser rp{ctx}; |     IPC::RequestParser rp{ctx}; | ||||||
|     const auto type{rp.PopRaw<u8>()}; |     const auto type{rp.PopEnum<Clock::TimeType>()}; | ||||||
|  | 
 | ||||||
|     rp.AlignWithPadding(); |     rp.AlignWithPadding(); | ||||||
| 
 | 
 | ||||||
|     const Clock::SystemClockContext user_context{rp.PopRaw<Clock::SystemClockContext>()}; |     const Clock::SystemClockContext user_context{rp.PopRaw<Clock::SystemClockContext>()}; | ||||||
|     const Clock::SystemClockContext network_context{rp.PopRaw<Clock::SystemClockContext>()}; |     const Clock::SystemClockContext network_context{rp.PopRaw<Clock::SystemClockContext>()}; | ||||||
| 
 | 
 | ||||||
|  |     LOG_DEBUG(Service_Time, "called, type={}", type); | ||||||
|  | 
 | ||||||
|     Clock::ClockSnapshot clock_snapshot{}; |     Clock::ClockSnapshot clock_snapshot{}; | ||||||
|     if (const ResultCode result{GetClockSnapshotFromSystemClockContextInternal( |     if (const ResultCode result{GetClockSnapshotFromSystemClockContextInternal( | ||||||
|             &ctx.GetThread(), user_context, network_context, type, clock_snapshot)}; |             &ctx.GetThread(), user_context, network_context, type, clock_snapshot)}; | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ public: | ||||||
|     private: |     private: | ||||||
|         ResultCode GetClockSnapshotFromSystemClockContextInternal( |         ResultCode GetClockSnapshotFromSystemClockContextInternal( | ||||||
|             Kernel::KThread* thread, Clock::SystemClockContext user_context, |             Kernel::KThread* thread, Clock::SystemClockContext user_context, | ||||||
|             Clock::SystemClockContext network_context, u8 type, |             Clock::SystemClockContext network_context, Clock::TimeType type, | ||||||
|             Clock::ClockSnapshot& cloc_snapshot); |             Clock::ClockSnapshot& cloc_snapshot); | ||||||
| 
 | 
 | ||||||
|     protected: |     protected: | ||||||
|  |  | ||||||
|  | @ -44,7 +44,11 @@ struct TimeManager::Impl final { | ||||||
|         const auto system_time{Clock::TimeSpanType::FromSeconds(GetExternalRtcValue())}; |         const auto system_time{Clock::TimeSpanType::FromSeconds(GetExternalRtcValue())}; | ||||||
|         SetupStandardSteadyClock(system, Common::UUID::Generate(), system_time, {}, {}); |         SetupStandardSteadyClock(system, Common::UUID::Generate(), system_time, {}, {}); | ||||||
|         SetupStandardLocalSystemClock(system, {}, system_time.ToSeconds()); |         SetupStandardLocalSystemClock(system, {}, system_time.ToSeconds()); | ||||||
|         SetupStandardNetworkSystemClock({}, standard_network_clock_accuracy); | 
 | ||||||
|  |         Clock::SystemClockContext clock_context{}; | ||||||
|  |         standard_local_system_clock_core.GetClockContext(system, clock_context); | ||||||
|  | 
 | ||||||
|  |         SetupStandardNetworkSystemClock(clock_context, standard_network_clock_accuracy); | ||||||
|         SetupStandardUserSystemClock(system, {}, Clock::SteadyClockTimePoint::GetRandom()); |         SetupStandardUserSystemClock(system, {}, Clock::SteadyClockTimePoint::GetRandom()); | ||||||
|         SetupEphemeralNetworkSystemClock(); |         SetupEphemeralNetworkSystemClock(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -818,7 +818,7 @@ static ResultCode ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time, | ||||||
| static ResultCode ToCalendarTimeImpl(const TimeZoneRule& rules, s64 time, CalendarInfo& calendar) { | static ResultCode ToCalendarTimeImpl(const TimeZoneRule& rules, s64 time, CalendarInfo& calendar) { | ||||||
|     CalendarTimeInternal calendar_time{}; |     CalendarTimeInternal calendar_time{}; | ||||||
|     const ResultCode result{ |     const ResultCode result{ | ||||||
|         ToCalendarTimeInternal(rules, time, calendar_time, calendar.additiona_info)}; |         ToCalendarTimeInternal(rules, time, calendar_time, calendar.additional_info)}; | ||||||
|     calendar.time.year = static_cast<s16>(calendar_time.year); |     calendar.time.year = static_cast<s16>(calendar_time.year); | ||||||
| 
 | 
 | ||||||
|     // Internal impl. uses 0-indexed month
 |     // Internal impl. uses 0-indexed month
 | ||||||
|  |  | ||||||
|  | @ -66,8 +66,8 @@ struct CalendarTime { | ||||||
| static_assert(sizeof(CalendarTime) == 0x8, "CalendarTime is incorrect size"); | static_assert(sizeof(CalendarTime) == 0x8, "CalendarTime is incorrect size"); | ||||||
| 
 | 
 | ||||||
| struct CalendarInfo { | struct CalendarInfo { | ||||||
|     CalendarTime time{}; |     CalendarTime time; | ||||||
|     CalendarAdditionalInfo additiona_info{}; |     CalendarAdditionalInfo additional_info; | ||||||
| }; | }; | ||||||
| static_assert(sizeof(CalendarInfo) == 0x20, "CalendarInfo is incorrect size"); | static_assert(sizeof(CalendarInfo) == 0x20, "CalendarInfo is incorrect size"); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei