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 Boehrstatic 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 Boehrint 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