xref: /qemu/tests/unit/ptimer-test.c (revision 33d44cdf00f5e2520c2ff3ece162a317f408cefb)
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