Selaa lähdekoodia

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.
Morph 5 vuotta sitten
vanhempi
commit
2283fccc1b

+ 7 - 1
src/core/hle/service/time/clock_types.h

@@ -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,

+ 22 - 15
src/core/hle/service/time/time.cpp

@@ -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)};

+ 1 - 1
src/core/hle/service/time/time.h

@@ -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:

+ 5 - 1
src/core/hle/service/time/time_manager.cpp

@@ -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();
     }

+ 1 - 1
src/core/hle/service/time/time_zone_manager.cpp

@@ -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

+ 2 - 2
src/core/hle/service/time/time_zone_types.h

@@ -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");