VirtualBox

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

Last change on this file since 443 was 443, checked in by vboxsync, 18 years ago

Implemented Warp drive. This can be configured using the WarpDrivePercentage (2..20000) or the TMVirtualSetWarpDrive API.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.5 KB
Line 
1/** @file
2 * TM - Time Monitor.
3 */
4
5/*
6 * Copyright (C) 2006 InnoTek Systemberatung GmbH
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 as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21
22#ifndef __VBox_tm_h__
23#define __VBox_tm_h__
24
25#include <VBox/cdefs.h>
26#include <VBox/types.h>
27
28__BEGIN_DECLS
29
30/** @defgroup grp_tm The Time Monitor API
31 * @{
32 */
33
34/** Enable a timer hack which improves the timer response/resolution a bit. */
35#define VBOX_HIGH_RES_TIMERS_HACK
36
37/** Use the real CPU TSC. */
38#define TM_REAL_CPU_TICK
39
40
41/**
42 * Clock type.
43 */
44typedef enum TMCLOCK
45{
46 /** Real host time.
47 * This clock ticks all the time, so use with care. */
48 TMCLOCK_REAL = 0,
49 /** Virtual guest time.
50 * This clock only ticks when the guest is running. It's implemented
51 * as an offset to real time. */
52 TMCLOCK_VIRTUAL,
53#if 1
54 /** Virtual guest synchronized timer time.
55 * This is a special clock and timer queue for synchronizing virtual timers and
56 * virtual time sources. This clock is trying to keep up with TMCLOCK_VIRTUAL,
57 * but will wait for timers to be executed. If it lags too far behind TMCLOCK_VIRTUAL,
58 * it will try speed up to close the distance. */
59 TMCLOCK_VIRTUAL_SYNC,
60#endif
61 /** Virtual CPU timestamp. (Running only when we're executing guest code.) */
62 TMCLOCK_TSC,
63 /** Number of clocks. */
64 TMCLOCK_MAX
65} TMCLOCK;
66
67
68
69/** @name Real Clock Methods
70 * @{
71 */
72/**
73 * Gets the current TMCLOCK_REAL time.
74 *
75 * @returns Real time.
76 * @param pVM The VM handle.
77 */
78TMDECL(uint64_t) TMRealGet(PVM pVM);
79
80/**
81 * Gets the frequency of the TMCLOCK_REAL clock.
82 *
83 * @returns frequency.
84 * @param pVM The VM handle.
85 */
86TMDECL(uint64_t) TMRealGetFreq(PVM pVM);
87/** @} */
88
89
90/** @name Virtual Clock Methods
91 * @{
92 */
93/**
94 * Gets the current TMCLOCK_VIRTUAL time.
95 *
96 * @returns The timestamp.
97 * @param pVM VM handle.
98 *
99 * @remark While the flow of time will never go backwards, the speed of the
100 * progress varies due to inaccurate RTTimeNanoTS and TSC. The latter can be
101 * influenced by power saving (SpeedStep, PowerNow!), while the former
102 * makes use of TSC and kernel timers.
103 */
104TMDECL(uint64_t) TMVirtualGet(PVM pVM);
105
106/**
107 * Gets the current TMCLOCK_VIRTUAL_SYNC time.
108 *
109 * @returns The timestamp.
110 * @param pVM VM handle.
111 *
112 */
113TMDECL(uint64_t) TMVirtualGetSync(PVM pVM);
114
115/**
116 * Gets the current TMCLOCK_VIRTUAL frequency.
117 *
118 * @returns The freqency.
119 * @param pVM VM handle.
120 */
121TMDECL(uint64_t) TMVirtualGetFreq(PVM pVM);
122
123/**
124 * Resumes the virtual clock.
125 *
126 * @returns VINF_SUCCESS on success.
127 * @returns VINF_INTERNAL_ERROR and VBOX_STRICT assertion if called out of order.
128 * @param pVM VM handle.
129 */
130TMDECL(int) TMVirtualResume(PVM pVM);
131
132/**
133 * Pauses the virtual clock.
134 *
135 * @returns VINF_SUCCESS on success.
136 * @returns VINF_INTERNAL_ERROR and VBOX_STRICT assertion if called out of order.
137 * @param pVM VM handle.
138 */
139TMDECL(int) TMVirtualPause(PVM pVM);
140
141/**
142 * Converts from virtual ticks to nanoseconds.
143 *
144 * @returns nanoseconds.
145 * @param pVM The VM handle.
146 * @param u64VirtualTicks The virtual ticks to convert.
147 * @remark There could be rounding errors here. We just do a simple integere divide
148 * without any adjustments.
149 */
150TMDECL(uint64_t) TMVirtualToNano(PVM pVM, uint64_t u64VirtualTicks);
151
152/**
153 * Converts from virtual ticks to microseconds.
154 *
155 * @returns microseconds.
156 * @param pVM The VM handle.
157 * @param u64VirtualTicks The virtual ticks to convert.
158 * @remark There could be rounding errors here. We just do a simple integere divide
159 * without any adjustments.
160 */
161TMDECL(uint64_t) TMVirtualToMicro(PVM pVM, uint64_t u64VirtualTicks);
162
163/**
164 * Converts from virtual ticks to milliseconds.
165 *
166 * @returns milliseconds.
167 * @param pVM The VM handle.
168 * @param u64VirtualTicks The virtual ticks to convert.
169 * @remark There could be rounding errors here. We just do a simple integere divide
170 * without any adjustments.
171 */
172TMDECL(uint64_t) TMVirtualToMilli(PVM pVM, uint64_t u64VirtualTicks);
173
174/**
175 * Converts from nanoseconds to virtual ticks.
176 *
177 * @returns virtual ticks.
178 * @param pVM The VM handle.
179 * @param u64NanoTS The nanosecond value ticks to convert.
180 * @remark There could be rounding and overflow errors here.
181 */
182TMDECL(uint64_t) TMVirtualFromNano(PVM pVM, uint64_t u64NanoTS);
183
184/**
185 * Converts from microseconds to virtual ticks.
186 *
187 * @returns virtual ticks.
188 * @param pVM The VM handle.
189 * @param u64MicroTS The microsecond value ticks to convert.
190 * @remark There could be rounding and overflow errors here.
191 */
192TMDECL(uint64_t) TMVirtualFromMicro(PVM pVM, uint64_t u64MicroTS);
193
194/**
195 * Converts from milliseconds to virtual ticks.
196 *
197 * @returns virtual ticks.
198 * @param pVM The VM handle.
199 * @param u64MilliTS The millisecond value ticks to convert.
200 * @remark There could be rounding and overflow errors here.
201 */
202TMDECL(uint64_t) TMVirtualFromMilli(PVM pVM, uint64_t u64MilliTS);
203
204/**
205 * Gets the current warp drive percent.
206 *
207 * @returns The warp drive percent.
208 * @param pVM The VM handle.
209 */
210TMDECL(uint32_t) TMVirtualGetWarpDrive(PVM pVM);
211
212/**
213 * Sets the warp drive percent of the virtual time.
214 *
215 * @returns VBox status code.
216 * @param pVM The VM handle.
217 * @param u32Percent The new percentage. 100 means normal operation.
218 */
219TMDECL(int) TMVirtualSetWarpDrive(PVM pVM, uint32_t u32Percent);
220
221/** @} */
222
223
224/** @name CPU Clock Methods
225 * @{
226 */
227/**
228 * Resumes the CPU timestamp counter ticking.
229 *
230 * @returns VBox status code.
231 * @param pVM The VM to operate on.
232 */
233TMDECL(int) TMCpuTickResume(PVM pVM);
234
235/**
236 * Pauses the CPU timestamp counter ticking.
237 *
238 * @returns VBox status code.
239 * @param pVM The VM to operate on.
240 */
241TMDECL(int) TMCpuTickPause(PVM pVM);
242
243/**
244 * Read the current CPU timstamp counter.
245 *
246 * @returns Gets the CPU tsc.
247 * @param pVM The VM to operate on.
248 */
249TMDECL(uint64_t) TMCpuTickGet(PVM pVM);
250
251/**
252 * Sets the current CPU timestamp counter.
253 *
254 * @returns VBox status code.
255 * @param pVM The VM to operate on.
256 * @param u64Tick The new timestamp value.
257 */
258TMDECL(int) TMCpuTickSet(PVM pVM, uint64_t u64Tick);
259
260/**
261 * Get the timestamp frequency.
262 *
263 * @returns Number of ticks per second.
264 * @param pVM The VM.
265 */
266TMDECL(uint64_t) TMCpuTicksPerSecond(PVM pVM);
267
268/** @} */
269
270
271/** @name Timer Methods
272 * @{
273 */
274/**
275 * Device timer callback function.
276 *
277 * @param pDevIns Device instance of the device which registered the timer.
278 * @param pTimer The timer handle.
279 */
280typedef DECLCALLBACK(void) FNTMTIMERDEV(PPDMDEVINS pDevIns, PTMTIMER pTimer);
281/** Pointer to a device timer callback function. */
282typedef FNTMTIMERDEV *PFNTMTIMERDEV;
283
284/**
285 * Driver timer callback function.
286 *
287 * @param pDrvIns Device instance of the device which registered the timer.
288 * @param pTimer The timer handle.
289 */
290typedef DECLCALLBACK(void) FNTMTIMERDRV(PPDMDRVINS pDrvIns, PTMTIMER pTimer);
291/** Pointer to a driver timer callback function. */
292typedef FNTMTIMERDRV *PFNTMTIMERDRV;
293
294/**
295 * Service timer callback function.
296 *
297 * @param pSrvIns Service instance of the device which registered the timer.
298 * @param pTimer The timer handle.
299 */
300typedef DECLCALLBACK(void) FNTMTIMERSRV(PPDMSRVINS pSrvIns, PTMTIMER pTimer);
301/** Pointer to a service timer callback function. */
302typedef FNTMTIMERSRV *PFNTMTIMERSRV;
303
304/**
305 * Internal timer callback function.
306 *
307 * @param pVM The VM.
308 * @param pTimer The timer handle.
309 * @param pvUser User argument specified upon timer creation.
310 */
311typedef DECLCALLBACK(void) FNTMTIMERINT(PVM pVM, PTMTIMER pTimer, void *pvUser);
312/** Pointer to internal timer callback function. */
313typedef FNTMTIMERINT *PFNTMTIMERINT;
314
315/**
316 * External timer callback function.
317 *
318 * @param pvUser User argument as specified when the timer was created.
319 */
320typedef DECLCALLBACK(void) FNTMTIMEREXT(void *pvUser);
321/** Pointer to an external timer callback function. */
322typedef FNTMTIMEREXT *PFNTMTIMEREXT;
323
324
325/**
326 * Gets the host context ring-3 pointer of the timer.
327 *
328 * @returns HC R3 pointer.
329 * @param pTimer Timer handle as returned by one of the create functions.
330 */
331TMDECL(PTMTIMERR3) TMTimerR3Ptr(PTMTIMER pTimer);
332
333/**
334 * Gets the host context ring-0 pointer of the timer.
335 *
336 * @returns HC R0 pointer.
337 * @param pTimer Timer handle as returned by one of the create functions.
338 */
339TMDECL(PTMTIMERR0) TMTimerR0Ptr(PTMTIMER pTimer);
340
341/**
342 * Gets the GC pointer of the timer.
343 *
344 * @returns GC pointer.
345 * @param pTimer Timer handle as returned by one of the create functions.
346 */
347TMDECL(PTMTIMERGC) TMTimerGCPtr(PTMTIMER pTimer);
348
349/**
350 * Gets the GC pointer of the timer.
351 *
352 * @returns GC pointer.
353 * @param pTimer Timer handle as returned by one of the create functions.
354 * @deprecated
355 */
356DECLINLINE(PTMTIMERHC) TMTimerHCPtr(PTMTIMER pTimer)
357{
358 return (PTMTIMERHC)TMTimerR3Ptr(pTimer);
359}
360
361/**
362 * Destroy a timer
363 *
364 * @returns VBox status.
365 * @param pTimer Timer handle as returned by one of the create functions.
366 */
367TMDECL(int) TMTimerDestroy(PTMTIMER pTimer);
368
369/**
370 * Arm a timer with a (new) expire time.
371 *
372 * @returns VBox status.
373 * @param pTimer Timer handle as returned by one of the create functions.
374 * @param u64Expire New expire time.
375 */
376TMDECL(int) TMTimerSet(PTMTIMER pTimer, uint64_t u64Expire);
377
378/**
379 * Arm a timer with a (new) expire time relative to current clock.
380 *
381 * @returns VBox status.
382 * @param pTimer Timer handle as returned by one of the create functions.
383 * @param cMilliesToNext Number of millieseconds to the next tick.
384 */
385TMDECL(int) TMTimerSetMillies(PTMTIMER pTimer, uint32_t cMilliesToNext);
386
387/**
388 * Get the current clock time.
389 * Handy for calculating the new expire time.
390 *
391 * @returns Current clock time.
392 * @param pTimer Timer handle as returned by one of the create functions.
393 */
394TMDECL(uint64_t) TMTimerGet(PTMTIMER pTimer);
395
396/**
397 * Get the current clock time as nanoseconds.
398 *
399 * @returns The timer clock as nanoseconds.
400 * @param pTimer Timer handle as returned by one of the create functions.
401 */
402TMDECL(uint64_t) TMTimerGetNano(PTMTIMER pTimer);
403
404/**
405 * Get the current clock time as microseconds.
406 *
407 * @returns The timer clock as microseconds.
408 * @param pTimer Timer handle as returned by one of the create functions.
409 */
410TMDECL(uint64_t) TMTimerGetMicro(PTMTIMER pTimer);
411
412/**
413 * Get the current clock time as milliseconds.
414 *
415 * @returns The timer clock as milliseconds.
416 * @param pTimer Timer handle as returned by one of the create functions.
417 */
418TMDECL(uint64_t) TMTimerGetMilli(PTMTIMER pTimer);
419
420/**
421 * Get the freqency of the timer clock.
422 *
423 * @returns Clock frequency (as Hz of course).
424 * @param pTimer Timer handle as returned by one of the create functions.
425 */
426TMDECL(uint64_t) TMTimerGetFreq(PTMTIMER pTimer);
427
428/**
429 * Get the expire time of the timer.
430 * Only valid for active timers.
431 *
432 * @returns Expire time of the timer.
433 * @param pTimer Timer handle as returned by one of the create functions.
434 */
435TMDECL(uint64_t) TMTimerGetExpire(PTMTIMER pTimer);
436
437/**
438 * Converts the specified timer clock time to nanoseconds.
439 *
440 * @returns nanoseconds.
441 * @param pTimer Timer handle as returned by one of the create functions.
442 * @param u64Ticks The clock ticks.
443 * @remark There could be rounding errors here. We just do a simple integere divide
444 * without any adjustments.
445 */
446TMDECL(uint64_t) TMTimerToNano(PTMTIMER pTimer, uint64_t u64Ticks);
447
448/**
449 * Converts the specified timer clock time to microseconds.
450 *
451 * @returns microseconds.
452 * @param pTimer Timer handle as returned by one of the create functions.
453 * @param u64Ticks The clock ticks.
454 * @remark There could be rounding errors here. We just do a simple integere divide
455 * without any adjustments.
456 */
457TMDECL(uint64_t) TMTimerToMicro(PTMTIMER pTimer, uint64_t u64Ticks);
458
459/**
460 * Converts the specified timer clock time to milliseconds.
461 *
462 * @returns milliseconds.
463 * @param pTimer Timer handle as returned by one of the create functions.
464 * @param u64Ticks The clock ticks.
465 * @remark There could be rounding errors here. We just do a simple integere divide
466 * without any adjustments.
467 */
468TMDECL(uint64_t) TMTimerToMilli(PTMTIMER pTimer, uint64_t u64Ticks);
469
470/**
471 * Converts the specified nanosecond timestamp to timer clock ticks.
472 *
473 * @returns timer clock ticks.
474 * @param pTimer Timer handle as returned by one of the create functions.
475 * @param u64NanoTS The nanosecond value ticks to convert.
476 * @remark There could be rounding and overflow errors here.
477 */
478TMDECL(uint64_t) TMTimerFromNano(PTMTIMER pTimer, uint64_t u64NanoTS);
479
480/**
481 * Converts the specified microsecond timestamp to timer clock ticks.
482 *
483 * @returns timer clock ticks.
484 * @param pTimer Timer handle as returned by one of the create functions.
485 * @param u64MicroTS The microsecond value ticks to convert.
486 * @remark There could be rounding and overflow errors here.
487 */
488TMDECL(uint64_t) TMTimerFromMicro(PTMTIMER pTimer, uint64_t u64MicroTS);
489
490/**
491 * Converts the specified millisecond timestamp to timer clock ticks.
492 *
493 * @returns timer clock ticks.
494 * @param pTimer Timer handle as returned by one of the create functions.
495 * @param u64MilliTS The millisecond value ticks to convert.
496 * @remark There could be rounding and overflow errors here.
497 */
498TMDECL(uint64_t) TMTimerFromMilli(PTMTIMER pTimer, uint64_t u64MilliTS);
499
500
501/**
502 * Stop the timer.
503 * Use TMR3TimerArm() to "un-stop" the timer.
504 *
505 * @returns VBox status.
506 * @param pTimer Timer handle as returned by one of the create functions.
507 */
508TMDECL(int) TMTimerStop(PTMTIMER pTimer);
509
510/**
511 * Checks if a timer is active or not.
512 *
513 * @returns True if active.
514 * @returns False if not active.
515 * @param pTimer Timer handle as returned by one of the create functions.
516 */
517TMDECL(bool) TMTimerIsActive(PTMTIMER pTimer);
518
519/**
520 * Set FF if we've passed the next virtual event.
521 *
522 * This function is called before FFs are checked in the inner execution EM loops.
523 *
524 * @returns Virtual timer ticks to the next event.
525 * @thread The emulation thread.
526 */
527TMDECL(uint64_t) TMTimerPoll(PVM pVM);
528
529/** @} */
530
531
532#ifdef IN_RING3
533/** @defgroup grp_tm_r3 The TM Host Context Ring-3 API
534 * @ingroup grp_tm
535 * @{
536 */
537
538/**
539 * Initializes the TM.
540 *
541 * @returns VBox status code.
542 * @param pVM The VM to operate on.
543 */
544TMR3DECL(int) TMR3Init(PVM pVM);
545
546/**
547 * Applies relocations to data and code managed by this
548 * component. This function will be called at init and
549 * whenever the VMM need to relocate it self inside the GC.
550 *
551 * @param pVM The VM.
552 * @param offDelta Relocation delta relative to old location.
553 */
554TMR3DECL(void) TMR3Relocate(PVM pVM, RTGCINTPTR offDelta);
555
556/**
557 * Terminates the TM.
558 *
559 * Termination means cleaning up and freeing all resources,
560 * the VM it self is at this point powered off or suspended.
561 *
562 * @returns VBox status code.
563 * @param pVM The VM to operate on.
564 */
565TMR3DECL(int) TMR3Term(PVM pVM);
566
567/**
568 * The VM is being reset.
569 *
570 * For the TM component this means that a rescheduling is preformed,
571 * the FF is cleared and but without running the queues. We'll have to
572 * check if this makes sense or not, but it seems like a good idea now....
573 *
574 * @param pVM VM handle.
575 */
576TMR3DECL(void) TMR3Reset(PVM pVM);
577
578/**
579 * Resolve a builtin GC symbol.
580 * Called by PDM when loading or relocating GC modules.
581 *
582 * @returns VBox status
583 * @param pVM VM Handle.
584 * @param pszSymbol Symbol to resolv
585 * @param pGCPtrValue Where to store the symbol value.
586 * @remark This has to work before TMR3Relocate() is called.
587 */
588TMR3DECL(int) TMR3GetImportGC(PVM pVM, const char *pszSymbol, PRTGCPTR pGCPtrValue);
589
590/**
591 * Creates a device timer.
592 *
593 * @returns VBox status.
594 * @param pVM The VM to create the timer in.
595 * @param pDevIns Device instance.
596 * @param enmClock The clock to use on this timer.
597 * @param pfnCallback Callback function.
598 * @param pszDesc Pointer to description string which must stay around
599 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
600 * @param ppTimer Where to store the timer on success.
601 */
602TMR3DECL(int) TMR3TimerCreateDevice(PVM pVM, PPDMDEVINS pDevIns, TMCLOCK enmClock, PFNTMTIMERDEV pfnCallback, const char *pszDesc, PPTMTIMERHC ppTimer);
603
604/**
605 * Creates a driver timer.
606 *
607 * @returns VBox status.
608 * @param pVM The VM to create the timer in.
609 * @param pDrvIns Driver instance.
610 * @param enmClock The clock to use on this timer.
611 * @param pfnCallback Callback function.
612 * @param pszDesc Pointer to description string which must stay around
613 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
614 * @param ppTimer Where to store the timer on success.
615 */
616TMR3DECL(int) TMR3TimerCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, const char *pszDesc, PPTMTIMERHC ppTimer);
617
618/**
619 * Creates an internal timer.
620 *
621 * @returns VBox status.
622 * @param pVM The VM to create the timer in.
623 * @param enmClock The clock to use on this timer.
624 * @param pfnCallback Callback function.
625 * @param pvUser User argument to be passed to the callback.
626 * @param pszDesc Pointer to description string which must stay around
627 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
628 * @param ppTimer Where to store the timer on success.
629 */
630TMR3DECL(int) TMR3TimerCreateInternal(PVM pVM, TMCLOCK enmClock, PFNTMTIMERINT pfnCallback, void *pvUser, const char *pszDesc, PPTMTIMERHC ppTimer);
631
632/**
633 * Creates an external timer.
634 *
635 * @returns Timer handle on success.
636 * @returns NULL on failure.
637 * @param pVM The VM to create the timer in.
638 * @param enmClock The clock to use on this timer.
639 * @param pfnCallback Callback function.
640 * @param pvUser User argument.
641 * @param pszDesc Pointer to description string which must stay around
642 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
643 */
644TMR3DECL(PTMTIMERHC) TMR3TimerCreateExternal(PVM pVM, TMCLOCK enmClock, PFNTMTIMEREXT pfnCallback, void *pvUser, const char *pszDesc);
645
646/**
647 * Destroy all timers owned by a device.
648 *
649 * @returns VBox status.
650 * @param pVM VM handle.
651 * @param pDevIns Device which timers should be destroyed.
652 */
653TMR3DECL(int) TMR3TimerDestroyDevice(PVM pVM, PPDMDEVINS pDevIns);
654
655
656/**
657 * Destroy all timers owned by a driver.
658 *
659 * @returns VBox status.
660 * @param pVM VM handle.
661 * @param pDrvIns Driver which timers should be destroyed.
662 */
663TMR3DECL(int) TMR3TimerDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns);
664
665/**
666 * Saves the state of a timer to a saved state.
667 *
668 * @returns VBox status.
669 * @param pTimer Timer to save.
670 * @param pSSM Save State Manager handle.
671 */
672TMR3DECL(int) TMR3TimerSave(PTMTIMERHC pTimer, PSSMHANDLE pSSM);
673
674/**
675 * Loads the state of a timer from a saved state.
676 *
677 * @returns VBox status.
678 * @param pTimer Timer to restore.
679 * @param pSSM Save State Manager handle.
680 */
681TMR3DECL(int) TMR3TimerLoad(PTMTIMERHC pTimer, PSSMHANDLE pSSM);
682
683/**
684 * Schedules and runs any pending timers.
685 *
686 * This is normally called from a forced action handler in EMT.
687 *
688 * @param pVM The VM to run the timers for.
689 * @thread The emulation thread.
690 */
691TMR3DECL(void) TMR3TimerQueuesDo(PVM pVM);
692
693
694/** @} */
695#endif
696
697
698#ifdef IN_GC
699/** @defgroup grp_tm_gc The TM Guest Context API
700 * @ingroup grp_tm
701 * @{
702 */
703
704
705/** @} */
706#endif
707
708/** @} */
709
710__END_DECLS
711
712#endif
713
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