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…
Reference in a new issue