cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

ptimer-test-stubs.c (2710B)


      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
     19const VMStateInfo vmstate_info_uint8;
     20const VMStateInfo vmstate_info_uint32;
     21const VMStateInfo vmstate_info_uint64;
     22const VMStateInfo vmstate_info_int64;
     23const VMStateInfo vmstate_info_timer;
     24
     25struct QEMUBH {
     26    QEMUBHFunc *cb;
     27    void *opaque;
     28};
     29
     30QEMUTimerListGroup main_loop_tlg;
     31
     32int64_t ptimer_test_time_ns;
     33
     34/* under qtest_enabled(), will not artificially limit period - see hw/core/ptimer.c. */
     35int use_icount;
     36bool qtest_allowed;
     37
     38void 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
     54void 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
     72void 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
     87int64_t qemu_clock_get_ns(QEMUClockType type)
     88{
     89    return ptimer_test_time_ns;
     90}
     91
     92int64_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
    111QEMUBH *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
    121void qemu_bh_delete(QEMUBH *bh)
    122{
    123    g_free(bh);
    124}