xref: /kvm-unit-tests/s390x/migration-sck.c (revision eef2cdb55d647c4509b398825fcaf6feea6788c2)
1c6da806fSNico Boehr /* SPDX-License-Identifier: GPL-2.0-only */
2c6da806fSNico Boehr /*
3c6da806fSNico Boehr  * SET CLOCK migration tests
4c6da806fSNico Boehr  *
5c6da806fSNico Boehr  * Copyright IBM Corp. 2022
6c6da806fSNico Boehr  *
7c6da806fSNico Boehr  * Authors:
8c6da806fSNico Boehr  *  Nico Boehr <nrb@linux.ibm.com>
9c6da806fSNico Boehr  */
10c6da806fSNico Boehr 
11c6da806fSNico Boehr #include <libcflat.h>
12*eef2cdb5SNico Boehr #include <migrate.h>
13c6da806fSNico Boehr #include <asm/time.h>
14c6da806fSNico Boehr 
test_sck_migration(void)15c6da806fSNico Boehr static void test_sck_migration(void)
16c6da806fSNico Boehr {
17c6da806fSNico Boehr 	uint64_t now_before_set = 0, now_after_set = 0, now_after_migration, time_to_set, time_to_advance;
18c6da806fSNico Boehr 	int cc;
19c6da806fSNico Boehr 
20c6da806fSNico Boehr 	stckf(&now_before_set);
21c6da806fSNico Boehr 
22c6da806fSNico Boehr 	/* Advance the clock by a lot more than we might ever need to migrate (600s) */
23c6da806fSNico Boehr 	time_to_advance = (600ULL * 1000000) << STCK_SHIFT_US;
24c6da806fSNico Boehr 	time_to_set = now_before_set + time_to_advance;
25c6da806fSNico Boehr 
26c6da806fSNico Boehr 	cc = sck(&time_to_set);
27c6da806fSNico Boehr 	report(!cc, "setting clock succeeded");
28c6da806fSNico Boehr 
29c6da806fSNico Boehr 	/* Check the clock is running after being set */
30c6da806fSNico Boehr 	cc = stckf(&now_after_set);
31c6da806fSNico Boehr 	report(!cc, "clock running after set");
32c6da806fSNico Boehr 	report(now_after_set >= time_to_set, "TOD clock value is larger than what has been set");
33c6da806fSNico Boehr 
34*eef2cdb5SNico Boehr 	migrate_once();
35c6da806fSNico Boehr 
36c6da806fSNico Boehr 	cc = stckf(&now_after_migration);
37c6da806fSNico Boehr 	report(!cc, "clock still set");
38c6da806fSNico Boehr 
39c6da806fSNico Boehr 	/*
40c6da806fSNico Boehr 	 * The architectural requirement for the TOD clock is that it doesn't move backwards after
41c6da806fSNico Boehr 	 * migration. Implementations can just migrate the guest TOD value or do something more
42c6da806fSNico Boehr 	 * sophisticated (e.g. slowly adjust to the host TOD).
43c6da806fSNico Boehr 	 */
44c6da806fSNico Boehr 	report(now_after_migration >= time_to_set, "TOD clock value did not jump backwards");
45c6da806fSNico Boehr }
46c6da806fSNico Boehr 
main(void)47c6da806fSNico Boehr int main(void)
48c6da806fSNico Boehr {
49c6da806fSNico Boehr 	report_prefix_push("migration-sck");
50c6da806fSNico Boehr 
51c6da806fSNico Boehr 	test_sck_migration();
52c6da806fSNico Boehr 	report_prefix_pop();
53c6da806fSNico Boehr 	return report_summary();
54c6da806fSNico Boehr }
55