15b262bb6SDmitry Osipenko /* 25b262bb6SDmitry Osipenko * QTest testcase for the ptimer 35b262bb6SDmitry Osipenko * 4673c7e89SDmitry Osipenko * Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com> 55b262bb6SDmitry Osipenko * 65b262bb6SDmitry Osipenko * This work is licensed under the terms of the GNU GPL, version 2 or later. 75b262bb6SDmitry Osipenko * See the COPYING file in the top-level directory. 85b262bb6SDmitry Osipenko * 95b262bb6SDmitry Osipenko */ 105b262bb6SDmitry Osipenko 115b262bb6SDmitry Osipenko #include <glib/gprintf.h> 125b262bb6SDmitry Osipenko 135b262bb6SDmitry Osipenko #include "qemu/osdep.h" 145b262bb6SDmitry Osipenko #include "qemu/main-loop.h" 155b262bb6SDmitry Osipenko #include "hw/ptimer.h" 165b262bb6SDmitry Osipenko 175b262bb6SDmitry Osipenko #include "libqtest.h" 185b262bb6SDmitry Osipenko #include "ptimer-test.h" 195b262bb6SDmitry Osipenko 205b262bb6SDmitry Osipenko static bool triggered; 215b262bb6SDmitry Osipenko 225b262bb6SDmitry Osipenko static void ptimer_trigger(void *opaque) 235b262bb6SDmitry Osipenko { 245b262bb6SDmitry Osipenko triggered = true; 255b262bb6SDmitry Osipenko } 265b262bb6SDmitry Osipenko 275b262bb6SDmitry Osipenko static void ptimer_test_expire_qemu_timers(int64_t expire_time, 285b262bb6SDmitry Osipenko QEMUClockType type) 295b262bb6SDmitry Osipenko { 305b262bb6SDmitry Osipenko QEMUTimerList *timer_list = main_loop_tlg.tl[type]; 315b262bb6SDmitry Osipenko QEMUTimer *t = timer_list->active_timers.next; 325b262bb6SDmitry Osipenko 335b262bb6SDmitry Osipenko while (t != NULL) { 345b262bb6SDmitry Osipenko if (t->expire_time == expire_time) { 355b262bb6SDmitry Osipenko timer_del(t); 365b262bb6SDmitry Osipenko 375b262bb6SDmitry Osipenko if (t->cb != NULL) { 385b262bb6SDmitry Osipenko t->cb(t->opaque); 395b262bb6SDmitry Osipenko } 405b262bb6SDmitry Osipenko } 415b262bb6SDmitry Osipenko 425b262bb6SDmitry Osipenko t = t->next; 435b262bb6SDmitry Osipenko } 445b262bb6SDmitry Osipenko } 455b262bb6SDmitry Osipenko 465b262bb6SDmitry Osipenko static void ptimer_test_set_qemu_time_ns(int64_t ns) 475b262bb6SDmitry Osipenko { 485b262bb6SDmitry Osipenko ptimer_test_time_ns = ns; 495b262bb6SDmitry Osipenko } 505b262bb6SDmitry Osipenko 515b262bb6SDmitry Osipenko static void qemu_clock_step(uint64_t ns) 525b262bb6SDmitry Osipenko { 535b262bb6SDmitry Osipenko int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL); 545b262bb6SDmitry Osipenko int64_t advanced_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns; 555b262bb6SDmitry Osipenko 565b262bb6SDmitry Osipenko while (deadline != -1 && deadline <= advanced_time) { 575b262bb6SDmitry Osipenko ptimer_test_set_qemu_time_ns(deadline); 585b262bb6SDmitry Osipenko ptimer_test_expire_qemu_timers(deadline, QEMU_CLOCK_VIRTUAL); 595b262bb6SDmitry Osipenko deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL); 605b262bb6SDmitry Osipenko } 615b262bb6SDmitry Osipenko 625b262bb6SDmitry Osipenko ptimer_test_set_qemu_time_ns(advanced_time); 635b262bb6SDmitry Osipenko } 645b262bb6SDmitry Osipenko 655b262bb6SDmitry Osipenko static void check_set_count(gconstpointer arg) 665b262bb6SDmitry Osipenko { 675b262bb6SDmitry Osipenko const uint8_t *policy = arg; 685b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 695b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 705b262bb6SDmitry Osipenko 715b262bb6SDmitry Osipenko triggered = false; 725b262bb6SDmitry Osipenko 735b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 1000); 745b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000); 755b262bb6SDmitry Osipenko g_assert_false(triggered); 76*072bdb07SMarc-André Lureau ptimer_free(ptimer); 775b262bb6SDmitry Osipenko } 785b262bb6SDmitry Osipenko 795b262bb6SDmitry Osipenko static void check_set_limit(gconstpointer arg) 805b262bb6SDmitry Osipenko { 815b262bb6SDmitry Osipenko const uint8_t *policy = arg; 825b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 835b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 845b262bb6SDmitry Osipenko 855b262bb6SDmitry Osipenko triggered = false; 865b262bb6SDmitry Osipenko 875b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 1000, 0); 885b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 895b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 1000); 905b262bb6SDmitry Osipenko g_assert_false(triggered); 915b262bb6SDmitry Osipenko 925b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 2000, 1); 935b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000); 945b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000); 955b262bb6SDmitry Osipenko g_assert_false(triggered); 96*072bdb07SMarc-André Lureau ptimer_free(ptimer); 975b262bb6SDmitry Osipenko } 985b262bb6SDmitry Osipenko 995b262bb6SDmitry Osipenko static void check_oneshot(gconstpointer arg) 1005b262bb6SDmitry Osipenko { 1015b262bb6SDmitry Osipenko const uint8_t *policy = arg; 1025b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 1035b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 104057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 1055b262bb6SDmitry Osipenko 1065b262bb6SDmitry Osipenko triggered = false; 1075b262bb6SDmitry Osipenko 1085b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 1095b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 10); 1105b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1115b262bb6SDmitry Osipenko 11233d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 2 + 1); 1135b262bb6SDmitry Osipenko 114057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1155b262bb6SDmitry Osipenko g_assert_false(triggered); 1165b262bb6SDmitry Osipenko 1175b262bb6SDmitry Osipenko ptimer_stop(ptimer); 1185b262bb6SDmitry Osipenko 119057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1205b262bb6SDmitry Osipenko g_assert_false(triggered); 1215b262bb6SDmitry Osipenko 1225b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 11); 1235b262bb6SDmitry Osipenko 124057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1255b262bb6SDmitry Osipenko g_assert_false(triggered); 1265b262bb6SDmitry Osipenko 1275b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1285b262bb6SDmitry Osipenko 12933d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 7 + 1); 1305b262bb6SDmitry Osipenko 131057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 132057516feSDmitry Osipenko 133057516feSDmitry Osipenko if (no_round_down) { 134057516feSDmitry Osipenko g_assert_false(triggered); 135057516feSDmitry Osipenko } else { 1365b262bb6SDmitry Osipenko g_assert_true(triggered); 1375b262bb6SDmitry Osipenko 1385b262bb6SDmitry Osipenko triggered = false; 139057516feSDmitry Osipenko } 1405b262bb6SDmitry Osipenko 1415b262bb6SDmitry Osipenko qemu_clock_step(2000000); 1425b262bb6SDmitry Osipenko 1435b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 144057516feSDmitry Osipenko 145057516feSDmitry Osipenko if (no_round_down) { 146057516feSDmitry Osipenko g_assert_true(triggered); 147057516feSDmitry Osipenko 148057516feSDmitry Osipenko triggered = false; 149057516feSDmitry Osipenko } else { 1505b262bb6SDmitry Osipenko g_assert_false(triggered); 151057516feSDmitry Osipenko } 1525b262bb6SDmitry Osipenko 1535b262bb6SDmitry Osipenko qemu_clock_step(4000000); 1545b262bb6SDmitry Osipenko 1555b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1565b262bb6SDmitry Osipenko g_assert_false(triggered); 1575b262bb6SDmitry Osipenko 1585b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 10); 1595b262bb6SDmitry Osipenko 16033d44cdfSDmitry Osipenko qemu_clock_step(20000000 + 1); 1615b262bb6SDmitry Osipenko 1625b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); 1635b262bb6SDmitry Osipenko g_assert_false(triggered); 1645b262bb6SDmitry Osipenko 1655b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 9, 1); 1665b262bb6SDmitry Osipenko 16733d44cdfSDmitry Osipenko qemu_clock_step(20000000 + 1); 1685b262bb6SDmitry Osipenko 1695b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); 1705b262bb6SDmitry Osipenko g_assert_false(triggered); 1715b262bb6SDmitry Osipenko 1725b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1735b262bb6SDmitry Osipenko 17433d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 1755b262bb6SDmitry Osipenko 176057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1775b262bb6SDmitry Osipenko g_assert_false(triggered); 1785b262bb6SDmitry Osipenko 1795b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 20); 1805b262bb6SDmitry Osipenko 18133d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 19 + 1); 1825b262bb6SDmitry Osipenko 183057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 1845b262bb6SDmitry Osipenko g_assert_false(triggered); 1855b262bb6SDmitry Osipenko 1865b262bb6SDmitry Osipenko qemu_clock_step(2000000); 1875b262bb6SDmitry Osipenko 1885b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1895b262bb6SDmitry Osipenko g_assert_true(triggered); 1905b262bb6SDmitry Osipenko 1915b262bb6SDmitry Osipenko ptimer_stop(ptimer); 1925b262bb6SDmitry Osipenko 1935b262bb6SDmitry Osipenko triggered = false; 1945b262bb6SDmitry Osipenko 19533d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 12 + 1); 1965b262bb6SDmitry Osipenko 1975b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1985b262bb6SDmitry Osipenko g_assert_false(triggered); 199*072bdb07SMarc-André Lureau ptimer_free(ptimer); 2005b262bb6SDmitry Osipenko } 2015b262bb6SDmitry Osipenko 2025b262bb6SDmitry Osipenko static void check_periodic(gconstpointer arg) 2035b262bb6SDmitry Osipenko { 2045b262bb6SDmitry Osipenko const uint8_t *policy = arg; 2055b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 2065b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 207293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 208516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 20956700e1aSDmitry Osipenko bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); 210057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 2115b262bb6SDmitry Osipenko 2125b262bb6SDmitry Osipenko triggered = false; 2135b262bb6SDmitry Osipenko 2145b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 2155b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 10, 1); 2165b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 2175b262bb6SDmitry Osipenko 218293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); 219293130aaSDmitry Osipenko g_assert_false(triggered); 220293130aaSDmitry Osipenko 22133d44cdfSDmitry Osipenko qemu_clock_step(1); 2225b262bb6SDmitry Osipenko 223057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); 224293130aaSDmitry Osipenko g_assert_false(triggered); 225293130aaSDmitry Osipenko 22633d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 10 - 1); 227293130aaSDmitry Osipenko 228293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 10); 229293130aaSDmitry Osipenko g_assert_true(triggered); 230293130aaSDmitry Osipenko 23133d44cdfSDmitry Osipenko qemu_clock_step(1); 232293130aaSDmitry Osipenko 233057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 234057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 2355b262bb6SDmitry Osipenko g_assert_true(triggered); 2365b262bb6SDmitry Osipenko 2375b262bb6SDmitry Osipenko triggered = false; 2385b262bb6SDmitry Osipenko 2395b262bb6SDmitry Osipenko qemu_clock_step(2000000); 2405b262bb6SDmitry Osipenko 241057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 242057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2435b262bb6SDmitry Osipenko g_assert_false(triggered); 2445b262bb6SDmitry Osipenko 2455b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 20); 2465b262bb6SDmitry Osipenko 247293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 20); 248293130aaSDmitry Osipenko g_assert_false(triggered); 249293130aaSDmitry Osipenko 25033d44cdfSDmitry Osipenko qemu_clock_step(1); 251293130aaSDmitry Osipenko 252057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 20 : 19); 253293130aaSDmitry Osipenko g_assert_false(triggered); 254293130aaSDmitry Osipenko 25533d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 11 + 1); 2565b262bb6SDmitry Osipenko 257057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 9 : 8); 2585b262bb6SDmitry Osipenko g_assert_false(triggered); 2595b262bb6SDmitry Osipenko 2605b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 10); 2615b262bb6SDmitry Osipenko 262057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 263057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 264293130aaSDmitry Osipenko g_assert_true(triggered); 265293130aaSDmitry Osipenko 266293130aaSDmitry Osipenko triggered = false; 267293130aaSDmitry Osipenko 268293130aaSDmitry Osipenko ptimer_set_count(ptimer, 3); 269293130aaSDmitry Osipenko 270293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); 271293130aaSDmitry Osipenko g_assert_false(triggered); 272293130aaSDmitry Osipenko 27333d44cdfSDmitry Osipenko qemu_clock_step(1); 274293130aaSDmitry Osipenko 275057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 3 : 2); 276293130aaSDmitry Osipenko g_assert_false(triggered); 277293130aaSDmitry Osipenko 278293130aaSDmitry Osipenko qemu_clock_step(2000000 * 4); 279293130aaSDmitry Osipenko 280057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 281057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2825b262bb6SDmitry Osipenko g_assert_true(triggered); 2835b262bb6SDmitry Osipenko 2845b262bb6SDmitry Osipenko ptimer_stop(ptimer); 2855b262bb6SDmitry Osipenko triggered = false; 2865b262bb6SDmitry Osipenko 2875b262bb6SDmitry Osipenko qemu_clock_step(2000000); 2885b262bb6SDmitry Osipenko 289057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 290057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2915b262bb6SDmitry Osipenko g_assert_false(triggered); 2925b262bb6SDmitry Osipenko 2935b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 3); 2945b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 2955b262bb6SDmitry Osipenko 29633d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 3 + 1); 2975b262bb6SDmitry Osipenko 298057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 299057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 3005b262bb6SDmitry Osipenko g_assert_true(triggered); 3015b262bb6SDmitry Osipenko 3025b262bb6SDmitry Osipenko triggered = false; 3035b262bb6SDmitry Osipenko 3045b262bb6SDmitry Osipenko qemu_clock_step(2000000); 3055b262bb6SDmitry Osipenko 306057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 307057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 3085b262bb6SDmitry Osipenko g_assert_false(triggered); 3095b262bb6SDmitry Osipenko 3105b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 0); 31156700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 31256700e1aSDmitry Osipenko no_immediate_reload ? 0 : 10); 313516deb42SDmitry Osipenko 314516deb42SDmitry Osipenko if (no_immediate_trigger) { 315516deb42SDmitry Osipenko g_assert_false(triggered); 316516deb42SDmitry Osipenko } else { 3175b262bb6SDmitry Osipenko g_assert_true(triggered); 318516deb42SDmitry Osipenko } 3195b262bb6SDmitry Osipenko 3205b262bb6SDmitry Osipenko triggered = false; 3215b262bb6SDmitry Osipenko 32233d44cdfSDmitry Osipenko qemu_clock_step(1); 3235b262bb6SDmitry Osipenko 32456700e1aSDmitry Osipenko if (no_immediate_reload) { 32556700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 32656700e1aSDmitry Osipenko g_assert_false(triggered); 32756700e1aSDmitry Osipenko 32856700e1aSDmitry Osipenko qemu_clock_step(2000000); 32956700e1aSDmitry Osipenko 33056700e1aSDmitry Osipenko if (no_immediate_trigger) { 33156700e1aSDmitry Osipenko g_assert_true(triggered); 33256700e1aSDmitry Osipenko } else { 33356700e1aSDmitry Osipenko g_assert_false(triggered); 33456700e1aSDmitry Osipenko } 33556700e1aSDmitry Osipenko 33656700e1aSDmitry Osipenko triggered = false; 33756700e1aSDmitry Osipenko } 33856700e1aSDmitry Osipenko 339057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); 340293130aaSDmitry Osipenko g_assert_false(triggered); 341293130aaSDmitry Osipenko 342293130aaSDmitry Osipenko qemu_clock_step(2000000 * 12); 343293130aaSDmitry Osipenko 344057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 345057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3465b262bb6SDmitry Osipenko g_assert_true(triggered); 3475b262bb6SDmitry Osipenko 3485b262bb6SDmitry Osipenko ptimer_stop(ptimer); 3495b262bb6SDmitry Osipenko 3505b262bb6SDmitry Osipenko triggered = false; 3515b262bb6SDmitry Osipenko 352293130aaSDmitry Osipenko qemu_clock_step(2000000 * 10); 3535b262bb6SDmitry Osipenko 354057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 355057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3565b262bb6SDmitry Osipenko g_assert_false(triggered); 3575b262bb6SDmitry Osipenko 3585b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 3595b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 0); 3605b262bb6SDmitry Osipenko 36133d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 3625b262bb6SDmitry Osipenko 363057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 364057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3655b262bb6SDmitry Osipenko g_assert_false(triggered); 366*072bdb07SMarc-André Lureau ptimer_free(ptimer); 3675b262bb6SDmitry Osipenko } 3685b262bb6SDmitry Osipenko 3695b262bb6SDmitry Osipenko static void check_on_the_fly_mode_change(gconstpointer arg) 3705b262bb6SDmitry Osipenko { 3715b262bb6SDmitry Osipenko const uint8_t *policy = arg; 3725b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 3735b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 374293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 375057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 3765b262bb6SDmitry Osipenko 3775b262bb6SDmitry Osipenko triggered = false; 3785b262bb6SDmitry Osipenko 3795b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 3805b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 10, 1); 3815b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 3825b262bb6SDmitry Osipenko 38333d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 9 + 1); 3845b262bb6SDmitry Osipenko 385057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 386293130aaSDmitry Osipenko g_assert_false(triggered); 387293130aaSDmitry Osipenko 3885b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 3895b262bb6SDmitry Osipenko 390057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 3915b262bb6SDmitry Osipenko g_assert_false(triggered); 3925b262bb6SDmitry Osipenko 3935b262bb6SDmitry Osipenko qemu_clock_step(2000000); 3945b262bb6SDmitry Osipenko 395057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 396057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 3975b262bb6SDmitry Osipenko g_assert_true(triggered); 3985b262bb6SDmitry Osipenko 3995b262bb6SDmitry Osipenko triggered = false; 4005b262bb6SDmitry Osipenko 4015b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 9); 4025b262bb6SDmitry Osipenko 4035b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4045b262bb6SDmitry Osipenko 405057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 406057516feSDmitry Osipenko (no_round_down ? 1 : 0) + (wrap_policy ? 1 : 0)); 4075b262bb6SDmitry Osipenko g_assert_false(triggered); 4085b262bb6SDmitry Osipenko 4095b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 3); 4105b262bb6SDmitry Osipenko 4115b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4125b262bb6SDmitry Osipenko g_assert_true(triggered); 413*072bdb07SMarc-André Lureau ptimer_free(ptimer); 4145b262bb6SDmitry Osipenko } 4155b262bb6SDmitry Osipenko 4165b262bb6SDmitry Osipenko static void check_on_the_fly_period_change(gconstpointer arg) 4175b262bb6SDmitry Osipenko { 4185b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4195b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4205b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 421057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 4225b262bb6SDmitry Osipenko 4235b262bb6SDmitry Osipenko triggered = false; 4245b262bb6SDmitry Osipenko 4255b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 4265b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 8, 1); 4275b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4285b262bb6SDmitry Osipenko 42933d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4305b262bb6SDmitry Osipenko 431057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4325b262bb6SDmitry Osipenko g_assert_false(triggered); 4335b262bb6SDmitry Osipenko 4345b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 4000000); 435057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4365b262bb6SDmitry Osipenko 43733d44cdfSDmitry Osipenko qemu_clock_step(4000000 * 2 + 1); 4385b262bb6SDmitry Osipenko 439057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); 4405b262bb6SDmitry Osipenko g_assert_false(triggered); 4415b262bb6SDmitry Osipenko 4425b262bb6SDmitry Osipenko qemu_clock_step(4000000 * 2); 4435b262bb6SDmitry Osipenko 4445b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4455b262bb6SDmitry Osipenko g_assert_true(triggered); 446*072bdb07SMarc-André Lureau ptimer_free(ptimer); 4475b262bb6SDmitry Osipenko } 4485b262bb6SDmitry Osipenko 4495b262bb6SDmitry Osipenko static void check_on_the_fly_freq_change(gconstpointer arg) 4505b262bb6SDmitry Osipenko { 4515b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4525b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4535b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 454057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 4555b262bb6SDmitry Osipenko 4565b262bb6SDmitry Osipenko triggered = false; 4575b262bb6SDmitry Osipenko 4585b262bb6SDmitry Osipenko ptimer_set_freq(ptimer, 500); 4595b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 8, 1); 4605b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4615b262bb6SDmitry Osipenko 46233d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4635b262bb6SDmitry Osipenko 464057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4655b262bb6SDmitry Osipenko g_assert_false(triggered); 4665b262bb6SDmitry Osipenko 4675b262bb6SDmitry Osipenko ptimer_set_freq(ptimer, 250); 468057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4695b262bb6SDmitry Osipenko 47033d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4715b262bb6SDmitry Osipenko 472057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); 4735b262bb6SDmitry Osipenko g_assert_false(triggered); 4745b262bb6SDmitry Osipenko 4755b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 4); 4765b262bb6SDmitry Osipenko 4775b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4785b262bb6SDmitry Osipenko g_assert_true(triggered); 479*072bdb07SMarc-André Lureau ptimer_free(ptimer); 4805b262bb6SDmitry Osipenko } 4815b262bb6SDmitry Osipenko 4825b262bb6SDmitry Osipenko static void check_run_with_period_0(gconstpointer arg) 4835b262bb6SDmitry Osipenko { 4845b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4855b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4865b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 4875b262bb6SDmitry Osipenko 4885b262bb6SDmitry Osipenko triggered = false; 4895b262bb6SDmitry Osipenko 4905b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 99); 4915b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4925b262bb6SDmitry Osipenko 4935b262bb6SDmitry Osipenko qemu_clock_step(10 * NANOSECONDS_PER_SECOND); 4945b262bb6SDmitry Osipenko 4955b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99); 4965b262bb6SDmitry Osipenko g_assert_false(triggered); 497*072bdb07SMarc-André Lureau ptimer_free(ptimer); 4985b262bb6SDmitry Osipenko } 4995b262bb6SDmitry Osipenko 5005b262bb6SDmitry Osipenko static void check_run_with_delta_0(gconstpointer arg) 5015b262bb6SDmitry Osipenko { 5025b262bb6SDmitry Osipenko const uint8_t *policy = arg; 5035b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 5045b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 505293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 506516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 50756700e1aSDmitry Osipenko bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); 508057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 5095b262bb6SDmitry Osipenko 5105b262bb6SDmitry Osipenko triggered = false; 5115b262bb6SDmitry Osipenko 5125b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 5135b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 99, 0); 5145b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 51556700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 51656700e1aSDmitry Osipenko no_immediate_reload ? 0 : 99); 517516deb42SDmitry Osipenko 518516deb42SDmitry Osipenko if (no_immediate_trigger) { 519516deb42SDmitry Osipenko g_assert_false(triggered); 520516deb42SDmitry Osipenko } else { 5215b262bb6SDmitry Osipenko g_assert_true(triggered); 522516deb42SDmitry Osipenko } 5235b262bb6SDmitry Osipenko 5245b262bb6SDmitry Osipenko triggered = false; 5255b262bb6SDmitry Osipenko 52656700e1aSDmitry Osipenko if (no_immediate_trigger || no_immediate_reload) { 52733d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 528516deb42SDmitry Osipenko 52956700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 530057516feSDmitry Osipenko no_immediate_reload ? 0 : (no_round_down ? 98 : 97)); 53156700e1aSDmitry Osipenko 53256700e1aSDmitry Osipenko if (no_immediate_trigger && no_immediate_reload) { 53356700e1aSDmitry Osipenko g_assert_true(triggered); 53456700e1aSDmitry Osipenko 53556700e1aSDmitry Osipenko triggered = false; 53656700e1aSDmitry Osipenko } else { 537516deb42SDmitry Osipenko g_assert_false(triggered); 53856700e1aSDmitry Osipenko } 539516deb42SDmitry Osipenko 540516deb42SDmitry Osipenko ptimer_set_count(ptimer, 99); 541516deb42SDmitry Osipenko ptimer_run(ptimer, 1); 542516deb42SDmitry Osipenko } 543516deb42SDmitry Osipenko 54433d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 5455b262bb6SDmitry Osipenko 546057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); 5475b262bb6SDmitry Osipenko g_assert_false(triggered); 5485b262bb6SDmitry Osipenko 5495b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 97); 5505b262bb6SDmitry Osipenko 551057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 5525b262bb6SDmitry Osipenko g_assert_false(triggered); 5535b262bb6SDmitry Osipenko 5545b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 2); 5555b262bb6SDmitry Osipenko 5565b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 5575b262bb6SDmitry Osipenko g_assert_true(triggered); 5585b262bb6SDmitry Osipenko 5595b262bb6SDmitry Osipenko triggered = false; 5605b262bb6SDmitry Osipenko 5615b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 0); 5625b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 56356700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 56456700e1aSDmitry Osipenko no_immediate_reload ? 0 : 99); 565516deb42SDmitry Osipenko 566516deb42SDmitry Osipenko if (no_immediate_trigger) { 567516deb42SDmitry Osipenko g_assert_false(triggered); 568516deb42SDmitry Osipenko } else { 5695b262bb6SDmitry Osipenko g_assert_true(triggered); 570516deb42SDmitry Osipenko } 5715b262bb6SDmitry Osipenko 5725b262bb6SDmitry Osipenko triggered = false; 5735b262bb6SDmitry Osipenko 57433d44cdfSDmitry Osipenko qemu_clock_step(1); 575293130aaSDmitry Osipenko 57656700e1aSDmitry Osipenko if (no_immediate_reload) { 57756700e1aSDmitry Osipenko qemu_clock_step(2000000); 57856700e1aSDmitry Osipenko } 57956700e1aSDmitry Osipenko 580057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 99 : 98); 58156700e1aSDmitry Osipenko 58256700e1aSDmitry Osipenko if (no_immediate_reload && no_immediate_trigger) { 58356700e1aSDmitry Osipenko g_assert_true(triggered); 58456700e1aSDmitry Osipenko } else { 585293130aaSDmitry Osipenko g_assert_false(triggered); 58656700e1aSDmitry Osipenko } 587293130aaSDmitry Osipenko 588293130aaSDmitry Osipenko triggered = false; 589293130aaSDmitry Osipenko 590293130aaSDmitry Osipenko qemu_clock_step(2000000); 5915b262bb6SDmitry Osipenko 592057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); 5935b262bb6SDmitry Osipenko g_assert_false(triggered); 5945b262bb6SDmitry Osipenko 5955b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 98); 5965b262bb6SDmitry Osipenko 597057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 598057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 99 : 98)); 5995b262bb6SDmitry Osipenko g_assert_true(triggered); 6005b262bb6SDmitry Osipenko 6015b262bb6SDmitry Osipenko ptimer_stop(ptimer); 602*072bdb07SMarc-André Lureau ptimer_free(ptimer); 6035b262bb6SDmitry Osipenko } 6045b262bb6SDmitry Osipenko 6055b262bb6SDmitry Osipenko static void check_periodic_with_load_0(gconstpointer arg) 6065b262bb6SDmitry Osipenko { 6075b262bb6SDmitry Osipenko const uint8_t *policy = arg; 6085b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 6095b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 6102e74583bSDmitry Osipenko bool continuous_trigger = (*policy & PTIMER_POLICY_CONTINUOUS_TRIGGER); 611516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 6125b262bb6SDmitry Osipenko 6135b262bb6SDmitry Osipenko triggered = false; 6145b262bb6SDmitry Osipenko 6155b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 6165b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 6175b262bb6SDmitry Osipenko 6185b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 619516deb42SDmitry Osipenko 620516deb42SDmitry Osipenko if (no_immediate_trigger) { 621516deb42SDmitry Osipenko g_assert_false(triggered); 622516deb42SDmitry Osipenko } else { 6235b262bb6SDmitry Osipenko g_assert_true(triggered); 624516deb42SDmitry Osipenko } 6255b262bb6SDmitry Osipenko 6265b262bb6SDmitry Osipenko triggered = false; 6275b262bb6SDmitry Osipenko 62833d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 6295b262bb6SDmitry Osipenko 6305b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 6312e74583bSDmitry Osipenko 632516deb42SDmitry Osipenko if (continuous_trigger || no_immediate_trigger) { 6332e74583bSDmitry Osipenko g_assert_true(triggered); 6342e74583bSDmitry Osipenko } else { 6355b262bb6SDmitry Osipenko g_assert_false(triggered); 6362e74583bSDmitry Osipenko } 6375b262bb6SDmitry Osipenko 638293130aaSDmitry Osipenko triggered = false; 639293130aaSDmitry Osipenko 640293130aaSDmitry Osipenko ptimer_set_count(ptimer, 10); 641293130aaSDmitry Osipenko ptimer_run(ptimer, 0); 642293130aaSDmitry Osipenko 64333d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 10 + 1); 644293130aaSDmitry Osipenko 645293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 646293130aaSDmitry Osipenko g_assert_true(triggered); 647293130aaSDmitry Osipenko 648293130aaSDmitry Osipenko triggered = false; 649293130aaSDmitry Osipenko 65033d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 651293130aaSDmitry Osipenko 652293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 6532e74583bSDmitry Osipenko 6542e74583bSDmitry Osipenko if (continuous_trigger) { 6552e74583bSDmitry Osipenko g_assert_true(triggered); 6562e74583bSDmitry Osipenko } else { 657293130aaSDmitry Osipenko g_assert_false(triggered); 6582e74583bSDmitry Osipenko } 659293130aaSDmitry Osipenko 6605b262bb6SDmitry Osipenko ptimer_stop(ptimer); 661*072bdb07SMarc-André Lureau ptimer_free(ptimer); 6625b262bb6SDmitry Osipenko } 6635b262bb6SDmitry Osipenko 6645b262bb6SDmitry Osipenko static void check_oneshot_with_load_0(gconstpointer arg) 6655b262bb6SDmitry Osipenko { 6665b262bb6SDmitry Osipenko const uint8_t *policy = arg; 6675b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 6685b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 669516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 6705b262bb6SDmitry Osipenko 6715b262bb6SDmitry Osipenko triggered = false; 6725b262bb6SDmitry Osipenko 6735b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 6745b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 6755b262bb6SDmitry Osipenko 6765b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 677516deb42SDmitry Osipenko 678516deb42SDmitry Osipenko if (no_immediate_trigger) { 679516deb42SDmitry Osipenko g_assert_false(triggered); 680516deb42SDmitry Osipenko } else { 6815b262bb6SDmitry Osipenko g_assert_true(triggered); 682516deb42SDmitry Osipenko } 6835b262bb6SDmitry Osipenko 6845b262bb6SDmitry Osipenko triggered = false; 6855b262bb6SDmitry Osipenko 68633d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 6875b262bb6SDmitry Osipenko 6885b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 689516deb42SDmitry Osipenko 690516deb42SDmitry Osipenko if (no_immediate_trigger) { 691516deb42SDmitry Osipenko g_assert_true(triggered); 692516deb42SDmitry Osipenko } else { 6935b262bb6SDmitry Osipenko g_assert_false(triggered); 6945b262bb6SDmitry Osipenko } 695*072bdb07SMarc-André Lureau 696*072bdb07SMarc-André Lureau ptimer_free(ptimer); 697516deb42SDmitry Osipenko } 6985b262bb6SDmitry Osipenko 6995b262bb6SDmitry Osipenko static void add_ptimer_tests(uint8_t policy) 7005b262bb6SDmitry Osipenko { 701*072bdb07SMarc-André Lureau char policy_name[256] = ""; 702*072bdb07SMarc-André Lureau char *tmp; 7035b262bb6SDmitry Osipenko 7045b262bb6SDmitry Osipenko if (policy == PTIMER_POLICY_DEFAULT) { 7055b262bb6SDmitry Osipenko g_sprintf(policy_name, "default"); 7065b262bb6SDmitry Osipenko } 7075b262bb6SDmitry Osipenko 708293130aaSDmitry Osipenko if (policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD) { 709293130aaSDmitry Osipenko g_strlcat(policy_name, "wrap_after_one_period,", 256); 710293130aaSDmitry Osipenko } 711293130aaSDmitry Osipenko 7122e74583bSDmitry Osipenko if (policy & PTIMER_POLICY_CONTINUOUS_TRIGGER) { 7132e74583bSDmitry Osipenko g_strlcat(policy_name, "continuous_trigger,", 256); 7142e74583bSDmitry Osipenko } 7152e74583bSDmitry Osipenko 716516deb42SDmitry Osipenko if (policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER) { 717516deb42SDmitry Osipenko g_strlcat(policy_name, "no_immediate_trigger,", 256); 718516deb42SDmitry Osipenko } 719516deb42SDmitry Osipenko 72056700e1aSDmitry Osipenko if (policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD) { 72156700e1aSDmitry Osipenko g_strlcat(policy_name, "no_immediate_reload,", 256); 72256700e1aSDmitry Osipenko } 72356700e1aSDmitry Osipenko 724057516feSDmitry Osipenko if (policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN) { 725057516feSDmitry Osipenko g_strlcat(policy_name, "no_counter_rounddown,", 256); 726057516feSDmitry Osipenko } 727057516feSDmitry Osipenko 728*072bdb07SMarc-André Lureau g_test_add_data_func_full( 729*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name), 730*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_set_count, g_free); 731*072bdb07SMarc-André Lureau g_free(tmp); 7325b262bb6SDmitry Osipenko 733*072bdb07SMarc-André Lureau g_test_add_data_func_full( 734*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name), 735*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_set_limit, g_free); 736*072bdb07SMarc-André Lureau g_free(tmp); 7375b262bb6SDmitry Osipenko 738*072bdb07SMarc-André Lureau g_test_add_data_func_full( 739*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name), 740*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_oneshot, g_free); 741*072bdb07SMarc-André Lureau g_free(tmp); 7425b262bb6SDmitry Osipenko 743*072bdb07SMarc-André Lureau g_test_add_data_func_full( 744*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name), 745*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_periodic, g_free); 746*072bdb07SMarc-André Lureau g_free(tmp); 7475b262bb6SDmitry Osipenko 748*072bdb07SMarc-André Lureau g_test_add_data_func_full( 749*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", 750*072bdb07SMarc-André Lureau policy_name), 751*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free); 752*072bdb07SMarc-André Lureau g_free(tmp); 7535b262bb6SDmitry Osipenko 754*072bdb07SMarc-André Lureau g_test_add_data_func_full( 755*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", 756*072bdb07SMarc-André Lureau policy_name), 757*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_on_the_fly_period_change, g_free); 758*072bdb07SMarc-André Lureau g_free(tmp); 7595b262bb6SDmitry Osipenko 760*072bdb07SMarc-André Lureau g_test_add_data_func_full( 761*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", 762*072bdb07SMarc-André Lureau policy_name), 763*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free); 764*072bdb07SMarc-André Lureau g_free(tmp); 7655b262bb6SDmitry Osipenko 766*072bdb07SMarc-André Lureau g_test_add_data_func_full( 767*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s", 768*072bdb07SMarc-André Lureau policy_name), 769*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_run_with_period_0, g_free); 770*072bdb07SMarc-André Lureau g_free(tmp); 7715b262bb6SDmitry Osipenko 772*072bdb07SMarc-André Lureau g_test_add_data_func_full( 773*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", 774*072bdb07SMarc-André Lureau policy_name), 775*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_run_with_delta_0, g_free); 776*072bdb07SMarc-André Lureau g_free(tmp); 7775b262bb6SDmitry Osipenko 778*072bdb07SMarc-André Lureau g_test_add_data_func_full( 779*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", 780*072bdb07SMarc-André Lureau policy_name), 781*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_periodic_with_load_0, g_free); 782*072bdb07SMarc-André Lureau g_free(tmp); 7835b262bb6SDmitry Osipenko 784*072bdb07SMarc-André Lureau g_test_add_data_func_full( 785*072bdb07SMarc-André Lureau tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", 786*072bdb07SMarc-André Lureau policy_name), 787*072bdb07SMarc-André Lureau g_memdup(&policy, 1), check_oneshot_with_load_0, g_free); 788*072bdb07SMarc-André Lureau g_free(tmp); 7895b262bb6SDmitry Osipenko } 7905b262bb6SDmitry Osipenko 791293130aaSDmitry Osipenko static void add_all_ptimer_policies_comb_tests(void) 792293130aaSDmitry Osipenko { 793057516feSDmitry Osipenko int last_policy = PTIMER_POLICY_NO_COUNTER_ROUND_DOWN; 794293130aaSDmitry Osipenko int policy = PTIMER_POLICY_DEFAULT; 795293130aaSDmitry Osipenko 796293130aaSDmitry Osipenko for (; policy < (last_policy << 1); policy++) { 797293130aaSDmitry Osipenko add_ptimer_tests(policy); 798293130aaSDmitry Osipenko } 799293130aaSDmitry Osipenko } 800293130aaSDmitry Osipenko 8015b262bb6SDmitry Osipenko int main(int argc, char **argv) 8025b262bb6SDmitry Osipenko { 8035b262bb6SDmitry Osipenko int i; 8045b262bb6SDmitry Osipenko 8055b262bb6SDmitry Osipenko g_test_init(&argc, &argv, NULL); 8065b262bb6SDmitry Osipenko 8075b262bb6SDmitry Osipenko for (i = 0; i < QEMU_CLOCK_MAX; i++) { 8085b262bb6SDmitry Osipenko main_loop_tlg.tl[i] = g_new0(QEMUTimerList, 1); 8095b262bb6SDmitry Osipenko } 8105b262bb6SDmitry Osipenko 811293130aaSDmitry Osipenko add_all_ptimer_policies_comb_tests(); 8125b262bb6SDmitry Osipenko 8135b262bb6SDmitry Osipenko qtest_allowed = true; 8145b262bb6SDmitry Osipenko 8155b262bb6SDmitry Osipenko return g_test_run(); 8165b262bb6SDmitry Osipenko } 817