Commit 2701c1bd authored by Johannes Berg's avatar Johannes Berg Committed by Richard Weinberger
Browse files

um: time: Fix read_persistent_clock64() in time-travel



In time-travel mode, we've relied on read_persistent_clock64()
being called only once at system startup, but this is both the
right thing to call from the pseudo-RTC, and also gets called
by the timekeeping core during suspend/resume.

Thus, fix this to always fall make use of the time_travel_time
in any time-travel mode, initializing time_travel_start at boot
to the right value depending on the time-travel mode.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Acked-By: default avatarAnton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 49da38a3
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -676,10 +676,8 @@ void read_persistent_clock64(struct timespec64 *ts)
{
	long long nsecs;

	if (time_travel_start_set)
	if (time_travel_mode != TT_MODE_OFF)
		nsecs = time_travel_start + time_travel_time;
	else if (time_travel_mode == TT_MODE_EXTERNAL)
		nsecs = time_travel_ext_req(UM_TIMETRAVEL_GET_TOD, -1);
	else
		nsecs = os_persistent_clock_emulation();

@@ -689,6 +687,25 @@ void read_persistent_clock64(struct timespec64 *ts)

void __init time_init(void)
{
#ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
	switch (time_travel_mode) {
	case TT_MODE_EXTERNAL:
		time_travel_start = time_travel_ext_req(UM_TIMETRAVEL_GET_TOD, -1);
		/* controller gave us the *current* time, so adjust by that */
		time_travel_ext_get_time();
		time_travel_start -= time_travel_time;
		break;
	case TT_MODE_INFCPU:
	case TT_MODE_BASIC:
		if (!time_travel_start_set)
			time_travel_start = os_persistent_clock_emulation();
		break;
	case TT_MODE_OFF:
		/* we just read the host clock with os_persistent_clock_emulation() */
		break;
	}
#endif

	timer_set_signal_handler();
	late_time_init = um_timer_setup;
}