18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef QEMU_TIMER_H 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define QEMU_TIMER_H 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner#include "qemu/typedefs.h" 56a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "qemu-common.h" 6dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner#include "qemu/notify.h" 76a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* timers */ 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_MS 1000000 11317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_US 1000 12317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_NS 1 13317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 14dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 15dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUClockType: 16dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 17dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The following clock types are available: 18dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 19dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_REALTIME: Real time clock 20dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 21dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The real time clock should be used only for stuff which does not 22dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * change the virtual machine state, as it is run even if the virtual 23dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * machine is stopped. The real time clock has a frequency of 1000 24dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Hz. 25dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 26dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_VIRTUAL: virtual clock 27dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 28dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The virtual clock is only run during the emulation. It is stopped 29dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * when the virtual machine is stopped. Virtual timers use a high 30dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * precision clock, usually cpu cycles (use ticks_per_sec). 31dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 32dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_HOST: host clock 33dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 34dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The host clock should be use for device models that emulate accurate 35dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * real time sources. It will continue to run when the virtual machine 36dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is suspended, and it will reflect system time changes the host may 37dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * undergo (e.g. due to NTP). The host clock has the same precision as 38dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the virtual clock. 39dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 40dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 41dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef enum { 42dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMU_CLOCK_REALTIME = 0, 43dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMU_CLOCK_VIRTUAL = 1, 44dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMU_CLOCK_HOST = 2, 45dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMU_CLOCK_MAX 46dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} QEMUClockType; 47dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 48dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef struct QEMUTimerList QEMUTimerList; 49dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 50dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstruct QEMUTimerListGroup { 51dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerList *tl[QEMU_CLOCK_MAX]; 52dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}; 53dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void QEMUTimerCB(void *opaque); 55dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef void QEMUTimerListNotifyCB(void *opaque); 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 57dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstruct QEMUTimer { 58dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner int64_t expire_time; /* in nanoseconds */ 59dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerList *timer_list; 60dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerCB *cb; 61dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner void *opaque; 62dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimer *next; 63dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner int scale; 64dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}; 65dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 66dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerextern QEMUTimerListGroup main_loop_tlg; 67dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 68dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 69dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUClockType 70dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 72dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 73dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_ns; 74dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 75dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 76dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the nanosecond value of a clock with 77dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type 78dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 79dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in nanoseconds 80dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 81dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t qemu_clock_get_ns(QEMUClockType type); 82dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 83dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 84dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_ms; 85dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 86dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 87dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the millisecond value of a clock with 88dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type 89dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 90dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in milliseconds 91dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 92dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_clock_get_ms(QEMUClockType type) 93317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 94dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return qemu_clock_get_ns(type) / SCALE_MS; 95317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 96317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 97dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 98dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_us; 99dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 100dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 101dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the microsecond value of a clock with 102dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type 103dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 104dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in microseconds 105dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 106dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_clock_get_us(QEMUClockType type) 107317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 108dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return qemu_clock_get_ns(type) / SCALE_US; 109317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 110317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 111dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 112dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_has_timers: 113dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 114dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 115dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a clock's default timer list 116dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has timers attached 117dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 118dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Note that this function should not be used when other threads also access 119dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list. The return value may be outdated by the time it is acted 120dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * upon. 121dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 122dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock's default timer list 123dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has timers attached 124dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 125dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_has_timers(QEMUClockType type); 126dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 127dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 128dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_expired: 129dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 130dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 131dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a clock's default timer list 132dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has an expired clock. 133dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 134dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock's default timer list has 135dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * an expired timer 136dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 137dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_expired(QEMUClockType type); 138dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 139dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 140dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_use_for_deadline: 141dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 142dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 143dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a clock should be used for deadline 144dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * calculations. Some clocks, for instance vm_clock with 145dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * use_icount set, do not count in nanoseconds. Such clocks 146dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are not used for deadline calculations, and are presumed 147dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * to interrupt any poll using qemu_notify/aio_notify 148dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * etc. 149dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 150dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock runs in nanoseconds and 151dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * should be used for a deadline. 152dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 153dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_use_for_deadline(QEMUClockType type); 154dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 155dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 156dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_deadline_ns_all: 157dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 158dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 159dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Calculate the deadline across all timer lists associated 160dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * with a clock (as opposed to just the default one) 161dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * in nanoseconds, or -1 if no timer is set to expire. 162dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 163dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: time until expiry in nanoseconds or -1 164dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 165dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t qemu_clock_deadline_ns_all(QEMUClockType type); 166dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 167dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 168dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_main_loop_timerlist: 169dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 170dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 171dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Return the default timer list assocatiated with a clock. 172dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 173dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the default timer list 174dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 175dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type); 176dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 177dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 178dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_nofify: 179dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 180dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 181dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Call the notifier callback connected with the default timer 182dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * list linked to the clock, or qemu_notify() if none. 183dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 184dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_notify(QEMUClockType type); 185dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 186dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 187dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_enable: 188dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 189dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @enabled: true to enable, false to disable 190dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 191dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Enable or disable a clock 192dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Disabling the clock will wait for related timerlists to stop 193dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * executing qemu_run_timers. Thus, this functions should not 194dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * be used from the callback of a timer that is based on @clock. 195dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Doing so would cause a deadlock. 196dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 197dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Caller should hold BQL. 198dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 199dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_enable(QEMUClockType type, bool enabled); 200dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 201dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 202dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_warp: 203dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 204dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 205dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Warp a clock to a new value 206dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 207dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_warp(QEMUClockType type); 208dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 209dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 210dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_register_reset_notifier: 211dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 212dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @notifier: the notifier function 213dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 214dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Register a notifier function to call when the clock 215dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * concerned is reset. 216dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 217dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_register_reset_notifier(QEMUClockType type, 218dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner Notifier *notifier); 219dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 220dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 221dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_unregister_reset_notifier: 222dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type 223dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @notifier: the notifier function 224dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 225dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Unregister a notifier function to call when the clock 226dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * concerned is reset. 227dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 228dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_unregister_reset_notifier(QEMUClockType type, 229dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner Notifier *notifier); 230dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 231dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 232dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_run_timers: 233dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: clock on which to operate 234dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 235dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run all the timers associated with the default timer list 236dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * of a clock. 237dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 238dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer ran. 239dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 240dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_run_timers(QEMUClockType type); 241dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 242dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 243dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_run_all_timers: 244dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 245dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run all the timers associated with the default timer list 246dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * of every clock. 247dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 248dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer ran. 249dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 250dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_run_all_timers(void); 251dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 252dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 253dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimerList 254dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 255dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 256dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 257dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_new: 258dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type to associate with the timerlist 259dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to call on notification 260dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback 261dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 262dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timerlist associated with the clock of 263dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type. 264dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 265dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the QEMUTimerList created 266dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 267dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUTimerList *timerlist_new(QEMUClockType type, 268dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerListNotifyCB *cb, void *opaque); 269dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 270dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 271dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_free: 272dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to free 273dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 274dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Frees a timer_list. It must have no active timers. 275dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 276dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlist_free(QEMUTimerList *timer_list); 277dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 278dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 279dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_has_timers: 280dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on 281dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 282dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a timer list has active timers 283dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 284dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Note that this function should not be used when other threads also access 285dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list. The return value may be outdated by the time it is acted 286dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * upon. 287dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 288dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer list has timers. 289dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 290dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_has_timers(QEMUTimerList *timer_list); 291dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 292dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 293dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_expired: 294dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on 295dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 296dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a timer list has any timers which 297dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are expired. 298dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 299dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer list has timers which 300dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * have expired. 301dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 302dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_expired(QEMUTimerList *timer_list); 303dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 304dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 305dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_deadline_ns: 306dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on 307dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 308dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the deadline for a timer_list, i.e. 309dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the number of nanoseconds until the first timer 310dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * expires. Return -1 if there are no timers. 311dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 312dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the number of nanoseconds until the earliest 313dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer expires -1 if none 314dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 315dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t timerlist_deadline_ns(QEMUTimerList *timer_list); 316dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 317dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 318dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_get_clock: 319dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on 320dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 321dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the clock type associated with a timer list. 322dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 323dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock type associated with the 324dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer list. 325dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 326dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUClockType timerlist_get_clock(QEMUTimerList *timer_list); 327dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 328dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 329dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_run_timers: 330dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to use 331dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 332dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Call all expired timers associated with the timer list. 333dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 334dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer expired 335dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 336dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_run_timers(QEMUTimerList *timer_list); 337dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 338dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 339dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_notify: 340dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to use 341dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 342dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * call the notifier callback associated with the timer list. 343dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 344dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlist_notify(QEMUTimerList *timer_list); 345dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 346dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 347dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimerListGroup 348dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 349dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 350dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 351dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_init: 352dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group 353dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to call when a notify is required 354dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback. 355dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 356dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise a timer list group. This must already be 357dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * allocated in memory and zeroed. The notifier callback is 358dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * called whenever a clock in the timer list group is 359dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * reenabled or whenever a timer associated with any timer 360dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * list is modified. If @cb is specified as null, qemu_notify() 361dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is used instead. 362dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 363dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlistgroup_init(QEMUTimerListGroup *tlg, 364dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerListNotifyCB *cb, void *opaque); 365dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 366dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 367dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_deinit: 368dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group 369dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 370dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Deinitialise a timer list group. This must already be 371dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * initialised. Note the memory is not freed. 372dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 373dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlistgroup_deinit(QEMUTimerListGroup *tlg); 374dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 375dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 376dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_run_timers: 377dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group 378dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 379dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run the timers associated with a timer list group. 380dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This will run timers on multiple clocks. 381dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 382dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer callback ran 383dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 384dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlistgroup_run_timers(QEMUTimerListGroup *tlg); 385dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 386dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 387dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_deadline_ns: 388dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group 389dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 390dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the deadline of the soonest timer to 391dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * expire associated with any timer list linked to 392dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list group. Only clocks suitable for 393dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * deadline calculation are included. 394dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 395dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the deadline in nanoseconds or -1 if no 396dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timers are to expire. 397dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 398dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg); 399dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 400dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 401dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimer 402dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 403dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 404dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 405dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_init: 406dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer to be initialised 407dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to attach the timer to 408dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr 409dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires 410dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback 411dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 412dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise a new timer and associate it with @timer_list. 413dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The caller is responsible for allocating the memory. 414dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 415dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * You need not call an explicit deinit call. Simply make 416dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * sure it is not on a list with timer_del. 417dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 418dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_init(QEMUTimer *ts, 419dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerList *timer_list, int scale, 420dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerCB *cb, void *opaque); 421dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 422dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 423dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_tl: 424dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to attach the timer to 425dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr 426dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires 427dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback 428dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 429dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Creeate a new timer and associate it with @timer_list. 430dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The memory is allocated by the function. 431dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 432dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This is not the preferred interface unless you know you 433dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are going to call timer_free. Use timer_init instead. 434dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 435dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the timer 436dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 437dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_tl(QEMUTimerList *timer_list, 438dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner int scale, 439dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerCB *cb, 440dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner void *opaque) 441dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{ 442dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimer *ts = g_malloc0(sizeof(QEMUTimer)); 443dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner timer_init(ts, timer_list, scale, cb, opaque); 444dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return ts; 445dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} 446dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 447dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 448dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new: 449dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type to use 450dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr 451dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires 452dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback 453dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 454dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Creeate a new timer and associate it with the default 455dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer list for the clock type @type. 456dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 457dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the timer 458dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 459dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new(QEMUClockType type, int scale, 460dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner QEMUTimerCB *cb, void *opaque) 461dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{ 462dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return timer_new_tl(main_loop_tlg.tl[type], scale, cb, opaque); 463dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} 464dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 465dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 466dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_ns: 467dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer 468dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires 469dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback 470dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 471dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with nanosecond scale on the default timer list 472dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock. 473dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 474dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer 475dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 476dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_ns(QEMUClockType type, QEMUTimerCB *cb, 477dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner void *opaque) 478dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{ 479dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return timer_new(type, SCALE_NS, cb, opaque); 480dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} 481dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 482dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 483dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_us: 484dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer 485dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires 486dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback 487dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 488dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with microsecond scale on the default timer list 489dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock. 490dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 491dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer 492dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 493dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_us(QEMUClockType type, QEMUTimerCB *cb, 494dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner void *opaque) 495dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{ 496dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return timer_new(type, SCALE_US, cb, opaque); 497dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} 498dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 499dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 500dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_ms: 501dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer 502dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires 503dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback 504dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 505dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with millisecond scale on the default timer list 506dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock. 507dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 508dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer 509dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 510dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_ms(QEMUClockType type, QEMUTimerCB *cb, 511dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner void *opaque) 512dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{ 513dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return timer_new(type, SCALE_MS, cb, opaque); 514dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} 515dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 516dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 517dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_free: 518dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 519dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 520dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Free a timer (it must not be on the active list) 521dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 522dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_free(QEMUTimer *ts); 523dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 524dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 525dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_del: 526dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 527dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 528dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Delete a timer from the active list. 529dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 530dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be 531dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running. 532dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 533dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_del(QEMUTimer *ts); 534dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 535dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 536dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_ns: 537dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 538dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds 539dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 540dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time 541dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 542dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be 543dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running. 544dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 545dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_ns(QEMUTimer *ts, int64_t expire_time); 546dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 547dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 548dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_anticipate_ns: 549dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 550dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds 551dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 552dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time or the current time, 553dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * whichever comes earlier. 554dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 555dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be 556dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running. 557dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 558dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time); 559dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 560dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 561dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod: 562dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 563dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expire time in the units associated with the timer 564dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 565dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expiry at @expire_time, taking into 566dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * account the scale associated with the timer. 567dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 568dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be 569dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running. 570dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 571dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod(QEMUTimer *ts, int64_t expire_timer); 572dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 573dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 574dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_anticipate: 575dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 576dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds 577dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 578dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time or the current time, whichever 579dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * comes earlier, taking into account the scale associated with the timer. 580dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 581dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be 582dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running. 583dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 584dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time); 585dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 586dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 587dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_pending: 588dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 589dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 590dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a timer is pending (i.e. is on the 591dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * active list of timers, whether or not it has not yet expired). 592dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 593dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer is pending 594dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 595dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timer_pending(QEMUTimer *ts); 596dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 597dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 598dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_expired: 599dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 600dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 601dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a timer has expired. 602dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 603dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer has expired 604dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 605dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timer_expired(QEMUTimer *timer_head, int64_t current_time); 606dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 607dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 608dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_expire_time_ns: 609dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 610dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 611dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the expiry time of a timer 612dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 613dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the expiry time in nanoseconds 614dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 615dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turneruint64_t timer_expire_time_ns(QEMUTimer *ts); 616dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 617dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 618dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_get: 619dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @f: the file 620dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 621dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 622dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Read a timer @ts from a file @f 623dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 624dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_get(QEMUFile *f, QEMUTimer *ts); 625dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 626dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 627dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_put: 628dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @f: the file 629dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer 630dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 631dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_put(QEMUFile *f, QEMUTimer *ts); 632dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 633dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* 634dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * General utility functions 635dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 636dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 637dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 638dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_timeout_ns_to_ms: 639dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ns: nanosecond timeout value 640dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 641dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Convert a nanosecond timeout value (or -1) to 642dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * a millisecond value (or -1), always rounding up. 643dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 644dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: millisecond timeout value 645dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 646dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint qemu_timeout_ns_to_ms(int64_t ns); 647dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 648dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 649dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_poll_ns: 650dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @fds: Array of file descriptors 651dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @nfds: number of file descriptors 652dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout: timeout in nanoseconds 653dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 654dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Perform a poll like g_poll but with a timeout in nanoseconds. 655dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * See g_poll documentation for further details. 656dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 657dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: number of fds ready 658dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 659dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout); 660dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 661dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 662dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_soonest_timeout: 663dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout1: first timeout in nanoseconds (or -1 for infinite) 664dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout2: second timeout in nanoseconds (or -1 for infinite) 665dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 666dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Calculates the soonest of two timeout values. -1 means infinite, which 667dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is later than any other value. 668dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 669dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: soonest timeout value in nanoseconds (or -1 for infinite) 670dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 671dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_soonest_timeout(int64_t timeout1, int64_t timeout2) 672317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 673dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner /* we can abuse the fact that -1 (which means infinite) is a maximal 674dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * value when cast to unsigned. As this is disgusting, it's kept in 675dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * one inline function. 676dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 677dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner return ((uint64_t) timeout1 < (uint64_t) timeout2) ? timeout1 : timeout2; 678317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 679317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 680dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/** 681dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * initclocks: 682dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * 683dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise the clock & timer infrastructure 684dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */ 685dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid init_clocks(void); 686dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 687dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t cpu_get_ticks(void); 688dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* Caller must hold BQL */ 689dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid cpu_enable_ticks(void); 690dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* Caller must hold BQL */ 691dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid cpu_disable_ticks(void); 692dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner 693a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turnerstatic inline int64_t get_ticks_per_sec(void) 694a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner{ 695a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner return 1000000000LL; 696a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner} 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner/* 699f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner * Low level clock functions 700f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner */ 701f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner 702317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner/* real time host monotonic timer */ 703317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock_realtime(void) 704317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 705317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner struct timeval tv; 706317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 707317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner gettimeofday(&tv, NULL); 708317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000); 709317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 710317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 711317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner/* Warning: don't insert tracepoints into these functions, they are 712317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner also used by simpletrace backend and tracepoints would cause 713317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner an infinite recursion! */ 714317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#ifdef _WIN32 715317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerextern int64_t clock_freq; 716317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 717317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock(void) 718317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 719317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner LARGE_INTEGER ti; 720317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner QueryPerformanceCounter(&ti); 721317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner return muldiv64(ti.QuadPart, get_ticks_per_sec(), clock_freq); 722317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 723317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 724317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#else 725317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 726317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerextern int use_rt_clock; 727317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner 728317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock(void) 729317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{ 730f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner#ifdef CLOCK_MONOTONIC 731317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner if (use_rt_clock) { 732317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner struct timespec ts; 733317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner clock_gettime(CLOCK_MONOTONIC, &ts); 734317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner return ts.tv_sec * 1000000000LL + ts.tv_nsec; 735317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner } else 736317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#endif 737317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner { 738317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner /* XXX: using gettimeofday leads to problems if the date 739317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner changes, so it should be avoided. */ 740317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner return get_clock_realtime(); 741317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner } 742317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner} 743317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#endif 7446a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7456a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* icount */ 7466a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerint64_t cpu_get_icount(void); 747f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turnerint64_t cpu_get_clock(void); 748f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner 7496a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/*******************************************/ 7506a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* host CPU ticks (if available) */ 7516a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7526a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#if defined(_ARCH_PPC) 7536a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7546a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 7556a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 7566a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int64_t retval; 7576a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#ifdef _ARCH_PPC64 7586a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner /* This reads timebase in one 64bit go and includes Cell workaround from: 7596a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html 7606a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner */ 7616a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner __asm__ __volatile__ ("mftb %0\n\t" 7626a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "cmpwi %0,0\n\t" 7636a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "beq- $-8" 7646a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner : "=r" (retval)); 7656a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else 7666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner /* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */ 7676a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner unsigned long junk; 7686a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner __asm__ __volatile__ ("mfspr %1,269\n\t" /* mftbu */ 7696a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "mfspr %L0,268\n\t" /* mftb */ 7706a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "mfspr %0,269\n\t" /* mftbu */ 7716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "cmpw %0,%1\n\t" 7726a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "bne $-16" 7736a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner : "=r" (retval), "=r" (junk)); 7746a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif 7756a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return retval; 7766a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 7776a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7786a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__i386__) 7796a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7806a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 7816a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 7826a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int64_t val; 7836a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile ("rdtsc" : "=A" (val)); 7846a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return val; 7856a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 7866a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7876a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__x86_64__) 7886a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 7896a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 7906a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 7916a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint32_t low,high; 7926a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int64_t val; 7936a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile("rdtsc" : "=a" (low), "=d" (high)); 7946a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner val = high; 7956a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner val <<= 32; 7966a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner val |= low; 7976a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return val; 7986a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 7996a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8006a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__hppa__) 8016a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8026a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 8036a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8046a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int val; 8056a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile ("mfctl %%cr16, %0" : "=r"(val)); 8066a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return val; 8076a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8086a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8096a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__ia64) 8106a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8116a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 8126a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8136a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int64_t val; 8146a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory"); 8156a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return val; 8166a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8176a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8186a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__s390__) 8196a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8206a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 8216a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8226a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner int64_t val; 8236a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc"); 8246a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return val; 8256a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8266a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 827f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner#elif defined(__sparc__) 8286a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8296a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks (void) 8306a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8316a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#if defined(_LP64) 8326a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint64_t rval; 8336a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile("rd %%tick,%0" : "=r"(rval)); 8346a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return rval; 8356a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else 836f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner /* We need an %o or %g register for this. For recent enough gcc 837f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner there is an "h" constraint for that. Don't bother with that. */ 8386a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner union { 8396a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint64_t i64; 8406a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner struct { 8416a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint32_t high; 8426a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint32_t low; 8436a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner } i32; 8446a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner } rval; 845f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner asm volatile("rd %%tick,%%g1; srlx %%g1,32,%0; mov %%g1,%1" 846f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner : "=r"(rval.i32.high), "=r"(rval.i32.low) : : "g1"); 8476a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return rval.i64; 8486a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif 8496a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8506a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8516a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__mips__) && \ 8526a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner ((defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__)) 8536a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* 8546a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * binutils wants to use rdhwr only on mips32r2 8556a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * but as linux kernel emulate it, it's fine 8566a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * to use it. 8576a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * 8586a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner */ 8596a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#define MIPS_RDHWR(rd, value) { \ 8606a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner __asm__ __volatile__ (".set push\n\t" \ 8616a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner ".set mips32r2\n\t" \ 8626a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner "rdhwr %0, "rd"\n\t" \ 8636a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner ".set pop" \ 8646a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner : "=r" (value)); \ 8656a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner } 8666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8676a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 8686a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8696a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner /* On kernels >= 2.6.25 rdhwr <reg>, $2 and $3 are emulated */ 8706a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint32_t count; 8716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner static uint32_t cyc_per_count = 0; 8726a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8736a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner if (!cyc_per_count) { 8746a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner MIPS_RDHWR("$3", cyc_per_count); 8756a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner } 8766a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8776a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner MIPS_RDHWR("$2", count); 8786a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return (int64_t)(count * cyc_per_count); 8796a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8806a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8816a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__alpha__) 8826a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8836a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void) 8846a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 8856a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint64_t cc; 8866a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner uint32_t cur, ofs; 8876a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8886a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner asm volatile("rpcc %0" : "=r"(cc)); 8896a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner cur = cc; 8906a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner ofs = cc >> 32; 8916a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return cur - ofs; 8926a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 8936a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 8946a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else 8956a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* The host CPU doesn't have an easily accessible cycle counter. 8966a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner Just return a monotonically increasing value. This will be 8976a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner totally wrong, but hopefully better than nothing. */ 8986a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks (void) 8996a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 9006a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner static int64_t ticks = 0; 9016a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return ticks++; 9026a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 9036a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif 9046a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 9056a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#ifdef CONFIG_PROFILER 9066a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t profile_getclock(void) 9076a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{ 9086a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner return cpu_get_real_ticks(); 9096a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner} 9106a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 9116a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t qemu_time, qemu_time_start; 9126a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t tlb_flush_time; 9136a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t dev_time; 9146a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif 9156a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 917