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 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 33void timer_init_tl(QEMUTimer *ts, 34 QEMUTimerList *timer_list, int scale, 35 QEMUTimerCB *cb, void *opaque) 36{ 37 ts->timer_list = timer_list; 38 ts->cb = cb; 39 ts->opaque = opaque; 40 ts->scale = scale; 41 ts->expire_time = -1; 42} 43 44void timer_mod(QEMUTimer *ts, int64_t expire_time) 45{ 46 QEMUTimerList *timer_list = ts->timer_list; 47 QEMUTimer *t = &timer_list->active_timers; 48 49 while (t->next != NULL) { 50 if (t->next == ts) { 51 break; 52 } 53 54 t = t->next; 55 } 56 57 ts->expire_time = MAX(expire_time * ts->scale, 0); 58 ts->next = NULL; 59 t->next = ts; 60} 61 62void timer_del(QEMUTimer *ts) 63{ 64 QEMUTimerList *timer_list = ts->timer_list; 65 QEMUTimer *t = &timer_list->active_timers; 66 67 while (t->next != NULL) { 68 if (t->next == ts) { 69 t->next = ts->next; 70 return; 71 } 72 73 t = t->next; 74 } 75} 76 77int64_t qemu_clock_get_ns(QEMUClockType type) 78{ 79 return ptimer_test_time_ns; 80} 81 82int64_t qemu_clock_deadline_ns_all(QEMUClockType type) 83{ 84 QEMUTimerList *timer_list = main_loop_tlg.tl[type]; 85 QEMUTimer *t = timer_list->active_timers.next; 86 int64_t deadline = -1; 87 88 while (t != NULL) { 89 if (deadline == -1) { 90 deadline = t->expire_time; 91 } else { 92 deadline = MIN(deadline, t->expire_time); 93 } 94 95 t = t->next; 96 } 97 98 return deadline; 99} 100 101QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque) 102{ 103 QEMUBH *bh = g_new(QEMUBH, 1); 104 105 bh->cb = cb; 106 bh->opaque = opaque; 107 108 return bh; 109} 110 111void replay_bh_schedule_event(QEMUBH *bh) 112{ 113 bh->cb(bh->opaque); 114} 115