VirtualBox

source: vbox/trunk/src/VBox/VMM/include/VMMInternal.h@ 58944

Last change on this file since 58944 was 58123, checked in by vboxsync, 9 years ago

VMM: Made @param pVCpu more uniform and to the point.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 24.3 KB
Line 
1/* $Id: VMMInternal.h 58123 2015-10-08 18:09:45Z vboxsync $ */
2/** @file
3 * VMM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2015 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___VMMInternal_h
19#define ___VMMInternal_h
20
21#include <VBox/cdefs.h>
22#include <VBox/sup.h>
23#include <VBox/vmm/stam.h>
24#include <VBox/vmm/vmm.h>
25#include <VBox/log.h>
26#include <iprt/critsect.h>
27
28#if !defined(IN_VMM_R3) && !defined(IN_VMM_R0) && !defined(IN_VMM_RC)
29# error "Not in VMM! This is an internal header!"
30#endif
31#if defined(RT_OS_DARWIN) && HC_ARCH_BITS == 32
32# error "32-bit darwin is no longer supported. Go back to 4.3 or earlier!"
33#endif
34
35
36
37/** @defgroup grp_vmm_int Internals
38 * @ingroup grp_vmm
39 * @internal
40 * @{
41 */
42
43/** @def VBOX_WITH_RC_RELEASE_LOGGING
44 * Enables RC release logging. */
45#define VBOX_WITH_RC_RELEASE_LOGGING
46
47/** @def VBOX_WITH_R0_LOGGING
48 * Enables Ring-0 logging (non-release).
49 *
50 * Ring-0 logging isn't 100% safe yet (thread id reuse / process exit cleanup),
51 * so you have to sign up here by adding your defined(DEBUG_<userid>) to the
52 * \#if, or by adding VBOX_WITH_R0_LOGGING to your LocalConfig.kmk.
53 */
54#if defined(DEBUG_sandervl) || defined(DEBUG_frank) || defined(DEBUG_ramshankar) || defined(DOXYGEN_RUNNING)
55# define VBOX_WITH_R0_LOGGING
56#endif
57
58/** @def VBOX_STRICT_VMM_STACK
59 * Enables VMM stack guard pages to catch stack over- and underruns. */
60#if defined(VBOX_STRICT) || defined(DOXYGEN_RUNNING)
61# define VBOX_STRICT_VMM_STACK
62#endif
63
64
65/**
66 * Converts a VMM pointer into a VM pointer.
67 * @returns Pointer to the VM structure the VMM is part of.
68 * @param pVMM Pointer to VMM instance data.
69 */
70#define VMM2VM(pVMM) ( (PVM)((char*)pVMM - pVMM->offVM) )
71
72
73/**
74 * Switcher function, HC to RC.
75 *
76 * @param pVM The cross context VM structure.
77 * @returns Return code indicating the action to take.
78 */
79typedef DECLASMTYPE(int) FNVMMSWITCHERHC(PVM pVM);
80/** Pointer to switcher function. */
81typedef FNVMMSWITCHERHC *PFNVMMSWITCHERHC;
82
83/**
84 * Switcher function, RC to HC.
85 *
86 * @param rc VBox status code.
87 */
88typedef DECLASMTYPE(void) FNVMMSWITCHERRC(int rc);
89/** Pointer to switcher function. */
90typedef FNVMMSWITCHERRC *PFNVMMSWITCHERRC;
91
92
93/**
94 * The ring-0 logger instance wrapper.
95 *
96 * We need to be able to find the VM handle from the logger instance, so we wrap
97 * it in this structure.
98 */
99typedef struct VMMR0LOGGER
100{
101 /** Pointer to Pointer to the VM. */
102 R0PTRTYPE(PVM) pVM;
103 /** Size of the allocated logger instance (Logger). */
104 uint32_t cbLogger;
105 /** Flag indicating whether we've create the logger Ring-0 instance yet. */
106 bool fCreated;
107 /** Flag indicating whether we've disabled flushing (world switch) or not. */
108 bool fFlushingDisabled;
109 /** Flag indicating whether we've registered the instance already. */
110 bool fRegistered;
111 bool a8Alignment;
112 /** The CPU ID. */
113 VMCPUID idCpu;
114#if HC_ARCH_BITS == 64
115 uint32_t u32Alignment;
116#endif
117 /** The ring-0 logger instance. This extends beyond the size. */
118 RTLOGGER Logger;
119} VMMR0LOGGER;
120/** Pointer to a ring-0 logger instance wrapper. */
121typedef VMMR0LOGGER *PVMMR0LOGGER;
122
123
124/**
125 * Jump buffer for the setjmp/longjmp like constructs used to
126 * quickly 'call' back into Ring-3.
127 */
128typedef struct VMMR0JMPBUF
129{
130 /** Traditional jmp_buf stuff
131 * @{ */
132#if HC_ARCH_BITS == 32
133 uint32_t ebx;
134 uint32_t esi;
135 uint32_t edi;
136 uint32_t ebp;
137 uint32_t esp;
138 uint32_t eip;
139 uint32_t eflags;
140#endif
141#if HC_ARCH_BITS == 64
142 uint64_t rbx;
143# ifdef RT_OS_WINDOWS
144 uint64_t rsi;
145 uint64_t rdi;
146# endif
147 uint64_t rbp;
148 uint64_t r12;
149 uint64_t r13;
150 uint64_t r14;
151 uint64_t r15;
152 uint64_t rsp;
153 uint64_t rip;
154# ifdef RT_OS_WINDOWS
155 uint128_t xmm6;
156 uint128_t xmm7;
157 uint128_t xmm8;
158 uint128_t xmm9;
159 uint128_t xmm10;
160 uint128_t xmm11;
161 uint128_t xmm12;
162 uint128_t xmm13;
163 uint128_t xmm14;
164 uint128_t xmm15;
165# endif
166 uint64_t rflags;
167#endif
168 /** @} */
169
170 /** Flag that indicates that we've done a ring-3 call. */
171 bool fInRing3Call;
172 /** The number of bytes we've saved. */
173 uint32_t cbSavedStack;
174 /** Pointer to the buffer used to save the stack.
175 * This is assumed to be 8KB. */
176 RTR0PTR pvSavedStack;
177 /** Esp we we match against esp on resume to make sure the stack wasn't relocated. */
178 RTHCUINTREG SpCheck;
179 /** The esp we should resume execution with after the restore. */
180 RTHCUINTREG SpResume;
181 /** ESP/RSP at the time of the jump to ring 3. */
182 RTHCUINTREG SavedEsp;
183 /** EBP/RBP at the time of the jump to ring 3. */
184 RTHCUINTREG SavedEbp;
185
186 /** Stats: Max amount of stack used. */
187 uint32_t cbUsedMax;
188 /** Stats: Average stack usage. (Avg = cbUsedTotal / cUsedTotal) */
189 uint32_t cbUsedAvg;
190 /** Stats: Total amount of stack used. */
191 uint64_t cbUsedTotal;
192 /** Stats: Number of stack usages. */
193 uint64_t cUsedTotal;
194} VMMR0JMPBUF;
195/** Pointer to a ring-0 jump buffer. */
196typedef VMMR0JMPBUF *PVMMR0JMPBUF;
197
198
199/**
200 * VMM Data (part of VM)
201 */
202typedef struct VMM
203{
204 /** Offset to the VM structure.
205 * See VMM2VM(). */
206 RTINT offVM;
207
208 /** @name World Switcher and Related
209 * @{
210 */
211 /** Size of the core code. */
212 RTUINT cbCoreCode;
213 /** Physical address of core code. */
214 RTHCPHYS HCPhysCoreCode;
215 /** Pointer to core code ring-3 mapping - contiguous memory.
216 * At present this only means the context switcher code. */
217 RTR3PTR pvCoreCodeR3;
218 /** Pointer to core code ring-0 mapping - contiguous memory.
219 * At present this only means the context switcher code. */
220 RTR0PTR pvCoreCodeR0;
221 /** Pointer to core code guest context mapping. */
222 RTRCPTR pvCoreCodeRC;
223 RTRCPTR pRCPadding0; /**< Alignment padding. */
224#ifdef VBOX_WITH_NMI
225 /** The guest context address of the APIC (host) mapping. */
226 RTRCPTR GCPtrApicBase;
227 RTRCPTR pRCPadding1; /**< Alignment padding. */
228#endif
229 /** The current switcher.
230 * This will be set before the VMM is fully initialized. */
231 VMMSWITCHER enmSwitcher;
232 /** Array of offsets to the different switchers within the core code. */
233 uint32_t aoffSwitchers[VMMSWITCHER_MAX];
234 uint32_t u32Padding2; /**< Alignment padding. */
235
236 /** Resume Guest Execution. See CPUMGCResumeGuest(). */
237 RTRCPTR pfnCPUMRCResumeGuest;
238 /** Resume Guest Execution in V86 mode. See CPUMGCResumeGuestV86(). */
239 RTRCPTR pfnCPUMRCResumeGuestV86;
240 /** Call Trampoline. See vmmGCCallTrampoline(). */
241 RTRCPTR pfnCallTrampolineRC;
242 /** Guest to host switcher entry point. */
243 RCPTRTYPE(PFNVMMSWITCHERRC) pfnRCToHost;
244 /** Host to guest switcher entry point. */
245 R0PTRTYPE(PFNVMMSWITCHERHC) pfnR0ToRawMode;
246 /** @} */
247
248 /** @name Logging
249 * @{
250 */
251 /** Size of the allocated logger instance (pRCLoggerRC/pRCLoggerR3). */
252 uint32_t cbRCLogger;
253 /** Pointer to the RC logger instance - RC Ptr.
254 * This is NULL if logging is disabled. */
255 RCPTRTYPE(PRTLOGGERRC) pRCLoggerRC;
256 /** Pointer to the GC logger instance - R3 Ptr.
257 * This is NULL if logging is disabled. */
258 R3PTRTYPE(PRTLOGGERRC) pRCLoggerR3;
259 /** Pointer to the GC release logger instance - R3 Ptr. */
260 R3PTRTYPE(PRTLOGGERRC) pRCRelLoggerR3;
261 /** Pointer to the GC release logger instance - RC Ptr. */
262 RCPTRTYPE(PRTLOGGERRC) pRCRelLoggerRC;
263 /** Size of the allocated release logger instance (pRCRelLoggerRC/pRCRelLoggerR3).
264 * This may differ from cbRCLogger. */
265 uint32_t cbRCRelLogger;
266 /** Whether log flushing has been disabled or not. */
267 bool fRCLoggerFlushingDisabled;
268 bool afAlignment[5]; /**< Alignment padding. */
269 /** @} */
270
271 /** Whether the stack guard pages have been stationed or not. */
272 bool fStackGuardsStationed;
273 /** Whether we should use the periodic preemption timers. */
274 bool fUsePeriodicPreemptionTimers;
275
276 /** The EMT yield timer. */
277 PTMTIMERR3 pYieldTimer;
278 /** The period to the next timeout when suspended or stopped.
279 * This is 0 when running. */
280 uint32_t cYieldResumeMillies;
281 /** The EMT yield timer interval (milliseconds). */
282 uint32_t cYieldEveryMillies;
283 /** The timestamp of the previous yield. (nano) */
284 uint64_t u64LastYield;
285
286 /** @name EMT Rendezvous
287 * @{ */
288 /** Semaphore to wait on upon entering ordered execution. */
289 R3PTRTYPE(PRTSEMEVENT) pahEvtRendezvousEnterOrdered;
290 /** Semaphore to wait on upon entering for one-by-one execution. */
291 RTSEMEVENT hEvtRendezvousEnterOneByOne;
292 /** Semaphore to wait on upon entering for all-at-once execution. */
293 RTSEMEVENTMULTI hEvtMulRendezvousEnterAllAtOnce;
294 /** Semaphore to wait on when done. */
295 RTSEMEVENTMULTI hEvtMulRendezvousDone;
296 /** Semaphore the VMMR3EmtRendezvous caller waits on at the end. */
297 RTSEMEVENT hEvtRendezvousDoneCaller;
298 /** Callback. */
299 R3PTRTYPE(PFNVMMEMTRENDEZVOUS) volatile pfnRendezvous;
300 /** The user argument for the callback. */
301 RTR3PTR volatile pvRendezvousUser;
302 /** Flags. */
303 volatile uint32_t fRendezvousFlags;
304 /** The number of EMTs that has entered. */
305 volatile uint32_t cRendezvousEmtsEntered;
306 /** The number of EMTs that has done their job. */
307 volatile uint32_t cRendezvousEmtsDone;
308 /** The number of EMTs that has returned. */
309 volatile uint32_t cRendezvousEmtsReturned;
310 /** The status code. */
311 volatile int32_t i32RendezvousStatus;
312 /** Spin lock. */
313 volatile uint32_t u32RendezvousLock;
314 /** @} */
315
316#if HC_ARCH_BITS == 32
317 uint32_t u32Alignment; /**< Alignment padding. */
318#endif
319
320 /** Buffer for storing the standard assertion message for a ring-0 assertion.
321 * Used for saving the assertion message text for the release log and guru
322 * meditation dump. */
323 char szRing0AssertMsg1[512];
324 /** Buffer for storing the custom message for a ring-0 assertion. */
325 char szRing0AssertMsg2[256];
326
327 /** Number of VMMR0_DO_RUN_GC calls. */
328 STAMCOUNTER StatRunRC;
329
330 /** Statistics for each of the RC/R0 return codes.
331 * @{ */
332 STAMCOUNTER StatRZRetNormal;
333 STAMCOUNTER StatRZRetInterrupt;
334 STAMCOUNTER StatRZRetInterruptHyper;
335 STAMCOUNTER StatRZRetGuestTrap;
336 STAMCOUNTER StatRZRetRingSwitch;
337 STAMCOUNTER StatRZRetRingSwitchInt;
338 STAMCOUNTER StatRZRetStaleSelector;
339 STAMCOUNTER StatRZRetIRETTrap;
340 STAMCOUNTER StatRZRetEmulate;
341 STAMCOUNTER StatRZRetIOBlockEmulate;
342 STAMCOUNTER StatRZRetPatchEmulate;
343 STAMCOUNTER StatRZRetIORead;
344 STAMCOUNTER StatRZRetIOWrite;
345 STAMCOUNTER StatRZRetMMIORead;
346 STAMCOUNTER StatRZRetMMIOWrite;
347 STAMCOUNTER StatRZRetMMIOPatchRead;
348 STAMCOUNTER StatRZRetMMIOPatchWrite;
349 STAMCOUNTER StatRZRetMMIOReadWrite;
350 STAMCOUNTER StatRZRetMSRRead;
351 STAMCOUNTER StatRZRetMSRWrite;
352 STAMCOUNTER StatRZRetLDTFault;
353 STAMCOUNTER StatRZRetGDTFault;
354 STAMCOUNTER StatRZRetIDTFault;
355 STAMCOUNTER StatRZRetTSSFault;
356 STAMCOUNTER StatRZRetCSAMTask;
357 STAMCOUNTER StatRZRetSyncCR3;
358 STAMCOUNTER StatRZRetMisc;
359 STAMCOUNTER StatRZRetPatchInt3;
360 STAMCOUNTER StatRZRetPatchPF;
361 STAMCOUNTER StatRZRetPatchGP;
362 STAMCOUNTER StatRZRetPatchIretIRQ;
363 STAMCOUNTER StatRZRetRescheduleREM;
364 STAMCOUNTER StatRZRetToR3;
365 STAMCOUNTER StatRZRetToR3Unknown;
366 STAMCOUNTER StatRZRetToR3TMVirt;
367 STAMCOUNTER StatRZRetToR3HandyPages;
368 STAMCOUNTER StatRZRetToR3PDMQueues;
369 STAMCOUNTER StatRZRetToR3Rendezvous;
370 STAMCOUNTER StatRZRetToR3Timer;
371 STAMCOUNTER StatRZRetToR3DMA;
372 STAMCOUNTER StatRZRetToR3CritSect;
373 STAMCOUNTER StatRZRetTimerPending;
374 STAMCOUNTER StatRZRetInterruptPending;
375 STAMCOUNTER StatRZRetCallRing3;
376 STAMCOUNTER StatRZRetPATMDuplicateFn;
377 STAMCOUNTER StatRZRetPGMChangeMode;
378 STAMCOUNTER StatRZRetPendingRequest;
379 STAMCOUNTER StatRZRetPGMFlushPending;
380 STAMCOUNTER StatRZRetPatchTPR;
381 STAMCOUNTER StatRZCallPDMCritSectEnter;
382 STAMCOUNTER StatRZCallPDMLock;
383 STAMCOUNTER StatRZCallLogFlush;
384 STAMCOUNTER StatRZCallPGMPoolGrow;
385 STAMCOUNTER StatRZCallPGMMapChunk;
386 STAMCOUNTER StatRZCallPGMAllocHandy;
387 STAMCOUNTER StatRZCallRemReplay;
388 STAMCOUNTER StatRZCallVMSetError;
389 STAMCOUNTER StatRZCallVMSetRuntimeError;
390 STAMCOUNTER StatRZCallPGMLock;
391 /** @} */
392} VMM;
393/** Pointer to VMM. */
394typedef VMM *PVMM;
395
396
397/**
398 * VMMCPU Data (part of VMCPU)
399 */
400typedef struct VMMCPU
401{
402 /** Offset to the VMCPU structure.
403 * See VMM2VMCPU(). */
404 int32_t offVMCPU;
405
406 /** The last RC/R0 return code. */
407 int32_t iLastGZRc;
408
409 /** VMM stack, pointer to the top of the stack in R3.
410 * Stack is allocated from the hypervisor heap and is page aligned
411 * and always writable in RC. */
412 R3PTRTYPE(uint8_t *) pbEMTStackR3;
413 /** Pointer to the bottom of the stack - needed for doing relocations. */
414 RCPTRTYPE(uint8_t *) pbEMTStackRC;
415 /** Pointer to the bottom of the stack - needed for doing relocations. */
416 RCPTRTYPE(uint8_t *) pbEMTStackBottomRC;
417
418 /** Pointer to the R0 logger instance - R3 Ptr.
419 * This is NULL if logging is disabled. */
420 R3PTRTYPE(PVMMR0LOGGER) pR0LoggerR3;
421 /** Pointer to the R0 logger instance - R0 Ptr.
422 * This is NULL if logging is disabled. */
423 R0PTRTYPE(PVMMR0LOGGER) pR0LoggerR0;
424
425 /** Thread context switching hook (ring-0). */
426 RTTHREADCTXHOOK hCtxHook;
427
428 /** @name Rendezvous
429 * @{ */
430 /** Whether the EMT is executing a rendezvous right now. For detecting
431 * attempts at recursive rendezvous. */
432 bool volatile fInRendezvous;
433 bool afPadding[HC_ARCH_BITS == 32 ? 3+4 : 7+8];
434 /** @} */
435
436 /** @name Raw-mode context tracing data.
437 * @{ */
438 SUPDRVTRACERUSRCTX TracerCtx;
439 /** @} */
440
441 /** Alignment padding, making sure u64CallRing3Arg is nicely aligned. */
442 uint32_t au32Padding1[3];
443
444 /** @name Call Ring-3
445 * Formerly known as host calls.
446 * @{ */
447 /** The disable counter. */
448 uint32_t cCallRing3Disabled;
449 /** The pending operation. */
450 VMMCALLRING3 enmCallRing3Operation;
451 /** The result of the last operation. */
452 int32_t rcCallRing3;
453 /** The argument to the operation. */
454 uint64_t u64CallRing3Arg;
455 /** The Ring-0 notification callback. */
456 R0PTRTYPE(PFNVMMR0CALLRING3NOTIFICATION) pfnCallRing3CallbackR0;
457 /** The Ring-0 notification callback user argument. */
458 R0PTRTYPE(void *) pvCallRing3CallbackUserR0;
459 /** The Ring-0 jmp buffer.
460 * @remarks The size of this type isn't stable in assembly, so don't put
461 * anything that needs to be accessed from assembly after it. */
462 VMMR0JMPBUF CallRing3JmpBufR0;
463 /** @} */
464} VMMCPU;
465AssertCompileMemberAlignment(VMMCPU, TracerCtx, 8);
466/** Pointer to VMMCPU. */
467typedef VMMCPU *PVMMCPU;
468
469
470/**
471 * The VMMRCEntry() codes.
472 */
473typedef enum VMMRCOPERATION
474{
475 /** Do GC module init. */
476 VMMRC_DO_VMMRC_INIT = 1,
477
478 /** The first Trap testcase. */
479 VMMRC_DO_TESTCASE_TRAP_FIRST = 0x0dead000,
480 /** Trap 0 testcases, uArg selects the variation. */
481 VMMRC_DO_TESTCASE_TRAP_0 = VMMRC_DO_TESTCASE_TRAP_FIRST,
482 /** Trap 1 testcases, uArg selects the variation. */
483 VMMRC_DO_TESTCASE_TRAP_1,
484 /** Trap 2 testcases, uArg selects the variation. */
485 VMMRC_DO_TESTCASE_TRAP_2,
486 /** Trap 3 testcases, uArg selects the variation. */
487 VMMRC_DO_TESTCASE_TRAP_3,
488 /** Trap 4 testcases, uArg selects the variation. */
489 VMMRC_DO_TESTCASE_TRAP_4,
490 /** Trap 5 testcases, uArg selects the variation. */
491 VMMRC_DO_TESTCASE_TRAP_5,
492 /** Trap 6 testcases, uArg selects the variation. */
493 VMMRC_DO_TESTCASE_TRAP_6,
494 /** Trap 7 testcases, uArg selects the variation. */
495 VMMRC_DO_TESTCASE_TRAP_7,
496 /** Trap 8 testcases, uArg selects the variation. */
497 VMMRC_DO_TESTCASE_TRAP_8,
498 /** Trap 9 testcases, uArg selects the variation. */
499 VMMRC_DO_TESTCASE_TRAP_9,
500 /** Trap 0a testcases, uArg selects the variation. */
501 VMMRC_DO_TESTCASE_TRAP_0A,
502 /** Trap 0b testcases, uArg selects the variation. */
503 VMMRC_DO_TESTCASE_TRAP_0B,
504 /** Trap 0c testcases, uArg selects the variation. */
505 VMMRC_DO_TESTCASE_TRAP_0C,
506 /** Trap 0d testcases, uArg selects the variation. */
507 VMMRC_DO_TESTCASE_TRAP_0D,
508 /** Trap 0e testcases, uArg selects the variation. */
509 VMMRC_DO_TESTCASE_TRAP_0E,
510 /** The last trap testcase (exclusive). */
511 VMMRC_DO_TESTCASE_TRAP_LAST,
512 /** Testcase for checking interrupt forwarding. */
513 VMMRC_DO_TESTCASE_HYPER_INTERRUPT,
514 /** Switching testing and profiling stub. */
515 VMMRC_DO_TESTCASE_NOP,
516 /** Testcase for checking interrupt masking. */
517 VMMRC_DO_TESTCASE_INTERRUPT_MASKING,
518 /** Switching testing and profiling stub. */
519 VMMRC_DO_TESTCASE_HM_NOP,
520
521 /** The usual 32-bit hack. */
522 VMMRC_DO_32_BIT_HACK = 0x7fffffff
523} VMMRCOPERATION;
524
525
526
527/**
528 * MSR test result entry.
529 */
530typedef struct VMMTESTMSRENTRY
531{
532 /** The MSR number, including padding.
533 * Set to UINT64_MAX if invalid MSR. */
534 uint64_t uMsr;
535 /** The register value. */
536 uint64_t uValue;
537} VMMTESTMSRENTRY;
538/** Pointer to an MSR test result entry. */
539typedef VMMTESTMSRENTRY *PVMMTESTMSRENTRY;
540
541
542
543RT_C_DECLS_BEGIN
544
545int vmmInitFormatTypes(void);
546void vmmTermFormatTypes(void);
547uint32_t vmmGetBuildType(void);
548
549#ifdef IN_RING3
550int vmmR3SwitcherInit(PVM pVM);
551void vmmR3SwitcherRelocate(PVM pVM, RTGCINTPTR offDelta);
552#endif /* IN_RING3 */
553
554#ifdef IN_RING0
555/**
556 * World switcher assembly routine.
557 * It will call VMMRCEntry().
558 *
559 * @returns return code from VMMRCEntry().
560 * @param pVM The cross context VM structure.
561 * @param uArg See VMMRCEntry().
562 * @internal
563 */
564DECLASM(int) vmmR0WorldSwitch(PVM pVM, unsigned uArg);
565
566/**
567 * Callback function for vmmR0CallRing3SetJmp.
568 *
569 * @returns VBox status code.
570 * @param pVM The cross context VM structure.
571 */
572typedef DECLCALLBACK(int) FNVMMR0SETJMP(PVM pVM, PVMCPU pVCpu);
573/** Pointer to FNVMMR0SETJMP(). */
574typedef FNVMMR0SETJMP *PFNVMMR0SETJMP;
575
576/**
577 * The setjmp variant used for calling Ring-3.
578 *
579 * This differs from the normal setjmp in that it will resume VMMRZCallRing3 if we're
580 * in the middle of a ring-3 call. Another differences is the function pointer and
581 * argument. This has to do with resuming code and the stack frame of the caller.
582 *
583 * @returns VINF_SUCCESS on success or whatever is passed to vmmR0CallRing3LongJmp.
584 * @param pJmpBuf The jmp_buf to set.
585 * @param pfn The function to be called when not resuming.
586 * @param pVM The cross context VM structure.
587 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
588 */
589DECLASM(int) vmmR0CallRing3SetJmp(PVMMR0JMPBUF pJmpBuf, PFNVMMR0SETJMP pfn, PVM pVM, PVMCPU pVCpu);
590
591/**
592 * Callback function for vmmR0CallRing3SetJmpEx.
593 *
594 * @returns VBox status code.
595 * @param pvUser The user argument.
596 */
597typedef DECLCALLBACK(int) FNVMMR0SETJMPEX(void *pvUser);
598/** Pointer to FNVMMR0SETJMP(). */
599typedef FNVMMR0SETJMPEX *PFNVMMR0SETJMPEX;
600
601/**
602 * Same as vmmR0CallRing3SetJmp except for the function signature.
603 *
604 * @returns VINF_SUCCESS on success or whatever is passed to vmmR0CallRing3LongJmp.
605 * @param pJmpBuf The jmp_buf to set.
606 * @param pfn The function to be called when not resuming.
607 * @param pvUser The argument of that function.
608 */
609DECLASM(int) vmmR0CallRing3SetJmpEx(PVMMR0JMPBUF pJmpBuf, PFNVMMR0SETJMPEX pfn, void *pvUser);
610
611
612/**
613 * Worker for VMMRZCallRing3.
614 * This will save the stack and registers.
615 *
616 * @returns rc.
617 * @param pJmpBuf Pointer to the jump buffer.
618 * @param rc The return code.
619 */
620DECLASM(int) vmmR0CallRing3LongJmp(PVMMR0JMPBUF pJmpBuf, int rc);
621
622/**
623 * Internal R0 logger worker: Logger wrapper.
624 */
625VMMR0DECL(void) vmmR0LoggerWrapper(const char *pszFormat, ...);
626
627/**
628 * Internal R0 logger worker: Flush logger.
629 *
630 * @param pLogger The logger instance to flush.
631 * @remark This function must be exported!
632 */
633VMMR0DECL(void) vmmR0LoggerFlush(PRTLOGGER pLogger);
634
635/**
636 * Internal R0 logger worker: Custom prefix.
637 *
638 * @returns Number of chars written.
639 *
640 * @param pLogger The logger instance.
641 * @param pchBuf The output buffer.
642 * @param cchBuf The size of the buffer.
643 * @param pvUser User argument (ignored).
644 */
645VMMR0DECL(size_t) vmmR0LoggerPrefix(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser);
646
647# ifdef VBOX_WITH_TRIPLE_FAULT_HACK
648int vmmR0TripleFaultHackInit(void);
649void vmmR0TripleFaultHackTerm(void);
650# endif
651
652#endif /* IN_RING0 */
653#ifdef IN_RC
654
655/**
656 * Internal GC logger worker: Logger wrapper.
657 */
658VMMRCDECL(void) vmmGCLoggerWrapper(const char *pszFormat, ...);
659
660/**
661 * Internal GC release logger worker: Logger wrapper.
662 */
663VMMRCDECL(void) vmmGCRelLoggerWrapper(const char *pszFormat, ...);
664
665/**
666 * Internal GC logger worker: Flush logger.
667 *
668 * @returns VINF_SUCCESS.
669 * @param pLogger The logger instance to flush.
670 * @remark This function must be exported!
671 */
672VMMRCDECL(int) vmmGCLoggerFlush(PRTLOGGERRC pLogger);
673
674/** @name Trap testcases and related labels.
675 * @{ */
676DECLASM(void) vmmGCEnableWP(void);
677DECLASM(void) vmmGCDisableWP(void);
678DECLASM(int) vmmGCTestTrap3(void);
679DECLASM(int) vmmGCTestTrap8(void);
680DECLASM(int) vmmGCTestTrap0d(void);
681DECLASM(int) vmmGCTestTrap0e(void);
682DECLASM(int) vmmGCTestTrap0e_FaultEIP(void); /**< a label */
683DECLASM(int) vmmGCTestTrap0e_ResumeEIP(void); /**< a label */
684/** @} */
685
686#endif /* IN_RC */
687
688RT_C_DECLS_END
689
690/** @} */
691
692#endif
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