| /* |
| * Stubs for the ptimer-test |
| * |
| * Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com> |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * See the COPYING file in the top-level directory. |
| * |
| */ |
| |
| #include "qemu/osdep.h" |
| #include "qemu/main-loop.h" |
| #include "sysemu/replay.h" |
| #include "migration/vmstate.h" |
| |
| #include "ptimer-test.h" |
| |
| const VMStateInfo vmstate_info_uint8; |
| const VMStateInfo vmstate_info_uint32; |
| const VMStateInfo vmstate_info_uint64; |
| const VMStateInfo vmstate_info_int64; |
| const VMStateInfo vmstate_info_timer; |
| |
| struct QEMUBH { |
| QEMUBHFunc *cb; |
| void *opaque; |
| }; |
| |
| QEMUTimerListGroup main_loop_tlg; |
| |
| int64_t ptimer_test_time_ns; |
| |
| /* Do not artificially limit period - see hw/core/ptimer.c. */ |
| int use_icount = 1; |
| bool qtest_allowed; |
| |
| void timer_init_full(QEMUTimer *ts, |
| QEMUTimerListGroup *timer_list_group, QEMUClockType type, |
| int scale, int attributes, |
| QEMUTimerCB *cb, void *opaque) |
| { |
| if (!timer_list_group) { |
| timer_list_group = &main_loop_tlg; |
| } |
| ts->timer_list = timer_list_group->tl[type]; |
| ts->cb = cb; |
| ts->opaque = opaque; |
| ts->scale = scale; |
| ts->attributes = attributes; |
| ts->expire_time = -1; |
| } |
| |
| void timer_mod(QEMUTimer *ts, int64_t expire_time) |
| { |
| QEMUTimerList *timer_list = ts->timer_list; |
| QEMUTimer *t = &timer_list->active_timers; |
| |
| while (t->next != NULL) { |
| if (t->next == ts) { |
| break; |
| } |
| |
| t = t->next; |
| } |
| |
| ts->expire_time = MAX(expire_time * ts->scale, 0); |
| ts->next = NULL; |
| t->next = ts; |
| } |
| |
| void timer_del(QEMUTimer *ts) |
| { |
| QEMUTimerList *timer_list = ts->timer_list; |
| QEMUTimer *t = &timer_list->active_timers; |
| |
| while (t->next != NULL) { |
| if (t->next == ts) { |
| t->next = ts->next; |
| return; |
| } |
| |
| t = t->next; |
| } |
| } |
| |
| int64_t qemu_clock_get_ns(QEMUClockType type) |
| { |
| return ptimer_test_time_ns; |
| } |
| |
| int64_t qemu_clock_deadline_ns_all(QEMUClockType type) |
| { |
| QEMUTimerList *timer_list = main_loop_tlg.tl[type]; |
| QEMUTimer *t = timer_list->active_timers.next; |
| int64_t deadline = -1; |
| |
| while (t != NULL) { |
| if (deadline == -1) { |
| deadline = t->expire_time; |
| } else { |
| deadline = MIN(deadline, t->expire_time); |
| } |
| |
| t = t->next; |
| } |
| |
| return deadline; |
| } |
| |
| QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque) |
| { |
| QEMUBH *bh = g_new(QEMUBH, 1); |
| |
| bh->cb = cb; |
| bh->opaque = opaque; |
| |
| return bh; |
| } |
| |
| void qemu_bh_delete(QEMUBH *bh) |
| { |
| g_free(bh); |
| } |
| |
| void replay_bh_schedule_event(QEMUBH *bh) |
| { |
| bh->cb(bh->opaque); |
| } |