mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	service: time: Setup the network clock with the local clock context
Setting the network time allows some time based events using the network clock to not reset.
This commit is contained in:
		
							parent
							
								
									15a07f0282
								
							
						
					
					
						commit
						2283fccc1b
					
				@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user