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(QEMUBHFunc *cb, void *opaque) 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