xref: /qemu/tests/unit/ptimer-test-stubs.c (revision 727385c4)
1 /*
2  * Stubs for the ptimer-test
3  *
4  * Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com>
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7  * See the COPYING file in the top-level directory.
8  *
9  */
10 
11 #include "qemu/osdep.h"
12 #include "qemu/main-loop.h"
13 #include "sysemu/replay.h"
14 #include "migration/vmstate.h"
15 #include "sysemu/cpu-timers.h"
16 
17 #include "ptimer-test.h"
18 
19 const VMStateInfo vmstate_info_uint8;
20 const VMStateInfo vmstate_info_uint32;
21 const VMStateInfo vmstate_info_uint64;
22 const VMStateInfo vmstate_info_int64;
23 const VMStateInfo vmstate_info_timer;
24 
25 struct QEMUBH {
26     QEMUBHFunc *cb;
27     void *opaque;
28 };
29 
30 QEMUTimerListGroup main_loop_tlg;
31 
32 int64_t ptimer_test_time_ns;
33 
34 /* under qtest_enabled(), will not artificially limit period - see hw/core/ptimer.c. */
35 int use_icount;
36 bool qtest_allowed;
37 
38 void timer_init_full(QEMUTimer *ts,
39                      QEMUTimerListGroup *timer_list_group, QEMUClockType type,
40                      int scale, int attributes,
41                      QEMUTimerCB *cb, void *opaque)
42 {
43     if (!timer_list_group) {
44         timer_list_group = &main_loop_tlg;
45     }
46     ts->timer_list = timer_list_group->tl[type];
47     ts->cb = cb;
48     ts->opaque = opaque;
49     ts->scale = scale;
50     ts->attributes = attributes;
51     ts->expire_time = -1;
52 }
53 
54 void timer_mod(QEMUTimer *ts, int64_t expire_time)
55 {
56     QEMUTimerList *timer_list = ts->timer_list;
57     QEMUTimer *t = &timer_list->active_timers;
58 
59     while (t->next != NULL) {
60         if (t->next == ts) {
61             break;
62         }
63 
64         t = t->next;
65     }
66 
67     ts->expire_time = MAX(expire_time * ts->scale, 0);
68     ts->next = NULL;
69     t->next = ts;
70 }
71 
72 void timer_del(QEMUTimer *ts)
73 {
74     QEMUTimerList *timer_list = ts->timer_list;
75     QEMUTimer *t = &timer_list->active_timers;
76 
77     while (t->next != NULL) {
78         if (t->next == ts) {
79             t->next = ts->next;
80             return;
81         }
82 
83         t = t->next;
84     }
85 }
86 
87 int64_t qemu_clock_get_ns(QEMUClockType type)
88 {
89     return ptimer_test_time_ns;
90 }
91 
92 int64_t qemu_clock_deadline_ns_all(QEMUClockType type, int attr_mask)
93 {
94     QEMUTimerList *timer_list = main_loop_tlg.tl[QEMU_CLOCK_VIRTUAL];
95     QEMUTimer *t = timer_list->active_timers.next;
96     int64_t deadline = -1;
97 
98     while (t != NULL) {
99         if (deadline == -1) {
100             deadline = t->expire_time;
101         } else {
102             deadline = MIN(deadline, t->expire_time);
103         }
104 
105         t = t->next;
106     }
107 
108     return deadline;
109 }
110 
111 QEMUBH *qemu_bh_new_full(QEMUBHFunc *cb, void *opaque, const char *name)
112 {
113     QEMUBH *bh = g_new(QEMUBH, 1);
114 
115     bh->cb = cb;
116     bh->opaque = opaque;
117 
118     return bh;
119 }
120 
121 void qemu_bh_delete(QEMUBH *bh)
122 {
123     g_free(bh);
124 }
125