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