1
2
3
4
5
6
7
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
16#include "ptimer-test.h"
17
18const VMStateInfo vmstate_info_uint8;
19const VMStateInfo vmstate_info_uint32;
20const VMStateInfo vmstate_info_uint64;
21const VMStateInfo vmstate_info_int64;
22const VMStateInfo vmstate_info_timer;
23
24struct QEMUBH {
25 QEMUBHFunc *cb;
26 void *opaque;
27};
28
29QEMUTimerListGroup main_loop_tlg;
30
31int64_t ptimer_test_time_ns;
32
33
34int use_icount;
35bool qtest_allowed;
36
37void timer_init_full(QEMUTimer *ts,
38 QEMUTimerListGroup *timer_list_group, QEMUClockType type,
39 int scale, int attributes,
40 QEMUTimerCB *cb, void *opaque)
41{
42 if (!timer_list_group) {
43 timer_list_group = &main_loop_tlg;
44 }
45 ts->timer_list = timer_list_group->tl[type];
46 ts->cb = cb;
47 ts->opaque = opaque;
48 ts->scale = scale;
49 ts->attributes = attributes;
50 ts->expire_time = -1;
51}
52
53void timer_mod(QEMUTimer *ts, int64_t expire_time)
54{
55 QEMUTimerList *timer_list = ts->timer_list;
56 QEMUTimer *t = &timer_list->active_timers;
57
58 while (t->next != NULL) {
59 if (t->next == ts) {
60 break;
61 }
62
63 t = t->next;
64 }
65
66 ts->expire_time = MAX(expire_time * ts->scale, 0);
67 ts->next = NULL;
68 t->next = ts;
69}
70
71void timer_del(QEMUTimer *ts)
72{
73 QEMUTimerList *timer_list = ts->timer_list;
74 QEMUTimer *t = &timer_list->active_timers;
75
76 while (t->next != NULL) {
77 if (t->next == ts) {
78 t->next = ts->next;
79 return;
80 }
81
82 t = t->next;
83 }
84}
85
86int64_t qemu_clock_get_ns(QEMUClockType type)
87{
88 return ptimer_test_time_ns;
89}
90
91int64_t qemu_clock_deadline_ns_all(QEMUClockType type, int attr_mask)
92{
93 QEMUTimerList *timer_list = main_loop_tlg.tl[QEMU_CLOCK_VIRTUAL];
94 QEMUTimer *t = timer_list->active_timers.next;
95 int64_t deadline = -1;
96
97 while (t != NULL) {
98 if (deadline == -1) {
99 deadline = t->expire_time;
100 } else {
101 deadline = MIN(deadline, t->expire_time);
102 }
103
104 t = t->next;
105 }
106
107 return deadline;
108}
109
110QEMUBH *qemu_bh_new_full(QEMUBHFunc *cb, void *opaque, const char *name)
111{
112 QEMUBH *bh = g_new(QEMUBH, 1);
113
114 bh->cb = cb;
115 bh->opaque = opaque;
116
117 return bh;
118}
119
120void qemu_bh_delete(QEMUBH *bh)
121{
122 g_free(bh);
123}
124