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.
master
Morph 2021-04-08 13:26:38 +07:00
parent 15a07f0282
commit 2283fccc1b
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");