VirtualBox

source: vbox/trunk/include/VBox/tm.h@ 35020

Last change on this file since 35020 was 34326, checked in by vboxsync, 14 years ago

VMM: Removed the XXXInitCPU and XXXTermCPU methods since all but the HWACCM ones where stubs and the XXXTermCPU bits was not called in all expected paths. The HWACCMR3InitCPU was hooked up as a VMINITCOMPLETED_RING3 hook, essentially leaving it's position in the order of things unchanged, while the HWACCMR3TermCPU call was made static without changing its position at the end of HWACCMR3Term.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 KB
Line 
1/** @file
2 * TM - Time Manager. (VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2010 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_tm_h
27#define ___VBox_tm_h
28
29#include <VBox/cdefs.h>
30#include <VBox/types.h>
31#ifdef IN_RING3
32# include <iprt/time.h>
33#endif
34
35RT_C_DECLS_BEGIN
36
37/** @defgroup grp_tm The Time Manager API
38 * @{
39 */
40
41/** Enable a timer hack which improves the timer response/resolution a bit. */
42#define VBOX_HIGH_RES_TIMERS_HACK
43
44
45/**
46 * Clock type.
47 */
48typedef enum TMCLOCK
49{
50 /** Real host time.
51 * This clock ticks all the time, so use with care. */
52 TMCLOCK_REAL = 0,
53 /** Virtual guest time.
54 * This clock only ticks when the guest is running. It's implemented
55 * as an offset to monotonic real time (GIP). */
56 TMCLOCK_VIRTUAL,
57 /** Virtual guest synchronized timer time.
58 * This is a special clock and timer queue for synchronizing virtual timers
59 * and virtual time sources. This clock is trying to keep up with
60 * TMCLOCK_VIRTUAL, but will wait for timers to be executed. If it lags
61 * too far behind TMCLOCK_VIRTUAL, it will try speed up to close the
62 * distance.
63 * @remarks Do not use this unless you really *must*. */
64 TMCLOCK_VIRTUAL_SYNC,
65 /** Virtual CPU timestamp.
66 * By default this is a function of TMCLOCK_VIRTUAL_SYNC and the virtual
67 * CPU frequency. */
68 TMCLOCK_TSC,
69 /** Number of clocks. */
70 TMCLOCK_MAX
71} TMCLOCK;
72
73
74/** @defgroup grp_tm_timer_flags Timer flags.
75 * @{ */
76/** Use the default critical section for the class of timers. */
77#define TMTIMER_FLAGS_DEFAULT_CRIT_SECT 0
78/** No critical section needed or a custom one is set using
79 * TMR3TimerSetCritSect(). */
80#define TMTIMER_FLAGS_NO_CRIT_SECT RT_BIT_32(0)
81/** @} */
82
83
84VMMDECL(void) TMNotifyStartOfExecution(PVMCPU pVCpu);
85VMMDECL(void) TMNotifyEndOfExecution(PVMCPU pVCpu);
86VMM_INT_DECL(void) TMNotifyStartOfHalt(PVMCPU pVCpu);
87VMM_INT_DECL(void) TMNotifyEndOfHalt(PVMCPU pVCpu);
88#ifdef IN_RING3
89VMMR3DECL(int) TMR3NotifySuspend(PVM pVM, PVMCPU pVCpu);
90VMMR3DECL(int) TMR3NotifyResume(PVM pVM, PVMCPU pVCpu);
91VMMR3DECL(int) TMR3SetWarpDrive(PVM pVM, uint32_t u32Percent);
92#endif
93VMMDECL(uint32_t) TMGetWarpDrive(PVM pVM);
94VMM_INT_DECL(uint32_t) TMCalcHostTimerFrequency(PVM pVM, PVMCPU pVCpu);
95#ifdef IN_RING3
96VMMR3DECL(int) TMR3GetCpuLoadTimes(PVM pVM, VMCPUID idCpu, uint64_t *pcNsTotal, uint64_t *pcNsExecuting,
97 uint64_t *pcNsHalted, uint64_t *pcNsOther);
98#endif
99
100
101/** @name Real Clock Methods
102 * @{
103 */
104VMM_INT_DECL(uint64_t) TMRealGet(PVM pVM);
105VMM_INT_DECL(uint64_t) TMRealGetFreq(PVM pVM);
106/** @} */
107
108
109/** @name Virtual Clock Methods
110 * @{
111 */
112VMM_INT_DECL(uint64_t) TMVirtualGet(PVM pVM);
113VMM_INT_DECL(uint64_t) TMVirtualGetNoCheck(PVM pVM);
114VMM_INT_DECL(uint64_t) TMVirtualSyncGetLag(PVM pVM);
115VMM_INT_DECL(uint32_t) TMVirtualSyncGetCatchUpPct(PVM pVM);
116VMM_INT_DECL(uint64_t) TMVirtualGetFreq(PVM pVM);
117VMM_INT_DECL(uint64_t) TMVirtualSyncGet(PVM pVM);
118VMM_INT_DECL(uint64_t) TMVirtualSyncGetNoCheck(PVM pVM);
119VMM_INT_DECL(uint64_t) TMVirtualSyncGetEx(PVM pVM, bool fCheckTimers);
120VMM_INT_DECL(uint64_t) TMVirtualSyncGetWithDeadlineNoCheck(PVM pVM, uint64_t *pcNsToDeadline);
121VMM_INT_DECL(uint64_t) TMVirtualSyncGetNsToDeadline(PVM pVM);
122VMM_INT_DECL(uint64_t) TMVirtualToNano(PVM pVM, uint64_t u64VirtualTicks);
123VMM_INT_DECL(uint64_t) TMVirtualToMicro(PVM pVM, uint64_t u64VirtualTicks);
124VMM_INT_DECL(uint64_t) TMVirtualToMilli(PVM pVM, uint64_t u64VirtualTicks);
125VMM_INT_DECL(uint64_t) TMVirtualFromNano(PVM pVM, uint64_t u64NanoTS);
126VMM_INT_DECL(uint64_t) TMVirtualFromMicro(PVM pVM, uint64_t u64MicroTS);
127VMM_INT_DECL(uint64_t) TMVirtualFromMilli(PVM pVM, uint64_t u64MilliTS);
128/** @} */
129
130
131/** @name CPU Clock Methods
132 * @{
133 */
134VMMDECL(uint64_t) TMCpuTickGet(PVMCPU pVCpu);
135VMM_INT_DECL(uint64_t) TMCpuTickGetNoCheck(PVMCPU pVCpu);
136VMM_INT_DECL(bool) TMCpuTickCanUseRealTSC(PVMCPU pVCpu, uint64_t *poffRealTSC);
137VMM_INT_DECL(uint64_t) TMCpuTickGetDeadlineAndTscOffset(PVMCPU pVCpu, bool *pfOffsettedTsc, uint64_t *poffRealTSC);
138VMM_INT_DECL(int) TMCpuTickSet(PVM pVM, PVMCPU pVCpu, uint64_t u64Tick);
139VMM_INT_DECL(int) TMCpuTickSetLastSeen(PVMCPU pVCpu, uint64_t u64LastSeenTick);
140VMM_INT_DECL(uint64_t) TMCpuTickGetLastSeen(PVMCPU pVCpu);
141VMMDECL(uint64_t) TMCpuTicksPerSecond(PVM pVM);
142/** @} */
143
144
145/** @name Timer Methods
146 * @{
147 */
148/**
149 * Device timer callback function.
150 *
151 * @param pDevIns Device instance of the device which registered the timer.
152 * @param pTimer The timer handle.
153 * @param pvUser User argument specified upon timer creation.
154 */
155typedef DECLCALLBACK(void) FNTMTIMERDEV(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser);
156/** Pointer to a device timer callback function. */
157typedef FNTMTIMERDEV *PFNTMTIMERDEV;
158
159/**
160 * Device timer callback function.
161 *
162 * @param pUsbIns The USB device instance the timer is associated
163 * with.
164 * @param pTimer The timer handle.
165 * @param pvUser User argument specified upon timer creation.
166 */
167typedef DECLCALLBACK(void) FNTMTIMERUSB(PPDMUSBINS pUsbIns, PTMTIMER pTimer, void *pvUser);
168/** Pointer to a timer callback for a USB device. */
169typedef FNTMTIMERUSB *PFNTMTIMERUSB;
170
171/**
172 * Driver timer callback function.
173 *
174 * @param pDrvIns Device instance of the device which registered the timer.
175 * @param pTimer The timer handle.
176 * @param pvUser User argument specified upon timer creation.
177 */
178typedef DECLCALLBACK(void) FNTMTIMERDRV(PPDMDRVINS pDrvIns, PTMTIMER pTimer, void *pvUser);
179/** Pointer to a driver timer callback function. */
180typedef FNTMTIMERDRV *PFNTMTIMERDRV;
181
182/**
183 * Service timer callback function.
184 *
185 * @param pSrvIns Service instance of the device which registered the timer.
186 * @param pTimer The timer handle.
187 */
188typedef DECLCALLBACK(void) FNTMTIMERSRV(PPDMSRVINS pSrvIns, PTMTIMER pTimer);
189/** Pointer to a service timer callback function. */
190typedef FNTMTIMERSRV *PFNTMTIMERSRV;
191
192/**
193 * Internal timer callback function.
194 *
195 * @param pVM The VM.
196 * @param pTimer The timer handle.
197 * @param pvUser User argument specified upon timer creation.
198 */
199typedef DECLCALLBACK(void) FNTMTIMERINT(PVM pVM, PTMTIMER pTimer, void *pvUser);
200/** Pointer to internal timer callback function. */
201typedef FNTMTIMERINT *PFNTMTIMERINT;
202
203/**
204 * External timer callback function.
205 *
206 * @param pvUser User argument as specified when the timer was created.
207 */
208typedef DECLCALLBACK(void) FNTMTIMEREXT(void *pvUser);
209/** Pointer to an external timer callback function. */
210typedef FNTMTIMEREXT *PFNTMTIMEREXT;
211
212VMMDECL(PTMTIMERR3) TMTimerR3Ptr(PTMTIMER pTimer);
213VMMDECL(PTMTIMERR0) TMTimerR0Ptr(PTMTIMER pTimer);
214VMMDECL(PTMTIMERRC) TMTimerRCPtr(PTMTIMER pTimer);
215VMMDECL(int) TMTimerSet(PTMTIMER pTimer, uint64_t u64Expire);
216VMMDECL(int) TMTimerSetRelative(PTMTIMER pTimer, uint64_t cTicksToNext, uint64_t *pu64Now);
217VMMDECL(int) TMTimerSetMillies(PTMTIMER pTimer, uint32_t cMilliesToNext);
218VMMDECL(int) TMTimerSetMicro(PTMTIMER pTimer, uint64_t cMicrosToNext);
219VMMDECL(int) TMTimerSetNano(PTMTIMER pTimer, uint64_t cNanosToNext);
220VMMDECL(int) TMTimerSetFrequencyHint(PTMTIMER pTimer, uint32_t uHz);
221VMMDECL(uint64_t) TMTimerGet(PTMTIMER pTimer);
222VMMDECL(uint64_t) TMTimerGetNano(PTMTIMER pTimer);
223VMMDECL(uint64_t) TMTimerGetMicro(PTMTIMER pTimer);
224VMMDECL(uint64_t) TMTimerGetMilli(PTMTIMER pTimer);
225VMMDECL(uint64_t) TMTimerGetFreq(PTMTIMER pTimer);
226VMMDECL(uint64_t) TMTimerGetExpire(PTMTIMER pTimer);
227VMMDECL(uint64_t) TMTimerToNano(PTMTIMER pTimer, uint64_t u64Ticks);
228VMMDECL(uint64_t) TMTimerToMicro(PTMTIMER pTimer, uint64_t u64Ticks);
229VMMDECL(uint64_t) TMTimerToMilli(PTMTIMER pTimer, uint64_t u64Ticks);
230VMMDECL(uint64_t) TMTimerFromNano(PTMTIMER pTimer, uint64_t u64NanoTS);
231VMMDECL(uint64_t) TMTimerFromMicro(PTMTIMER pTimer, uint64_t u64MicroTS);
232VMMDECL(uint64_t) TMTimerFromMilli(PTMTIMER pTimer, uint64_t u64MilliTS);
233VMMDECL(int) TMTimerStop(PTMTIMER pTimer);
234VMMDECL(bool) TMTimerIsActive(PTMTIMER pTimer);
235VMMDECL(bool) TMTimerPollBool(PVM pVM, PVMCPU pVCpu);
236VMM_INT_DECL(void) TMTimerPollVoid(PVM pVM, PVMCPU pVCpu);
237VMM_INT_DECL(uint64_t) TMTimerPollGIP(PVM pVM, PVMCPU pVCpu, uint64_t *pu64Delta);
238
239/** @} */
240
241
242#ifdef IN_RING3
243/** @defgroup grp_tm_r3 The TM Host Context Ring-3 API
244 * @ingroup grp_tm
245 * @{
246 */
247VMM_INT_DECL(int) TMR3Init(PVM pVM);
248VMM_INT_DECL(int) TMR3InitFinalize(PVM pVM);
249VMM_INT_DECL(void) TMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
250VMM_INT_DECL(int) TMR3Term(PVM pVM);
251VMM_INT_DECL(void) TMR3Reset(PVM pVM);
252VMM_INT_DECL(int) TMR3GetImportRC(PVM pVM, const char *pszSymbol, PRTRCPTR pRCPtrValue);
253VMM_INT_DECL(int) TMR3TimerCreateDevice(PVM pVM, PPDMDEVINS pDevIns, TMCLOCK enmClock, PFNTMTIMERDEV pfnCallback, void *pvUser, uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer);
254VMM_INT_DECL(int) TMR3TimerCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, void *pvUser, uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer);
255VMMR3DECL(int) TMR3TimerCreateInternal(PVM pVM, TMCLOCK enmClock, PFNTMTIMERINT pfnCallback, void *pvUser, const char *pszDesc, PPTMTIMERR3 ppTimer);
256VMMR3DECL(PTMTIMERR3) TMR3TimerCreateExternal(PVM pVM, TMCLOCK enmClock, PFNTMTIMEREXT pfnCallback, void *pvUser, const char *pszDesc);
257VMMR3DECL(int) TMR3TimerDestroy(PTMTIMER pTimer);
258VMM_INT_DECL(int) TMR3TimerDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);
259VMM_INT_DECL(int) TMR3TimerDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);
260VMMR3DECL(int) TMR3TimerSave(PTMTIMERR3 pTimer, PSSMHANDLE pSSM);
261VMMR3DECL(int) TMR3TimerLoad(PTMTIMERR3 pTimer, PSSMHANDLE pSSM);
262VMMR3DECL(int) TMR3TimerSetCritSect(PTMTIMERR3 pTimer, PPDMCRITSECT pCritSect);
263VMMR3DECL(void) TMR3TimerQueuesDo(PVM pVM);
264VMM_INT_DECL(void) TMR3VirtualSyncFF(PVM pVM, PVMCPU pVCpu);
265VMM_INT_DECL(PRTTIMESPEC) TMR3UtcNow(PVM pVM, PRTTIMESPEC pTime);
266/** @} */
267#endif /* IN_RING3 */
268
269
270/** @} */
271
272RT_C_DECLS_END
273
274#endif
275
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette