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); 765b262bb6SDmitry Osipenko } 775b262bb6SDmitry Osipenko 785b262bb6SDmitry Osipenko static void check_set_limit(gconstpointer arg) 795b262bb6SDmitry Osipenko { 805b262bb6SDmitry Osipenko const uint8_t *policy = arg; 815b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 825b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 835b262bb6SDmitry Osipenko 845b262bb6SDmitry Osipenko triggered = false; 855b262bb6SDmitry Osipenko 865b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 1000, 0); 875b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 885b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 1000); 895b262bb6SDmitry Osipenko g_assert_false(triggered); 905b262bb6SDmitry Osipenko 915b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 2000, 1); 925b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000); 935b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000); 945b262bb6SDmitry Osipenko g_assert_false(triggered); 955b262bb6SDmitry Osipenko } 965b262bb6SDmitry Osipenko 975b262bb6SDmitry Osipenko static void check_oneshot(gconstpointer arg) 985b262bb6SDmitry Osipenko { 995b262bb6SDmitry Osipenko const uint8_t *policy = arg; 1005b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 1015b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 102057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 1035b262bb6SDmitry Osipenko 1045b262bb6SDmitry Osipenko triggered = false; 1055b262bb6SDmitry Osipenko 1065b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 1075b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 10); 1085b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1095b262bb6SDmitry Osipenko 110*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 2 + 1); 1115b262bb6SDmitry Osipenko 112057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1135b262bb6SDmitry Osipenko g_assert_false(triggered); 1145b262bb6SDmitry Osipenko 1155b262bb6SDmitry Osipenko ptimer_stop(ptimer); 1165b262bb6SDmitry Osipenko 117057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1185b262bb6SDmitry Osipenko g_assert_false(triggered); 1195b262bb6SDmitry Osipenko 1205b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 11); 1215b262bb6SDmitry Osipenko 122057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1235b262bb6SDmitry Osipenko g_assert_false(triggered); 1245b262bb6SDmitry Osipenko 1255b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1265b262bb6SDmitry Osipenko 127*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 7 + 1); 1285b262bb6SDmitry Osipenko 129057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 130057516feSDmitry Osipenko 131057516feSDmitry Osipenko if (no_round_down) { 132057516feSDmitry Osipenko g_assert_false(triggered); 133057516feSDmitry Osipenko } else { 1345b262bb6SDmitry Osipenko g_assert_true(triggered); 1355b262bb6SDmitry Osipenko 1365b262bb6SDmitry Osipenko triggered = false; 137057516feSDmitry Osipenko } 1385b262bb6SDmitry Osipenko 1395b262bb6SDmitry Osipenko qemu_clock_step(2000000); 1405b262bb6SDmitry Osipenko 1415b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 142057516feSDmitry Osipenko 143057516feSDmitry Osipenko if (no_round_down) { 144057516feSDmitry Osipenko g_assert_true(triggered); 145057516feSDmitry Osipenko 146057516feSDmitry Osipenko triggered = false; 147057516feSDmitry Osipenko } else { 1485b262bb6SDmitry Osipenko g_assert_false(triggered); 149057516feSDmitry Osipenko } 1505b262bb6SDmitry Osipenko 1515b262bb6SDmitry Osipenko qemu_clock_step(4000000); 1525b262bb6SDmitry Osipenko 1535b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1545b262bb6SDmitry Osipenko g_assert_false(triggered); 1555b262bb6SDmitry Osipenko 1565b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 10); 1575b262bb6SDmitry Osipenko 158*33d44cdfSDmitry Osipenko qemu_clock_step(20000000 + 1); 1595b262bb6SDmitry Osipenko 1605b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); 1615b262bb6SDmitry Osipenko g_assert_false(triggered); 1625b262bb6SDmitry Osipenko 1635b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 9, 1); 1645b262bb6SDmitry Osipenko 165*33d44cdfSDmitry Osipenko qemu_clock_step(20000000 + 1); 1665b262bb6SDmitry Osipenko 1675b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); 1685b262bb6SDmitry Osipenko g_assert_false(triggered); 1695b262bb6SDmitry Osipenko 1705b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 1715b262bb6SDmitry Osipenko 172*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 1735b262bb6SDmitry Osipenko 174057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); 1755b262bb6SDmitry Osipenko g_assert_false(triggered); 1765b262bb6SDmitry Osipenko 1775b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 20); 1785b262bb6SDmitry Osipenko 179*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 19 + 1); 1805b262bb6SDmitry Osipenko 181057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 1825b262bb6SDmitry Osipenko g_assert_false(triggered); 1835b262bb6SDmitry Osipenko 1845b262bb6SDmitry Osipenko qemu_clock_step(2000000); 1855b262bb6SDmitry Osipenko 1865b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1875b262bb6SDmitry Osipenko g_assert_true(triggered); 1885b262bb6SDmitry Osipenko 1895b262bb6SDmitry Osipenko ptimer_stop(ptimer); 1905b262bb6SDmitry Osipenko 1915b262bb6SDmitry Osipenko triggered = false; 1925b262bb6SDmitry Osipenko 193*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 12 + 1); 1945b262bb6SDmitry Osipenko 1955b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 1965b262bb6SDmitry Osipenko g_assert_false(triggered); 1975b262bb6SDmitry Osipenko } 1985b262bb6SDmitry Osipenko 1995b262bb6SDmitry Osipenko static void check_periodic(gconstpointer arg) 2005b262bb6SDmitry Osipenko { 2015b262bb6SDmitry Osipenko const uint8_t *policy = arg; 2025b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 2035b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 204293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 205516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 20656700e1aSDmitry Osipenko bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); 207057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 2085b262bb6SDmitry Osipenko 2095b262bb6SDmitry Osipenko triggered = false; 2105b262bb6SDmitry Osipenko 2115b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 2125b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 10, 1); 2135b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 2145b262bb6SDmitry Osipenko 215293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); 216293130aaSDmitry Osipenko g_assert_false(triggered); 217293130aaSDmitry Osipenko 218*33d44cdfSDmitry Osipenko qemu_clock_step(1); 2195b262bb6SDmitry Osipenko 220057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); 221293130aaSDmitry Osipenko g_assert_false(triggered); 222293130aaSDmitry Osipenko 223*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 10 - 1); 224293130aaSDmitry Osipenko 225293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 10); 226293130aaSDmitry Osipenko g_assert_true(triggered); 227293130aaSDmitry Osipenko 228*33d44cdfSDmitry Osipenko qemu_clock_step(1); 229293130aaSDmitry Osipenko 230057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 231057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 2325b262bb6SDmitry Osipenko g_assert_true(triggered); 2335b262bb6SDmitry Osipenko 2345b262bb6SDmitry Osipenko triggered = false; 2355b262bb6SDmitry Osipenko 2365b262bb6SDmitry Osipenko qemu_clock_step(2000000); 2375b262bb6SDmitry Osipenko 238057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 239057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2405b262bb6SDmitry Osipenko g_assert_false(triggered); 2415b262bb6SDmitry Osipenko 2425b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 20); 2435b262bb6SDmitry Osipenko 244293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 20); 245293130aaSDmitry Osipenko g_assert_false(triggered); 246293130aaSDmitry Osipenko 247*33d44cdfSDmitry Osipenko qemu_clock_step(1); 248293130aaSDmitry Osipenko 249057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 20 : 19); 250293130aaSDmitry Osipenko g_assert_false(triggered); 251293130aaSDmitry Osipenko 252*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 11 + 1); 2535b262bb6SDmitry Osipenko 254057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 9 : 8); 2555b262bb6SDmitry Osipenko g_assert_false(triggered); 2565b262bb6SDmitry Osipenko 2575b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 10); 2585b262bb6SDmitry Osipenko 259057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 260057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 261293130aaSDmitry Osipenko g_assert_true(triggered); 262293130aaSDmitry Osipenko 263293130aaSDmitry Osipenko triggered = false; 264293130aaSDmitry Osipenko 265293130aaSDmitry Osipenko ptimer_set_count(ptimer, 3); 266293130aaSDmitry Osipenko 267293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); 268293130aaSDmitry Osipenko g_assert_false(triggered); 269293130aaSDmitry Osipenko 270*33d44cdfSDmitry Osipenko qemu_clock_step(1); 271293130aaSDmitry Osipenko 272057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 3 : 2); 273293130aaSDmitry Osipenko g_assert_false(triggered); 274293130aaSDmitry Osipenko 275293130aaSDmitry Osipenko qemu_clock_step(2000000 * 4); 276293130aaSDmitry Osipenko 277057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 278057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2795b262bb6SDmitry Osipenko g_assert_true(triggered); 2805b262bb6SDmitry Osipenko 2815b262bb6SDmitry Osipenko ptimer_stop(ptimer); 2825b262bb6SDmitry Osipenko triggered = false; 2835b262bb6SDmitry Osipenko 2845b262bb6SDmitry Osipenko qemu_clock_step(2000000); 2855b262bb6SDmitry Osipenko 286057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 287057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 2885b262bb6SDmitry Osipenko g_assert_false(triggered); 2895b262bb6SDmitry Osipenko 2905b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 3); 2915b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 2925b262bb6SDmitry Osipenko 293*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 3 + 1); 2945b262bb6SDmitry Osipenko 295057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 296057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 2975b262bb6SDmitry Osipenko g_assert_true(triggered); 2985b262bb6SDmitry Osipenko 2995b262bb6SDmitry Osipenko triggered = false; 3005b262bb6SDmitry Osipenko 3015b262bb6SDmitry Osipenko qemu_clock_step(2000000); 3025b262bb6SDmitry Osipenko 303057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 304057516feSDmitry Osipenko (no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); 3055b262bb6SDmitry Osipenko g_assert_false(triggered); 3065b262bb6SDmitry Osipenko 3075b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 0); 30856700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 30956700e1aSDmitry Osipenko no_immediate_reload ? 0 : 10); 310516deb42SDmitry Osipenko 311516deb42SDmitry Osipenko if (no_immediate_trigger) { 312516deb42SDmitry Osipenko g_assert_false(triggered); 313516deb42SDmitry Osipenko } else { 3145b262bb6SDmitry Osipenko g_assert_true(triggered); 315516deb42SDmitry Osipenko } 3165b262bb6SDmitry Osipenko 3175b262bb6SDmitry Osipenko triggered = false; 3185b262bb6SDmitry Osipenko 319*33d44cdfSDmitry Osipenko qemu_clock_step(1); 3205b262bb6SDmitry Osipenko 32156700e1aSDmitry Osipenko if (no_immediate_reload) { 32256700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 32356700e1aSDmitry Osipenko g_assert_false(triggered); 32456700e1aSDmitry Osipenko 32556700e1aSDmitry Osipenko qemu_clock_step(2000000); 32656700e1aSDmitry Osipenko 32756700e1aSDmitry Osipenko if (no_immediate_trigger) { 32856700e1aSDmitry Osipenko g_assert_true(triggered); 32956700e1aSDmitry Osipenko } else { 33056700e1aSDmitry Osipenko g_assert_false(triggered); 33156700e1aSDmitry Osipenko } 33256700e1aSDmitry Osipenko 33356700e1aSDmitry Osipenko triggered = false; 33456700e1aSDmitry Osipenko } 33556700e1aSDmitry Osipenko 336057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); 337293130aaSDmitry Osipenko g_assert_false(triggered); 338293130aaSDmitry Osipenko 339293130aaSDmitry Osipenko qemu_clock_step(2000000 * 12); 340293130aaSDmitry Osipenko 341057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 342057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3435b262bb6SDmitry Osipenko g_assert_true(triggered); 3445b262bb6SDmitry Osipenko 3455b262bb6SDmitry Osipenko ptimer_stop(ptimer); 3465b262bb6SDmitry Osipenko 3475b262bb6SDmitry Osipenko triggered = false; 3485b262bb6SDmitry Osipenko 349293130aaSDmitry Osipenko qemu_clock_step(2000000 * 10); 3505b262bb6SDmitry Osipenko 351057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 352057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3535b262bb6SDmitry Osipenko g_assert_false(triggered); 3545b262bb6SDmitry Osipenko 3555b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 3565b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 0); 3575b262bb6SDmitry Osipenko 358*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 3595b262bb6SDmitry Osipenko 360057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 361057516feSDmitry Osipenko (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); 3625b262bb6SDmitry Osipenko g_assert_false(triggered); 3635b262bb6SDmitry Osipenko } 3645b262bb6SDmitry Osipenko 3655b262bb6SDmitry Osipenko static void check_on_the_fly_mode_change(gconstpointer arg) 3665b262bb6SDmitry Osipenko { 3675b262bb6SDmitry Osipenko const uint8_t *policy = arg; 3685b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 3695b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 370293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 371057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 3725b262bb6SDmitry Osipenko 3735b262bb6SDmitry Osipenko triggered = false; 3745b262bb6SDmitry Osipenko 3755b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 3765b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 10, 1); 3775b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 3785b262bb6SDmitry Osipenko 379*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 9 + 1); 3805b262bb6SDmitry Osipenko 381057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 382293130aaSDmitry Osipenko g_assert_false(triggered); 383293130aaSDmitry Osipenko 3845b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 3855b262bb6SDmitry Osipenko 386057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 3875b262bb6SDmitry Osipenko g_assert_false(triggered); 3885b262bb6SDmitry Osipenko 3895b262bb6SDmitry Osipenko qemu_clock_step(2000000); 3905b262bb6SDmitry Osipenko 391057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 392057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 10 : 9)); 3935b262bb6SDmitry Osipenko g_assert_true(triggered); 3945b262bb6SDmitry Osipenko 3955b262bb6SDmitry Osipenko triggered = false; 3965b262bb6SDmitry Osipenko 3975b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 9); 3985b262bb6SDmitry Osipenko 3995b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4005b262bb6SDmitry Osipenko 401057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 402057516feSDmitry Osipenko (no_round_down ? 1 : 0) + (wrap_policy ? 1 : 0)); 4035b262bb6SDmitry Osipenko g_assert_false(triggered); 4045b262bb6SDmitry Osipenko 4055b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 3); 4065b262bb6SDmitry Osipenko 4075b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4085b262bb6SDmitry Osipenko g_assert_true(triggered); 4095b262bb6SDmitry Osipenko } 4105b262bb6SDmitry Osipenko 4115b262bb6SDmitry Osipenko static void check_on_the_fly_period_change(gconstpointer arg) 4125b262bb6SDmitry Osipenko { 4135b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4145b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4155b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 416057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 4175b262bb6SDmitry Osipenko 4185b262bb6SDmitry Osipenko triggered = false; 4195b262bb6SDmitry Osipenko 4205b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 4215b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 8, 1); 4225b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4235b262bb6SDmitry Osipenko 424*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4255b262bb6SDmitry Osipenko 426057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4275b262bb6SDmitry Osipenko g_assert_false(triggered); 4285b262bb6SDmitry Osipenko 4295b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 4000000); 430057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4315b262bb6SDmitry Osipenko 432*33d44cdfSDmitry Osipenko qemu_clock_step(4000000 * 2 + 1); 4335b262bb6SDmitry Osipenko 434057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); 4355b262bb6SDmitry Osipenko g_assert_false(triggered); 4365b262bb6SDmitry Osipenko 4375b262bb6SDmitry Osipenko qemu_clock_step(4000000 * 2); 4385b262bb6SDmitry Osipenko 4395b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4405b262bb6SDmitry Osipenko g_assert_true(triggered); 4415b262bb6SDmitry Osipenko } 4425b262bb6SDmitry Osipenko 4435b262bb6SDmitry Osipenko static void check_on_the_fly_freq_change(gconstpointer arg) 4445b262bb6SDmitry Osipenko { 4455b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4465b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4475b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 448057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 4495b262bb6SDmitry Osipenko 4505b262bb6SDmitry Osipenko triggered = false; 4515b262bb6SDmitry Osipenko 4525b262bb6SDmitry Osipenko ptimer_set_freq(ptimer, 500); 4535b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 8, 1); 4545b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4555b262bb6SDmitry Osipenko 456*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4575b262bb6SDmitry Osipenko 458057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4595b262bb6SDmitry Osipenko g_assert_false(triggered); 4605b262bb6SDmitry Osipenko 4615b262bb6SDmitry Osipenko ptimer_set_freq(ptimer, 250); 462057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); 4635b262bb6SDmitry Osipenko 464*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 4 + 1); 4655b262bb6SDmitry Osipenko 466057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); 4675b262bb6SDmitry Osipenko g_assert_false(triggered); 4685b262bb6SDmitry Osipenko 4695b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 4); 4705b262bb6SDmitry Osipenko 4715b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 4725b262bb6SDmitry Osipenko g_assert_true(triggered); 4735b262bb6SDmitry Osipenko } 4745b262bb6SDmitry Osipenko 4755b262bb6SDmitry Osipenko static void check_run_with_period_0(gconstpointer arg) 4765b262bb6SDmitry Osipenko { 4775b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4785b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4795b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 4805b262bb6SDmitry Osipenko 4815b262bb6SDmitry Osipenko triggered = false; 4825b262bb6SDmitry Osipenko 4835b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 99); 4845b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 4855b262bb6SDmitry Osipenko 4865b262bb6SDmitry Osipenko qemu_clock_step(10 * NANOSECONDS_PER_SECOND); 4875b262bb6SDmitry Osipenko 4885b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99); 4895b262bb6SDmitry Osipenko g_assert_false(triggered); 4905b262bb6SDmitry Osipenko } 4915b262bb6SDmitry Osipenko 4925b262bb6SDmitry Osipenko static void check_run_with_delta_0(gconstpointer arg) 4935b262bb6SDmitry Osipenko { 4945b262bb6SDmitry Osipenko const uint8_t *policy = arg; 4955b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 4965b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 497293130aaSDmitry Osipenko bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); 498516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 49956700e1aSDmitry Osipenko bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); 500057516feSDmitry Osipenko bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); 5015b262bb6SDmitry Osipenko 5025b262bb6SDmitry Osipenko triggered = false; 5035b262bb6SDmitry Osipenko 5045b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 5055b262bb6SDmitry Osipenko ptimer_set_limit(ptimer, 99, 0); 5065b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 50756700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 50856700e1aSDmitry Osipenko no_immediate_reload ? 0 : 99); 509516deb42SDmitry Osipenko 510516deb42SDmitry Osipenko if (no_immediate_trigger) { 511516deb42SDmitry Osipenko g_assert_false(triggered); 512516deb42SDmitry Osipenko } else { 5135b262bb6SDmitry Osipenko g_assert_true(triggered); 514516deb42SDmitry Osipenko } 5155b262bb6SDmitry Osipenko 5165b262bb6SDmitry Osipenko triggered = false; 5175b262bb6SDmitry Osipenko 51856700e1aSDmitry Osipenko if (no_immediate_trigger || no_immediate_reload) { 519*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 520516deb42SDmitry Osipenko 52156700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 522057516feSDmitry Osipenko no_immediate_reload ? 0 : (no_round_down ? 98 : 97)); 52356700e1aSDmitry Osipenko 52456700e1aSDmitry Osipenko if (no_immediate_trigger && no_immediate_reload) { 52556700e1aSDmitry Osipenko g_assert_true(triggered); 52656700e1aSDmitry Osipenko 52756700e1aSDmitry Osipenko triggered = false; 52856700e1aSDmitry Osipenko } else { 529516deb42SDmitry Osipenko g_assert_false(triggered); 53056700e1aSDmitry Osipenko } 531516deb42SDmitry Osipenko 532516deb42SDmitry Osipenko ptimer_set_count(ptimer, 99); 533516deb42SDmitry Osipenko ptimer_run(ptimer, 1); 534516deb42SDmitry Osipenko } 535516deb42SDmitry Osipenko 536*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 5375b262bb6SDmitry Osipenko 538057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); 5395b262bb6SDmitry Osipenko g_assert_false(triggered); 5405b262bb6SDmitry Osipenko 5415b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 97); 5425b262bb6SDmitry Osipenko 543057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); 5445b262bb6SDmitry Osipenko g_assert_false(triggered); 5455b262bb6SDmitry Osipenko 5465b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 2); 5475b262bb6SDmitry Osipenko 5485b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 5495b262bb6SDmitry Osipenko g_assert_true(triggered); 5505b262bb6SDmitry Osipenko 5515b262bb6SDmitry Osipenko triggered = false; 5525b262bb6SDmitry Osipenko 5535b262bb6SDmitry Osipenko ptimer_set_count(ptimer, 0); 5545b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 55556700e1aSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 55656700e1aSDmitry Osipenko no_immediate_reload ? 0 : 99); 557516deb42SDmitry Osipenko 558516deb42SDmitry Osipenko if (no_immediate_trigger) { 559516deb42SDmitry Osipenko g_assert_false(triggered); 560516deb42SDmitry Osipenko } else { 5615b262bb6SDmitry Osipenko g_assert_true(triggered); 562516deb42SDmitry Osipenko } 5635b262bb6SDmitry Osipenko 5645b262bb6SDmitry Osipenko triggered = false; 5655b262bb6SDmitry Osipenko 566*33d44cdfSDmitry Osipenko qemu_clock_step(1); 567293130aaSDmitry Osipenko 56856700e1aSDmitry Osipenko if (no_immediate_reload) { 56956700e1aSDmitry Osipenko qemu_clock_step(2000000); 57056700e1aSDmitry Osipenko } 57156700e1aSDmitry Osipenko 572057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 99 : 98); 57356700e1aSDmitry Osipenko 57456700e1aSDmitry Osipenko if (no_immediate_reload && no_immediate_trigger) { 57556700e1aSDmitry Osipenko g_assert_true(triggered); 57656700e1aSDmitry Osipenko } else { 577293130aaSDmitry Osipenko g_assert_false(triggered); 57856700e1aSDmitry Osipenko } 579293130aaSDmitry Osipenko 580293130aaSDmitry Osipenko triggered = false; 581293130aaSDmitry Osipenko 582293130aaSDmitry Osipenko qemu_clock_step(2000000); 5835b262bb6SDmitry Osipenko 584057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); 5855b262bb6SDmitry Osipenko g_assert_false(triggered); 5865b262bb6SDmitry Osipenko 5875b262bb6SDmitry Osipenko qemu_clock_step(2000000 * 98); 5885b262bb6SDmitry Osipenko 589057516feSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 590057516feSDmitry Osipenko wrap_policy ? 0 : (no_round_down ? 99 : 98)); 5915b262bb6SDmitry Osipenko g_assert_true(triggered); 5925b262bb6SDmitry Osipenko 5935b262bb6SDmitry Osipenko ptimer_stop(ptimer); 5945b262bb6SDmitry Osipenko } 5955b262bb6SDmitry Osipenko 5965b262bb6SDmitry Osipenko static void check_periodic_with_load_0(gconstpointer arg) 5975b262bb6SDmitry Osipenko { 5985b262bb6SDmitry Osipenko const uint8_t *policy = arg; 5995b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 6005b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 6012e74583bSDmitry Osipenko bool continuous_trigger = (*policy & PTIMER_POLICY_CONTINUOUS_TRIGGER); 602516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 6035b262bb6SDmitry Osipenko 6045b262bb6SDmitry Osipenko triggered = false; 6055b262bb6SDmitry Osipenko 6065b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 6075b262bb6SDmitry Osipenko ptimer_run(ptimer, 0); 6085b262bb6SDmitry Osipenko 6095b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 610516deb42SDmitry Osipenko 611516deb42SDmitry Osipenko if (no_immediate_trigger) { 612516deb42SDmitry Osipenko g_assert_false(triggered); 613516deb42SDmitry Osipenko } else { 6145b262bb6SDmitry Osipenko g_assert_true(triggered); 615516deb42SDmitry Osipenko } 6165b262bb6SDmitry Osipenko 6175b262bb6SDmitry Osipenko triggered = false; 6185b262bb6SDmitry Osipenko 619*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 6205b262bb6SDmitry Osipenko 6215b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 6222e74583bSDmitry Osipenko 623516deb42SDmitry Osipenko if (continuous_trigger || no_immediate_trigger) { 6242e74583bSDmitry Osipenko g_assert_true(triggered); 6252e74583bSDmitry Osipenko } else { 6265b262bb6SDmitry Osipenko g_assert_false(triggered); 6272e74583bSDmitry Osipenko } 6285b262bb6SDmitry Osipenko 629293130aaSDmitry Osipenko triggered = false; 630293130aaSDmitry Osipenko 631293130aaSDmitry Osipenko ptimer_set_count(ptimer, 10); 632293130aaSDmitry Osipenko ptimer_run(ptimer, 0); 633293130aaSDmitry Osipenko 634*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 * 10 + 1); 635293130aaSDmitry Osipenko 636293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 637293130aaSDmitry Osipenko g_assert_true(triggered); 638293130aaSDmitry Osipenko 639293130aaSDmitry Osipenko triggered = false; 640293130aaSDmitry Osipenko 641*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 642293130aaSDmitry Osipenko 643293130aaSDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 6442e74583bSDmitry Osipenko 6452e74583bSDmitry Osipenko if (continuous_trigger) { 6462e74583bSDmitry Osipenko g_assert_true(triggered); 6472e74583bSDmitry Osipenko } else { 648293130aaSDmitry Osipenko g_assert_false(triggered); 6492e74583bSDmitry Osipenko } 650293130aaSDmitry Osipenko 6515b262bb6SDmitry Osipenko ptimer_stop(ptimer); 6525b262bb6SDmitry Osipenko } 6535b262bb6SDmitry Osipenko 6545b262bb6SDmitry Osipenko static void check_oneshot_with_load_0(gconstpointer arg) 6555b262bb6SDmitry Osipenko { 6565b262bb6SDmitry Osipenko const uint8_t *policy = arg; 6575b262bb6SDmitry Osipenko QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); 6585b262bb6SDmitry Osipenko ptimer_state *ptimer = ptimer_init(bh, *policy); 659516deb42SDmitry Osipenko bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); 6605b262bb6SDmitry Osipenko 6615b262bb6SDmitry Osipenko triggered = false; 6625b262bb6SDmitry Osipenko 6635b262bb6SDmitry Osipenko ptimer_set_period(ptimer, 2000000); 6645b262bb6SDmitry Osipenko ptimer_run(ptimer, 1); 6655b262bb6SDmitry Osipenko 6665b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 667516deb42SDmitry Osipenko 668516deb42SDmitry Osipenko if (no_immediate_trigger) { 669516deb42SDmitry Osipenko g_assert_false(triggered); 670516deb42SDmitry Osipenko } else { 6715b262bb6SDmitry Osipenko g_assert_true(triggered); 672516deb42SDmitry Osipenko } 6735b262bb6SDmitry Osipenko 6745b262bb6SDmitry Osipenko triggered = false; 6755b262bb6SDmitry Osipenko 676*33d44cdfSDmitry Osipenko qemu_clock_step(2000000 + 1); 6775b262bb6SDmitry Osipenko 6785b262bb6SDmitry Osipenko g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); 679516deb42SDmitry Osipenko 680516deb42SDmitry Osipenko if (no_immediate_trigger) { 681516deb42SDmitry Osipenko g_assert_true(triggered); 682516deb42SDmitry Osipenko } else { 6835b262bb6SDmitry Osipenko g_assert_false(triggered); 6845b262bb6SDmitry Osipenko } 685516deb42SDmitry Osipenko } 6865b262bb6SDmitry Osipenko 6875b262bb6SDmitry Osipenko static void add_ptimer_tests(uint8_t policy) 6885b262bb6SDmitry Osipenko { 6895b262bb6SDmitry Osipenko uint8_t *ppolicy = g_malloc(1); 690293130aaSDmitry Osipenko char *policy_name = g_malloc0(256); 6915b262bb6SDmitry Osipenko 6925b262bb6SDmitry Osipenko *ppolicy = policy; 6935b262bb6SDmitry Osipenko 6945b262bb6SDmitry Osipenko if (policy == PTIMER_POLICY_DEFAULT) { 6955b262bb6SDmitry Osipenko g_sprintf(policy_name, "default"); 6965b262bb6SDmitry Osipenko } 6975b262bb6SDmitry Osipenko 698293130aaSDmitry Osipenko if (policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD) { 699293130aaSDmitry Osipenko g_strlcat(policy_name, "wrap_after_one_period,", 256); 700293130aaSDmitry Osipenko } 701293130aaSDmitry Osipenko 7022e74583bSDmitry Osipenko if (policy & PTIMER_POLICY_CONTINUOUS_TRIGGER) { 7032e74583bSDmitry Osipenko g_strlcat(policy_name, "continuous_trigger,", 256); 7042e74583bSDmitry Osipenko } 7052e74583bSDmitry Osipenko 706516deb42SDmitry Osipenko if (policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER) { 707516deb42SDmitry Osipenko g_strlcat(policy_name, "no_immediate_trigger,", 256); 708516deb42SDmitry Osipenko } 709516deb42SDmitry Osipenko 71056700e1aSDmitry Osipenko if (policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD) { 71156700e1aSDmitry Osipenko g_strlcat(policy_name, "no_immediate_reload,", 256); 71256700e1aSDmitry Osipenko } 71356700e1aSDmitry Osipenko 714057516feSDmitry Osipenko if (policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN) { 715057516feSDmitry Osipenko g_strlcat(policy_name, "no_counter_rounddown,", 256); 716057516feSDmitry Osipenko } 717057516feSDmitry Osipenko 71824b94625SPaolo Bonzini g_test_add_data_func( 7195b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/set_count policy=%s", policy_name), 7205b262bb6SDmitry Osipenko ppolicy, check_set_count); 7215b262bb6SDmitry Osipenko 72224b94625SPaolo Bonzini g_test_add_data_func( 7235b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/set_limit policy=%s", policy_name), 7245b262bb6SDmitry Osipenko ppolicy, check_set_limit); 7255b262bb6SDmitry Osipenko 72624b94625SPaolo Bonzini g_test_add_data_func( 7275b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/oneshot policy=%s", policy_name), 7285b262bb6SDmitry Osipenko ppolicy, check_oneshot); 7295b262bb6SDmitry Osipenko 73024b94625SPaolo Bonzini g_test_add_data_func( 7315b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/periodic policy=%s", policy_name), 7325b262bb6SDmitry Osipenko ppolicy, check_periodic); 7335b262bb6SDmitry Osipenko 73424b94625SPaolo Bonzini g_test_add_data_func( 7355b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name), 7365b262bb6SDmitry Osipenko ppolicy, check_on_the_fly_mode_change); 7375b262bb6SDmitry Osipenko 73824b94625SPaolo Bonzini g_test_add_data_func( 7395b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name), 7405b262bb6SDmitry Osipenko ppolicy, check_on_the_fly_period_change); 7415b262bb6SDmitry Osipenko 74224b94625SPaolo Bonzini g_test_add_data_func( 7435b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name), 7445b262bb6SDmitry Osipenko ppolicy, check_on_the_fly_freq_change); 7455b262bb6SDmitry Osipenko 74624b94625SPaolo Bonzini g_test_add_data_func( 7475b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name), 7485b262bb6SDmitry Osipenko ppolicy, check_run_with_period_0); 7495b262bb6SDmitry Osipenko 75024b94625SPaolo Bonzini g_test_add_data_func( 7515b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name), 7525b262bb6SDmitry Osipenko ppolicy, check_run_with_delta_0); 7535b262bb6SDmitry Osipenko 75424b94625SPaolo Bonzini g_test_add_data_func( 7555b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name), 7565b262bb6SDmitry Osipenko ppolicy, check_periodic_with_load_0); 7575b262bb6SDmitry Osipenko 75824b94625SPaolo Bonzini g_test_add_data_func( 7595b262bb6SDmitry Osipenko g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name), 7605b262bb6SDmitry Osipenko ppolicy, check_oneshot_with_load_0); 7615b262bb6SDmitry Osipenko } 7625b262bb6SDmitry Osipenko 763293130aaSDmitry Osipenko static void add_all_ptimer_policies_comb_tests(void) 764293130aaSDmitry Osipenko { 765057516feSDmitry Osipenko int last_policy = PTIMER_POLICY_NO_COUNTER_ROUND_DOWN; 766293130aaSDmitry Osipenko int policy = PTIMER_POLICY_DEFAULT; 767293130aaSDmitry Osipenko 768293130aaSDmitry Osipenko for (; policy < (last_policy << 1); policy++) { 769293130aaSDmitry Osipenko add_ptimer_tests(policy); 770293130aaSDmitry Osipenko } 771293130aaSDmitry Osipenko } 772293130aaSDmitry Osipenko 7735b262bb6SDmitry Osipenko int main(int argc, char **argv) 7745b262bb6SDmitry Osipenko { 7755b262bb6SDmitry Osipenko int i; 7765b262bb6SDmitry Osipenko 7775b262bb6SDmitry Osipenko g_test_init(&argc, &argv, NULL); 7785b262bb6SDmitry Osipenko 7795b262bb6SDmitry Osipenko for (i = 0; i < QEMU_CLOCK_MAX; i++) { 7805b262bb6SDmitry Osipenko main_loop_tlg.tl[i] = g_new0(QEMUTimerList, 1); 7815b262bb6SDmitry Osipenko } 7825b262bb6SDmitry Osipenko 783293130aaSDmitry Osipenko add_all_ptimer_policies_comb_tests(); 7845b262bb6SDmitry Osipenko 7855b262bb6SDmitry Osipenko qtest_allowed = true; 7865b262bb6SDmitry Osipenko 7875b262bb6SDmitry Osipenko return g_test_run(); 7885b262bb6SDmitry Osipenko } 789