VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmdrv.h@ 100855

Last change on this file since 100855 was 100779, checked in by vboxsync, 19 months ago

DrvVUSBRootHub: Don't arm a re-attach timer in vusbR3RhLoadDone when saved state loading failed, just re-attach immediately so it won't cause trouble later during VM termination & cleanup. bugref:10494

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 107.3 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Drivers.
3 */
4
5/*
6 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef VBOX_INCLUDED_vmm_pdmdrv_h
37#define VBOX_INCLUDED_vmm_pdmdrv_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#include <VBox/vmm/pdmqueue.h>
43#include <VBox/vmm/pdmcritsect.h>
44#include <VBox/vmm/pdmifs.h>
45#include <VBox/vmm/pdmins.h>
46#include <VBox/vmm/pdmcommon.h>
47#ifdef IN_RING3
48# include <VBox/vmm/pdmthread.h>
49# include <VBox/vmm/pdmasynccompletion.h>
50# include <VBox/vmm/pdmblkcache.h>
51#endif
52#include <VBox/vmm/tm.h>
53#include <VBox/vmm/ssm.h>
54#include <VBox/vmm/cfgm.h>
55#include <VBox/vmm/dbgf.h>
56#include <VBox/vmm/mm.h>
57#include <iprt/stdarg.h>
58
59
60RT_C_DECLS_BEGIN
61
62/** @defgroup grp_pdm_driver The PDM Drivers API
63 * @ingroup grp_pdm
64 * @{
65 */
66
67/** Pointer const PDM Driver API, ring-3. */
68typedef R3PTRTYPE(struct PDMDRVHLPR3 const *) PCPDMDRVHLPR3;
69/** Pointer const PDM Driver API, ring-0. */
70typedef R0PTRTYPE(struct PDMDRVHLPR0 const *) PCPDMDRVHLPR0;
71/** Pointer const PDM Driver API, raw-mode context. */
72typedef RCPTRTYPE(struct PDMDRVHLPRC const *) PCPDMDRVHLPRC;
73
74
75/**
76 * Construct a driver instance for a VM.
77 *
78 * @returns VBox status.
79 * @param pDrvIns The driver instance data. If the registration structure
80 * is needed, it can be accessed thru pDrvIns->pReg.
81 * @param pCfg Configuration node handle for the driver. This is
82 * expected to be in high demand in the constructor and is
83 * therefore passed as an argument. When using it at other
84 * times, it can be accessed via pDrvIns->pCfg.
85 * @param fFlags Flags, combination of the PDM_TACH_FLAGS_* \#defines.
86 */
87typedef DECLCALLBACKTYPE(int, FNPDMDRVCONSTRUCT,(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags));
88/** Pointer to a FNPDMDRVCONSTRUCT() function. */
89typedef FNPDMDRVCONSTRUCT *PFNPDMDRVCONSTRUCT;
90
91/**
92 * Destruct a driver instance.
93 *
94 * Most VM resources are freed by the VM. This callback is provided so that
95 * any non-VM resources can be freed correctly.
96 *
97 * @param pDrvIns The driver instance data.
98 */
99typedef DECLCALLBACKTYPE(void, FNPDMDRVDESTRUCT,(PPDMDRVINS pDrvIns));
100/** Pointer to a FNPDMDRVDESTRUCT() function. */
101typedef FNPDMDRVDESTRUCT *PFNPDMDRVDESTRUCT;
102
103/**
104 * Driver relocation callback.
105 *
106 * This is called when the instance data has been relocated in raw-mode context
107 * (RC). It is also called when the RC hypervisor selects changes. The driver
108 * must fixup all necessary pointers and re-query all interfaces to other RC
109 * devices and drivers.
110 *
111 * Before the RC code is executed the first time, this function will be called
112 * with a 0 delta so RC pointer calculations can be one in one place.
113 *
114 * @param pDrvIns Pointer to the driver instance.
115 * @param offDelta The relocation delta relative to the old location.
116 *
117 * @remark A relocation CANNOT fail.
118 */
119typedef DECLCALLBACKTYPE(void, FNPDMDRVRELOCATE,(PPDMDRVINS pDrvIns, RTGCINTPTR offDelta));
120/** Pointer to a FNPDMDRVRELOCATE() function. */
121typedef FNPDMDRVRELOCATE *PFNPDMDRVRELOCATE;
122
123/**
124 * Driver I/O Control interface.
125 *
126 * This is used by external components, such as the COM interface, to
127 * communicate with a driver using a driver specific interface. Generally,
128 * the driver interfaces are used for this task.
129 *
130 * @returns VBox status code.
131 * @param pDrvIns Pointer to the driver instance.
132 * @param uFunction Function to perform.
133 * @param pvIn Pointer to input data.
134 * @param cbIn Size of input data.
135 * @param pvOut Pointer to output data.
136 * @param cbOut Size of output data.
137 * @param pcbOut Where to store the actual size of the output data.
138 */
139typedef DECLCALLBACKTYPE(int, FNPDMDRVIOCTL,(PPDMDRVINS pDrvIns, uint32_t uFunction,
140 void *pvIn, uint32_t cbIn,
141 void *pvOut, uint32_t cbOut, uint32_t *pcbOut));
142/** Pointer to a FNPDMDRVIOCTL() function. */
143typedef FNPDMDRVIOCTL *PFNPDMDRVIOCTL;
144
145/**
146 * Power On notification.
147 *
148 * @param pDrvIns The driver instance data.
149 */
150typedef DECLCALLBACKTYPE(void, FNPDMDRVPOWERON,(PPDMDRVINS pDrvIns));
151/** Pointer to a FNPDMDRVPOWERON() function. */
152typedef FNPDMDRVPOWERON *PFNPDMDRVPOWERON;
153
154/**
155 * Reset notification.
156 *
157 * @param pDrvIns The driver instance data.
158 */
159typedef DECLCALLBACKTYPE(void, FNPDMDRVRESET,(PPDMDRVINS pDrvIns));
160/** Pointer to a FNPDMDRVRESET() function. */
161typedef FNPDMDRVRESET *PFNPDMDRVRESET;
162
163/**
164 * Suspend notification.
165 *
166 * @param pDrvIns The driver instance data.
167 */
168typedef DECLCALLBACKTYPE(void, FNPDMDRVSUSPEND,(PPDMDRVINS pDrvIns));
169/** Pointer to a FNPDMDRVSUSPEND() function. */
170typedef FNPDMDRVSUSPEND *PFNPDMDRVSUSPEND;
171
172/**
173 * Resume notification.
174 *
175 * @param pDrvIns The driver instance data.
176 */
177typedef DECLCALLBACKTYPE(void, FNPDMDRVRESUME,(PPDMDRVINS pDrvIns));
178/** Pointer to a FNPDMDRVRESUME() function. */
179typedef FNPDMDRVRESUME *PFNPDMDRVRESUME;
180
181/**
182 * Power Off notification.
183 *
184 * This is always called when VMR3PowerOff is called.
185 * There will be no callback when hot plugging devices or when replumbing the driver
186 * stack.
187 *
188 * @param pDrvIns The driver instance data.
189 */
190typedef DECLCALLBACKTYPE(void, FNPDMDRVPOWEROFF,(PPDMDRVINS pDrvIns));
191/** Pointer to a FNPDMDRVPOWEROFF() function. */
192typedef FNPDMDRVPOWEROFF *PFNPDMDRVPOWEROFF;
193
194/**
195 * Attach command.
196 *
197 * This is called to let the driver attach to a driver at runtime. This is not
198 * called during VM construction, the driver constructor have to do this by
199 * calling PDMDrvHlpAttach.
200 *
201 * This is like plugging in the keyboard or mouse after turning on the PC.
202 *
203 * @returns VBox status code.
204 * @param pDrvIns The driver instance.
205 * @param fFlags Flags, combination of the PDM_TACH_FLAGS_* \#defines.
206 */
207typedef DECLCALLBACKTYPE(int, FNPDMDRVATTACH,(PPDMDRVINS pDrvIns, uint32_t fFlags));
208/** Pointer to a FNPDMDRVATTACH() function. */
209typedef FNPDMDRVATTACH *PFNPDMDRVATTACH;
210
211/**
212 * Detach notification.
213 *
214 * This is called when a driver below it in the chain is detaching itself
215 * from it. The driver should adjust it's state to reflect this.
216 *
217 * This is like ejecting a cdrom or floppy.
218 *
219 * @param pDrvIns The driver instance.
220 * @param fFlags PDM_TACH_FLAGS_NOT_HOT_PLUG or 0.
221 */
222typedef DECLCALLBACKTYPE(void, FNPDMDRVDETACH,(PPDMDRVINS pDrvIns, uint32_t fFlags));
223/** Pointer to a FNPDMDRVDETACH() function. */
224typedef FNPDMDRVDETACH *PFNPDMDRVDETACH;
225
226
227
228/**
229 * PDM Driver Registration Structure.
230 *
231 * This structure is used when registering a driver from VBoxInitDrivers() (in
232 * host ring-3 context). PDM will continue use till the VM is terminated.
233 */
234typedef struct PDMDRVREG
235{
236 /** Structure version. PDM_DRVREG_VERSION defines the current version. */
237 uint32_t u32Version;
238 /** Driver name. */
239 char szName[32];
240 /** Name of the raw-mode context module (no path).
241 * Only evalutated if PDM_DRVREG_FLAGS_RC is set. */
242 char szRCMod[32];
243 /** Name of the ring-0 module (no path).
244 * Only evalutated if PDM_DRVREG_FLAGS_R0 is set. */
245 char szR0Mod[32];
246 /** The description of the driver. The UTF-8 string pointed to shall, like this structure,
247 * remain unchanged from registration till VM destruction. */
248 const char *pszDescription;
249
250 /** Flags, combination of the PDM_DRVREG_FLAGS_* \#defines. */
251 uint32_t fFlags;
252 /** Driver class(es), combination of the PDM_DRVREG_CLASS_* \#defines. */
253 uint32_t fClass;
254 /** Maximum number of instances (per VM). */
255 uint32_t cMaxInstances;
256 /** Size of the instance data. */
257 uint32_t cbInstance;
258
259 /** Construct instance - required. */
260 PFNPDMDRVCONSTRUCT pfnConstruct;
261 /** Destruct instance - optional. */
262 PFNPDMDRVDESTRUCT pfnDestruct;
263 /** Relocation command - optional. */
264 PFNPDMDRVRELOCATE pfnRelocate;
265 /** I/O control - optional. */
266 PFNPDMDRVIOCTL pfnIOCtl;
267 /** Power on notification - optional. */
268 PFNPDMDRVPOWERON pfnPowerOn;
269 /** Reset notification - optional. */
270 PFNPDMDRVRESET pfnReset;
271 /** Suspend notification - optional. */
272 PFNPDMDRVSUSPEND pfnSuspend;
273 /** Resume notification - optional. */
274 PFNPDMDRVRESUME pfnResume;
275 /** Attach command - optional. */
276 PFNPDMDRVATTACH pfnAttach;
277 /** Detach notification - optional. */
278 PFNPDMDRVDETACH pfnDetach;
279 /** Power off notification - optional. */
280 PFNPDMDRVPOWEROFF pfnPowerOff;
281 /** @todo */
282 PFNRT pfnSoftReset;
283 /** Initialization safty marker. */
284 uint32_t u32VersionEnd;
285} PDMDRVREG;
286/** Pointer to a PDM Driver Structure. */
287typedef PDMDRVREG *PPDMDRVREG;
288/** Const pointer to a PDM Driver Structure. */
289typedef PDMDRVREG const *PCPDMDRVREG;
290
291/** Current DRVREG version number. */
292#define PDM_DRVREG_VERSION PDM_VERSION_MAKE(0xf0ff, 1, 0)
293
294/** PDM Driver Flags.
295 * @{ */
296/** @def PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT
297 * The bit count for the current host. */
298#if HC_ARCH_BITS == 32
299# define PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT UINT32_C(0x00000001)
300#elif HC_ARCH_BITS == 64
301# define PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT UINT32_C(0x00000002)
302#else
303# error Unsupported HC_ARCH_BITS value.
304#endif
305/** The host bit count mask. */
306#define PDM_DRVREG_FLAGS_HOST_BITS_MASK UINT32_C(0x00000003)
307/** This flag is used to indicate that the driver has a RC component. */
308#define PDM_DRVREG_FLAGS_RC UINT32_C(0x00000010)
309/** This flag is used to indicate that the driver has a R0 component. */
310#define PDM_DRVREG_FLAGS_R0 UINT32_C(0x00000020)
311
312/** @} */
313
314
315/** PDM Driver Classes.
316 * @{ */
317/** Mouse input driver. */
318#define PDM_DRVREG_CLASS_MOUSE RT_BIT(0)
319/** Keyboard input driver. */
320#define PDM_DRVREG_CLASS_KEYBOARD RT_BIT(1)
321/** Display driver. */
322#define PDM_DRVREG_CLASS_DISPLAY RT_BIT(2)
323/** Network transport driver. */
324#define PDM_DRVREG_CLASS_NETWORK RT_BIT(3)
325/** Block driver. */
326#define PDM_DRVREG_CLASS_BLOCK RT_BIT(4)
327/** Media driver. */
328#define PDM_DRVREG_CLASS_MEDIA RT_BIT(5)
329/** Mountable driver. */
330#define PDM_DRVREG_CLASS_MOUNTABLE RT_BIT(6)
331/** Audio driver. */
332#define PDM_DRVREG_CLASS_AUDIO RT_BIT(7)
333/** VMMDev driver. */
334#define PDM_DRVREG_CLASS_VMMDEV RT_BIT(8)
335/** Status driver. */
336#define PDM_DRVREG_CLASS_STATUS RT_BIT(9)
337/** ACPI driver. */
338#define PDM_DRVREG_CLASS_ACPI RT_BIT(10)
339/** USB related driver. */
340#define PDM_DRVREG_CLASS_USB RT_BIT(11)
341/** ISCSI Transport related driver. */
342#define PDM_DRVREG_CLASS_ISCSITRANSPORT RT_BIT(12)
343/** Char driver. */
344#define PDM_DRVREG_CLASS_CHAR RT_BIT(13)
345/** Stream driver. */
346#define PDM_DRVREG_CLASS_STREAM RT_BIT(14)
347/** SCSI driver. */
348#define PDM_DRVREG_CLASS_SCSI RT_BIT(15)
349/** Generic raw PCI device driver. */
350#define PDM_DRVREG_CLASS_PCIRAW RT_BIT(16)
351/** @} */
352
353
354/**
355 * PDM Driver Instance.
356 *
357 * @implements PDMIBASE
358 */
359typedef struct PDMDRVINS
360{
361 /** Structure version. PDM_DRVINS_VERSION defines the current version. */
362 uint32_t u32Version;
363 /** Driver instance number. */
364 uint32_t iInstance;
365
366 /** Pointer the PDM Driver API. */
367 RCPTRTYPE(PCPDMDRVHLPRC) pHlpRC;
368 /** Pointer to driver instance data. */
369 RCPTRTYPE(void *) pvInstanceDataRC;
370
371 /** Pointer the PDM Driver API. */
372 R0PTRTYPE(PCPDMDRVHLPR0) pHlpR0;
373 /** Pointer to driver instance data. */
374 R0PTRTYPE(void *) pvInstanceDataR0;
375
376 /** Pointer the PDM Driver API. */
377 R3PTRTYPE(PCPDMDRVHLPR3) pHlpR3;
378 /** Pointer to driver instance data. */
379 R3PTRTYPE(void *) pvInstanceDataR3;
380
381 /** Pointer to driver registration structure. */
382 R3PTRTYPE(PCPDMDRVREG) pReg;
383 /** Configuration handle. */
384 R3PTRTYPE(PCFGMNODE) pCfg;
385
386 /** Pointer to the base interface of the device/driver instance above. */
387 R3PTRTYPE(PPDMIBASE) pUpBase;
388 /** Pointer to the base interface of the driver instance below. */
389 R3PTRTYPE(PPDMIBASE) pDownBase;
390
391 /** The base interface of the driver.
392 * The driver constructor initializes this. */
393 PDMIBASE IBase;
394
395 /** Tracing indicator. */
396 uint32_t fTracing;
397 /** The tracing ID of this device. */
398 uint32_t idTracing;
399#if HC_ARCH_BITS == 32
400 /** Align the internal data more naturally. */
401 uint32_t au32Padding[HC_ARCH_BITS == 32 ? 7 : 0];
402#endif
403
404 /** Internal data. */
405 union
406 {
407#ifdef PDMDRVINSINT_DECLARED
408 PDMDRVINSINT s;
409#endif
410 uint8_t padding[HC_ARCH_BITS == 32 ? 40 + 32 : 72 + 24];
411 } Internal;
412
413 /** Driver instance data. The size of this area is defined
414 * in the PDMDRVREG::cbInstanceData field. */
415 char achInstanceData[4];
416} PDMDRVINS;
417
418/** Current DRVREG version number. */
419#define PDM_DRVINS_VERSION PDM_VERSION_MAKE(0xf0fe, 2, 0)
420
421/** Converts a pointer to the PDMDRVINS::IBase to a pointer to PDMDRVINS. */
422#define PDMIBASE_2_PDMDRV(pInterface) ( (PPDMDRVINS)((char *)(pInterface) - RT_UOFFSETOF(PDMDRVINS, IBase)) )
423
424/** @def PDMDRVINS_2_RCPTR
425 * Converts a PDM Driver instance pointer a RC PDM Driver instance pointer.
426 */
427#define PDMDRVINS_2_RCPTR(pDrvIns) ( (RCPTRTYPE(PPDMDRVINS))((RTRCUINTPTR)(pDrvIns)->pvInstanceDataRC - (RTRCUINTPTR)RT_UOFFSETOF(PDMDRVINS, achInstanceData)) )
428
429/** @def PDMDRVINS_2_R3PTR
430 * Converts a PDM Driver instance pointer a R3 PDM Driver instance pointer.
431 */
432#define PDMDRVINS_2_R3PTR(pDrvIns) ( (R3PTRTYPE(PPDMDRVINS))((RTHCUINTPTR)(pDrvIns)->pvInstanceDataR3 - RT_UOFFSETOF(PDMDRVINS, achInstanceData)) )
433
434/** @def PDMDRVINS_2_R0PTR
435 * Converts a PDM Driver instance pointer a R0 PDM Driver instance pointer.
436 */
437#define PDMDRVINS_2_R0PTR(pDrvIns) ( (R0PTRTYPE(PPDMDRVINS))((RTR0UINTPTR)(pDrvIns)->pvInstanceDataR0 - RT_UOFFSETOF(PDMDRVINS, achInstanceData)) )
438
439
440
441/**
442 * Checks the structure versions of the drive instance and driver helpers,
443 * returning if they are incompatible.
444 *
445 * Intended for the constructor.
446 *
447 * @param pDrvIns Pointer to the PDM driver instance.
448 */
449#define PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns) \
450 do \
451 { \
452 PPDMDRVINS pDrvInsTypeCheck = (pDrvIns); NOREF(pDrvInsTypeCheck); \
453 AssertLogRelMsgReturn(PDM_VERSION_ARE_COMPATIBLE((pDrvIns)->u32Version, PDM_DRVINS_VERSION), \
454 ("DrvIns=%#x mine=%#x\n", (pDrvIns)->u32Version, PDM_DRVINS_VERSION), \
455 VERR_PDM_DRVINS_VERSION_MISMATCH); \
456 AssertLogRelMsgReturn(PDM_VERSION_ARE_COMPATIBLE((pDrvIns)->pHlpR3->u32Version, PDM_DRVHLPR3_VERSION), \
457 ("DrvHlp=%#x mine=%#x\n", (pDrvIns)->pHlpR3->u32Version, PDM_DRVHLPR3_VERSION), \
458 VERR_PDM_DRVHLPR3_VERSION_MISMATCH); \
459 } while (0)
460
461/**
462 * Quietly checks the structure versions of the drive instance and driver
463 * helpers, returning if they are incompatible.
464 *
465 * Intended for the destructor.
466 *
467 * @param pDrvIns Pointer to the PDM driver instance.
468 */
469#define PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns) \
470 do \
471 { \
472 PPDMDRVINS pDrvInsTypeCheck = (pDrvIns); NOREF(pDrvInsTypeCheck); \
473 if (RT_LIKELY( PDM_VERSION_ARE_COMPATIBLE((pDrvIns)->u32Version, PDM_DRVINS_VERSION) \
474 && PDM_VERSION_ARE_COMPATIBLE((pDrvIns)->pHlpR3->u32Version, PDM_DRVHLPR3_VERSION)) ) \
475 { /* likely */ } else return; \
476 } while (0)
477
478/**
479 * Wrapper around CFGMR3ValidateConfig for the root config for use in the
480 * constructor - returns on failure.
481 *
482 * This should be invoked after having initialized the instance data
483 * sufficiently for the correct operation of the destructor. The destructor is
484 * always called!
485 *
486 * @param pDrvIns Pointer to the PDM driver instance.
487 * @param pszValidValues Patterns describing the valid value names. See
488 * RTStrSimplePatternMultiMatch for details on the
489 * pattern syntax.
490 * @param pszValidNodes Patterns describing the valid node (key) names.
491 * Pass empty string if no valid nodess.
492 */
493#define PDMDRV_VALIDATE_CONFIG_RETURN(pDrvIns, pszValidValues, pszValidNodes) \
494 do \
495 { \
496 int rcValCfg = pDrvIns->pHlpR3->pfnCFGMValidateConfig((pDrvIns)->pCfg, "/", pszValidValues, pszValidNodes, \
497 (pDrvIns)->pReg->szName, (pDrvIns)->iInstance); \
498 if (RT_SUCCESS(rcValCfg)) \
499 { /* likely */ } else return rcValCfg; \
500 } while (0)
501
502
503
504/**
505 * USB hub registration structure.
506 */
507typedef struct PDMUSBHUBREG
508{
509 /** Structure version number. PDM_USBHUBREG_VERSION defines the current version. */
510 uint32_t u32Version;
511
512 /**
513 * Request the hub to attach of the specified device.
514 *
515 * @returns VBox status code.
516 * @param pDrvIns The hub instance.
517 * @param pUsbIns The device to attach.
518 * @param pszCaptureFilename Path to the file for USB traffic capturing, optional.
519 * @param piPort Where to store the port number the device was attached to.
520 * @thread EMT.
521 */
522 DECLR3CALLBACKMEMBER(int, pfnAttachDevice,(PPDMDRVINS pDrvIns, PPDMUSBINS pUsbIns, const char *pszCaptureFilename, uint32_t *piPort));
523
524 /**
525 * Request the hub to detach of the specified device.
526 *
527 * The device has previously been attached to the hub with the
528 * pfnAttachDevice call. This call is not currently expected to
529 * fail.
530 *
531 * @returns VBox status code.
532 * @param pDrvIns The hub instance.
533 * @param pUsbIns The device to detach.
534 * @param iPort The port number returned by the attach call.
535 * @thread EMT.
536 */
537 DECLR3CALLBACKMEMBER(int, pfnDetachDevice,(PPDMDRVINS pDrvIns, PPDMUSBINS pUsbIns, uint32_t iPort));
538
539 /** Counterpart to u32Version, same value. */
540 uint32_t u32TheEnd;
541} PDMUSBHUBREG;
542/** Pointer to a const USB hub registration structure. */
543typedef const PDMUSBHUBREG *PCPDMUSBHUBREG;
544
545/** Current PDMUSBHUBREG version number. */
546#define PDM_USBHUBREG_VERSION PDM_VERSION_MAKE(0xf0fd, 2, 0)
547
548
549/**
550 * USB hub helpers.
551 * This is currently just a place holder.
552 */
553typedef struct PDMUSBHUBHLP
554{
555 /** Structure version. PDM_USBHUBHLP_VERSION defines the current version. */
556 uint32_t u32Version;
557
558 /** Just a safety precaution. */
559 uint32_t u32TheEnd;
560} PDMUSBHUBHLP;
561/** Pointer to PCI helpers. */
562typedef PDMUSBHUBHLP *PPDMUSBHUBHLP;
563/** Pointer to const PCI helpers. */
564typedef const PDMUSBHUBHLP *PCPDMUSBHUBHLP;
565/** Pointer to const PCI helpers pointer. */
566typedef PCPDMUSBHUBHLP *PPCPDMUSBHUBHLP;
567
568/** Current PDMUSBHUBHLP version number. */
569#define PDM_USBHUBHLP_VERSION PDM_VERSION_MAKE(0xf0fc, 1, 0)
570
571
572/**
573 * PDM Driver API - raw-mode context variant.
574 */
575typedef struct PDMDRVHLPRC
576{
577 /** Structure version. PDM_DRVHLPRC_VERSION defines the current version. */
578 uint32_t u32Version;
579
580 /**
581 * Assert that the current thread is the emulation thread.
582 *
583 * @returns True if correct.
584 * @returns False if wrong.
585 * @param pDrvIns Driver instance.
586 * @param pszFile Filename of the assertion location.
587 * @param iLine Linenumber of the assertion location.
588 * @param pszFunction Function of the assertion location.
589 */
590 DECLRCCALLBACKMEMBER(bool, pfnAssertEMT,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
591
592 /**
593 * Assert that the current thread is NOT the emulation thread.
594 *
595 * @returns True if correct.
596 * @returns False if wrong.
597 * @param pDrvIns Driver instance.
598 * @param pszFile Filename of the assertion location.
599 * @param iLine Linenumber of the assertion location.
600 * @param pszFunction Function of the assertion location.
601 */
602 DECLRCCALLBACKMEMBER(bool, pfnAssertOther,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
603
604 /** @name Exported PDM Critical Section Functions
605 * @{ */
606 DECLRCCALLBACKMEMBER(int, pfnCritSectEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy));
607 DECLRCCALLBACKMEMBER(int, pfnCritSectEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL));
608 DECLRCCALLBACKMEMBER(int, pfnCritSectTryEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
609 DECLRCCALLBACKMEMBER(int, pfnCritSectTryEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL));
610 DECLRCCALLBACKMEMBER(int, pfnCritSectLeave,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
611 DECLRCCALLBACKMEMBER(bool, pfnCritSectIsOwner,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
612 DECLRCCALLBACKMEMBER(bool, pfnCritSectIsInitialized,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
613 DECLRCCALLBACKMEMBER(bool, pfnCritSectHasWaiters,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
614 DECLRCCALLBACKMEMBER(uint32_t, pfnCritSectGetRecursion,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
615 /** @} */
616
617 /**
618 * Obtains bandwidth in a bandwidth group.
619 *
620 * @returns True if bandwidth was allocated, false if not.
621 * @param pDrvIns The driver instance.
622 * @param pFilter Pointer to the filter that allocates bandwidth.
623 * @param cbTransfer Number of bytes to allocate.
624 */
625 DECLRCCALLBACKMEMBER(bool, pfnNetShaperAllocateBandwidth,(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer));
626
627 /** Just a safety precaution. */
628 uint32_t u32TheEnd;
629} PDMDRVHLPRC;
630/** Current PDMDRVHLPRC version number. */
631#define PDM_DRVHLPRC_VERSION PDM_VERSION_MAKE(0xf0f9, 6, 0)
632
633
634/**
635 * PDM Driver API, ring-0 context.
636 */
637typedef struct PDMDRVHLPR0
638{
639 /** Structure version. PDM_DRVHLPR0_VERSION defines the current version. */
640 uint32_t u32Version;
641
642 /**
643 * Assert that the current thread is the emulation thread.
644 *
645 * @returns True if correct.
646 * @returns False if wrong.
647 * @param pDrvIns Driver instance.
648 * @param pszFile Filename of the assertion location.
649 * @param iLine Linenumber of the assertion location.
650 * @param pszFunction Function of the assertion location.
651 */
652 DECLR0CALLBACKMEMBER(bool, pfnAssertEMT,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
653
654 /**
655 * Assert that the current thread is NOT the emulation thread.
656 *
657 * @returns True if correct.
658 * @returns False if wrong.
659 * @param pDrvIns Driver instance.
660 * @param pszFile Filename of the assertion location.
661 * @param iLine Linenumber of the assertion location.
662 * @param pszFunction Function of the assertion location.
663 */
664 DECLR0CALLBACKMEMBER(bool, pfnAssertOther,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
665
666 /** @name Exported PDM Critical Section Functions
667 * @{ */
668 DECLR0CALLBACKMEMBER(int, pfnCritSectEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy));
669 DECLR0CALLBACKMEMBER(int, pfnCritSectEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL));
670 DECLR0CALLBACKMEMBER(int, pfnCritSectTryEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
671 DECLR0CALLBACKMEMBER(int, pfnCritSectTryEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL));
672 DECLR0CALLBACKMEMBER(int, pfnCritSectLeave,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
673 DECLR0CALLBACKMEMBER(bool, pfnCritSectIsOwner,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
674 DECLR0CALLBACKMEMBER(bool, pfnCritSectIsInitialized,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
675 DECLR0CALLBACKMEMBER(bool, pfnCritSectHasWaiters,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
676 DECLR0CALLBACKMEMBER(uint32_t, pfnCritSectGetRecursion,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
677 DECLR0CALLBACKMEMBER(int, pfnCritSectScheduleExitEvent,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, SUPSEMEVENT hEventToSignal));
678 /** @} */
679
680 /**
681 * Obtains bandwidth in a bandwidth group.
682 *
683 * @returns True if bandwidth was allocated, false if not.
684 * @param pDrvIns The driver instance.
685 * @param pFilter Pointer to the filter that allocates bandwidth.
686 * @param cbTransfer Number of bytes to allocate.
687 */
688 DECLR0CALLBACKMEMBER(bool, pfnNetShaperAllocateBandwidth,(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer));
689
690 /** Just a safety precaution. */
691 uint32_t u32TheEnd;
692} PDMDRVHLPR0;
693/** Current DRVHLP version number. */
694#define PDM_DRVHLPR0_VERSION PDM_VERSION_MAKE(0xf0f8, 6, 0)
695
696
697#ifdef IN_RING3
698
699/**
700 * PDM Driver API.
701 */
702typedef struct PDMDRVHLPR3
703{
704 /** Structure version. PDM_DRVHLPR3_VERSION defines the current version. */
705 uint32_t u32Version;
706
707 /**
708 * Attaches a driver (chain) to the driver.
709 *
710 * @returns VBox status code.
711 * @param pDrvIns Driver instance.
712 * @param fFlags PDM_TACH_FLAGS_NOT_HOT_PLUG or 0.
713 * @param ppBaseInterface Where to store the pointer to the base interface.
714 */
715 DECLR3CALLBACKMEMBER(int, pfnAttach,(PPDMDRVINS pDrvIns, uint32_t fFlags, PPDMIBASE *ppBaseInterface));
716
717 /**
718 * Detach the driver the drivers below us.
719 *
720 * @returns VBox status code.
721 * @param pDrvIns Driver instance.
722 * @param fFlags PDM_TACH_FLAGS_NOT_HOT_PLUG or 0.
723 */
724 DECLR3CALLBACKMEMBER(int, pfnDetach,(PPDMDRVINS pDrvIns, uint32_t fFlags));
725
726 /**
727 * Detach the driver from the driver above it and destroy this
728 * driver and all drivers below it.
729 *
730 * @returns VBox status code.
731 * @param pDrvIns Driver instance.
732 * @param fFlags PDM_TACH_FLAGS_NOT_HOT_PLUG or 0.
733 */
734 DECLR3CALLBACKMEMBER(int, pfnDetachSelf,(PPDMDRVINS pDrvIns, uint32_t fFlags));
735
736 /**
737 * Prepare a media mount.
738 *
739 * The driver must not have anything attached to itself
740 * when calling this function as the purpose is to set up the configuration
741 * of an future attachment.
742 *
743 * @returns VBox status code
744 * @param pDrvIns Driver instance.
745 * @param pszFilename Pointer to filename. If this is NULL it assumed that the caller have
746 * constructed a configuration which can be attached to the bottom driver.
747 * @param pszCoreDriver Core driver name. NULL will cause autodetection. Ignored if pszFilanem is NULL.
748 */
749 DECLR3CALLBACKMEMBER(int, pfnMountPrepare,(PPDMDRVINS pDrvIns, const char *pszFilename, const char *pszCoreDriver));
750
751 /**
752 * Assert that the current thread is the emulation thread.
753 *
754 * @returns True if correct.
755 * @returns False if wrong.
756 * @param pDrvIns Driver instance.
757 * @param pszFile Filename of the assertion location.
758 * @param iLine Linenumber of the assertion location.
759 * @param pszFunction Function of the assertion location.
760 */
761 DECLR3CALLBACKMEMBER(bool, pfnAssertEMT,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
762
763 /**
764 * Assert that the current thread is NOT the emulation thread.
765 *
766 * @returns True if correct.
767 * @returns False if wrong.
768 * @param pDrvIns Driver instance.
769 * @param pszFile Filename of the assertion location.
770 * @param iLine Linenumber of the assertion location.
771 * @param pszFunction Function of the assertion location.
772 */
773 DECLR3CALLBACKMEMBER(bool, pfnAssertOther,(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction));
774
775 /**
776 * Set the VM error message
777 *
778 * @returns rc.
779 * @param pDrvIns Driver instance.
780 * @param rc VBox status code.
781 * @param SRC_POS Use RT_SRC_POS.
782 * @param pszFormat Error message format string.
783 * @param va Error message arguments.
784 */
785 DECLR3CALLBACKMEMBER(int, pfnVMSetErrorV,(PPDMDRVINS pDrvIns, int rc, RT_SRC_POS_DECL,
786 const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(6, 0));
787
788 /**
789 * Set the VM runtime error message
790 *
791 * @returns VBox status code.
792 * @param pDrvIns Driver instance.
793 * @param fFlags The action flags. See VMSETRTERR_FLAGS_*.
794 * @param pszErrorId Error ID string.
795 * @param pszFormat Error message format string.
796 * @param va Error message arguments.
797 */
798 DECLR3CALLBACKMEMBER(int, pfnVMSetRuntimeErrorV,(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId,
799 const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(4, 0));
800
801 /**
802 * Gets the VM state.
803 *
804 * @returns VM state.
805 * @param pDrvIns The driver instance.
806 * @thread Any thread (just keep in mind that it's volatile info).
807 */
808 DECLR3CALLBACKMEMBER(VMSTATE, pfnVMState, (PPDMDRVINS pDrvIns));
809
810 /**
811 * Checks if the VM was teleported and hasn't been fully resumed yet.
812 *
813 * @returns true / false.
814 * @param pDrvIns The driver instance.
815 * @thread Any thread.
816 */
817 DECLR3CALLBACKMEMBER(bool, pfnVMTeleportedAndNotFullyResumedYet,(PPDMDRVINS pDrvIns));
818
819 /**
820 * Gets the support driver session.
821 *
822 * This is intended for working using the semaphore API.
823 *
824 * @returns Support driver session handle.
825 * @param pDrvIns The driver instance.
826 */
827 DECLR3CALLBACKMEMBER(PSUPDRVSESSION, pfnGetSupDrvSession,(PPDMDRVINS pDrvIns));
828
829 /** @name Exported PDM Queue Functions
830 * @{ */
831 /**
832 * Create a queue.
833 *
834 * @returns VBox status code.
835 * @param pDrvIns Driver instance.
836 * @param cbItem Size a queue item.
837 * @param cItems Number of items in the queue.
838 * @param cMilliesInterval Number of milliseconds between polling the queue.
839 * If 0 then the emulation thread will be notified whenever an item arrives.
840 * @param pfnCallback The consumer function.
841 * @param pszName The queue base name. The instance number will be
842 * appended automatically.
843 * @param phQueue Where to store the queue handle on success.
844 * @thread The emulation thread.
845 */
846 DECLR3CALLBACKMEMBER(int, pfnQueueCreate,(PPDMDRVINS pDrvIns, uint32_t cbItem, uint32_t cItems, uint32_t cMilliesInterval,
847 PFNPDMQUEUEDRV pfnCallback, const char *pszName, PDMQUEUEHANDLE *phQueue));
848
849 DECLR3CALLBACKMEMBER(PPDMQUEUEITEMCORE, pfnQueueAlloc,(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue));
850 DECLR3CALLBACKMEMBER(int, pfnQueueInsert,(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue, PPDMQUEUEITEMCORE pItem));
851 DECLR3CALLBACKMEMBER(bool, pfnQueueFlushIfNecessary,(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue));
852 /** @} */
853
854 /**
855 * Query the virtual timer frequency.
856 *
857 * @returns Frequency in Hz.
858 * @param pDrvIns Driver instance.
859 * @thread Any thread.
860 */
861 DECLR3CALLBACKMEMBER(uint64_t, pfnTMGetVirtualFreq,(PPDMDRVINS pDrvIns));
862
863 /**
864 * Query the virtual time.
865 *
866 * @returns The current virtual time.
867 * @param pDrvIns Driver instance.
868 * @thread Any thread.
869 */
870 DECLR3CALLBACKMEMBER(uint64_t, pfnTMGetVirtualTime,(PPDMDRVINS pDrvIns));
871
872 /**
873 * Creates a timer.
874 *
875 * @returns VBox status.
876 * @param pDrvIns Driver instance.
877 * @param enmClock The clock to use on this timer.
878 * @param pfnCallback Callback function.
879 * @param pvUser The user argument to the callback.
880 * @param fFlags Timer creation flags, see grp_tm_timer_flags.
881 * @param pszDesc Pointer to description string which must stay around
882 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
883 * @param phTimer Where to store the timer handle on success.
884 * @thread EMT
885 *
886 * @todo Need to add a bunch of timer helpers for this to be useful again.
887 * Will do when required.
888 */
889 DECLR3CALLBACKMEMBER(int, pfnTimerCreate,(PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, void *pvUser,
890 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer));
891
892 /**
893 * Destroys a timer.
894 *
895 * @returns VBox status.
896 * @param pDrvIns Driver instance.
897 * @param hTimer The timer handle to destroy.
898 */
899 DECLR3CALLBACKMEMBER(int, pfnTimerDestroy,(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer));
900
901 /**
902 * Register a save state data unit.
903 *
904 * @returns VBox status.
905 * @param pDrvIns Driver instance.
906 * @param uVersion Data layout version number.
907 * @param cbGuess The approximate amount of data in the unit.
908 * Only for progress indicators.
909 *
910 * @param pfnLivePrep Prepare live save callback, optional.
911 * @param pfnLiveExec Execute live save callback, optional.
912 * @param pfnLiveVote Vote live save callback, optional.
913 *
914 * @param pfnSavePrep Prepare save callback, optional.
915 * @param pfnSaveExec Execute save callback, optional.
916 * @param pfnSaveDone Done save callback, optional.
917 *
918 * @param pfnLoadPrep Prepare load callback, optional.
919 * @param pfnLoadExec Execute load callback, optional.
920 * @param pfnLoadDone Done load callback, optional.
921 */
922 DECLR3CALLBACKMEMBER(int, pfnSSMRegister,(PPDMDRVINS pDrvIns, uint32_t uVersion, size_t cbGuess,
923 PFNSSMDRVLIVEPREP pfnLivePrep, PFNSSMDRVLIVEEXEC pfnLiveExec, PFNSSMDRVLIVEVOTE pfnLiveVote,
924 PFNSSMDRVSAVEPREP pfnSavePrep, PFNSSMDRVSAVEEXEC pfnSaveExec, PFNSSMDRVSAVEDONE pfnSaveDone,
925 PFNSSMDRVLOADPREP pfnLoadPrep, PFNSSMDRVLOADEXEC pfnLoadExec, PFNSSMDRVLOADDONE pfnLoadDone));
926
927 /**
928 * Deregister a save state data unit.
929 *
930 * @returns VBox status.
931 * @param pDrvIns Driver instance.
932 * @param pszName Data unit name.
933 * @param uInstance The instance identifier of the data unit.
934 * This must together with the name be unique.
935 */
936 DECLR3CALLBACKMEMBER(int, pfnSSMDeregister,(PPDMDRVINS pDrvIns, const char *pszName, uint32_t uInstance));
937
938 /** @name Exported SSM Functions
939 * @{ */
940 DECLR3CALLBACKMEMBER(int, pfnSSMPutStruct,(PSSMHANDLE pSSM, const void *pvStruct, PCSSMFIELD paFields));
941 DECLR3CALLBACKMEMBER(int, pfnSSMPutStructEx,(PSSMHANDLE pSSM, const void *pvStruct, size_t cbStruct, uint32_t fFlags, PCSSMFIELD paFields, void *pvUser));
942 DECLR3CALLBACKMEMBER(int, pfnSSMPutBool,(PSSMHANDLE pSSM, bool fBool));
943 DECLR3CALLBACKMEMBER(int, pfnSSMPutU8,(PSSMHANDLE pSSM, uint8_t u8));
944 DECLR3CALLBACKMEMBER(int, pfnSSMPutS8,(PSSMHANDLE pSSM, int8_t i8));
945 DECLR3CALLBACKMEMBER(int, pfnSSMPutU16,(PSSMHANDLE pSSM, uint16_t u16));
946 DECLR3CALLBACKMEMBER(int, pfnSSMPutS16,(PSSMHANDLE pSSM, int16_t i16));
947 DECLR3CALLBACKMEMBER(int, pfnSSMPutU32,(PSSMHANDLE pSSM, uint32_t u32));
948 DECLR3CALLBACKMEMBER(int, pfnSSMPutS32,(PSSMHANDLE pSSM, int32_t i32));
949 DECLR3CALLBACKMEMBER(int, pfnSSMPutU64,(PSSMHANDLE pSSM, uint64_t u64));
950 DECLR3CALLBACKMEMBER(int, pfnSSMPutS64,(PSSMHANDLE pSSM, int64_t i64));
951 DECLR3CALLBACKMEMBER(int, pfnSSMPutU128,(PSSMHANDLE pSSM, uint128_t u128));
952 DECLR3CALLBACKMEMBER(int, pfnSSMPutS128,(PSSMHANDLE pSSM, int128_t i128));
953 DECLR3CALLBACKMEMBER(int, pfnSSMPutUInt,(PSSMHANDLE pSSM, RTUINT u));
954 DECLR3CALLBACKMEMBER(int, pfnSSMPutSInt,(PSSMHANDLE pSSM, RTINT i));
955 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCUInt,(PSSMHANDLE pSSM, RTGCUINT u));
956 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCUIntReg,(PSSMHANDLE pSSM, RTGCUINTREG u));
957 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCPhys32,(PSSMHANDLE pSSM, RTGCPHYS32 GCPhys));
958 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCPhys64,(PSSMHANDLE pSSM, RTGCPHYS64 GCPhys));
959 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCPhys,(PSSMHANDLE pSSM, RTGCPHYS GCPhys));
960 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCPtr,(PSSMHANDLE pSSM, RTGCPTR GCPtr));
961 DECLR3CALLBACKMEMBER(int, pfnSSMPutGCUIntPtr,(PSSMHANDLE pSSM, RTGCUINTPTR GCPtr));
962 DECLR3CALLBACKMEMBER(int, pfnSSMPutRCPtr,(PSSMHANDLE pSSM, RTRCPTR RCPtr));
963 DECLR3CALLBACKMEMBER(int, pfnSSMPutIOPort,(PSSMHANDLE pSSM, RTIOPORT IOPort));
964 DECLR3CALLBACKMEMBER(int, pfnSSMPutSel,(PSSMHANDLE pSSM, RTSEL Sel));
965 DECLR3CALLBACKMEMBER(int, pfnSSMPutMem,(PSSMHANDLE pSSM, const void *pv, size_t cb));
966 DECLR3CALLBACKMEMBER(int, pfnSSMPutStrZ,(PSSMHANDLE pSSM, const char *psz));
967 DECLR3CALLBACKMEMBER(int, pfnSSMGetStruct,(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFields));
968 DECLR3CALLBACKMEMBER(int, pfnSSMGetStructEx,(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct, uint32_t fFlags, PCSSMFIELD paFields, void *pvUser));
969 DECLR3CALLBACKMEMBER(int, pfnSSMGetBool,(PSSMHANDLE pSSM, bool *pfBool));
970 DECLR3CALLBACKMEMBER(int, pfnSSMGetBoolV,(PSSMHANDLE pSSM, bool volatile *pfBool));
971 DECLR3CALLBACKMEMBER(int, pfnSSMGetU8,(PSSMHANDLE pSSM, uint8_t *pu8));
972 DECLR3CALLBACKMEMBER(int, pfnSSMGetU8V,(PSSMHANDLE pSSM, uint8_t volatile *pu8));
973 DECLR3CALLBACKMEMBER(int, pfnSSMGetS8,(PSSMHANDLE pSSM, int8_t *pi8));
974 DECLR3CALLBACKMEMBER(int, pfnSSMGetS8V,(PSSMHANDLE pSSM, int8_t volatile *pi8));
975 DECLR3CALLBACKMEMBER(int, pfnSSMGetU16,(PSSMHANDLE pSSM, uint16_t *pu16));
976 DECLR3CALLBACKMEMBER(int, pfnSSMGetU16V,(PSSMHANDLE pSSM, uint16_t volatile *pu16));
977 DECLR3CALLBACKMEMBER(int, pfnSSMGetS16,(PSSMHANDLE pSSM, int16_t *pi16));
978 DECLR3CALLBACKMEMBER(int, pfnSSMGetS16V,(PSSMHANDLE pSSM, int16_t volatile *pi16));
979 DECLR3CALLBACKMEMBER(int, pfnSSMGetU32,(PSSMHANDLE pSSM, uint32_t *pu32));
980 DECLR3CALLBACKMEMBER(int, pfnSSMGetU32V,(PSSMHANDLE pSSM, uint32_t volatile *pu32));
981 DECLR3CALLBACKMEMBER(int, pfnSSMGetS32,(PSSMHANDLE pSSM, int32_t *pi32));
982 DECLR3CALLBACKMEMBER(int, pfnSSMGetS32V,(PSSMHANDLE pSSM, int32_t volatile *pi32));
983 DECLR3CALLBACKMEMBER(int, pfnSSMGetU64,(PSSMHANDLE pSSM, uint64_t *pu64));
984 DECLR3CALLBACKMEMBER(int, pfnSSMGetU64V,(PSSMHANDLE pSSM, uint64_t volatile *pu64));
985 DECLR3CALLBACKMEMBER(int, pfnSSMGetS64,(PSSMHANDLE pSSM, int64_t *pi64));
986 DECLR3CALLBACKMEMBER(int, pfnSSMGetS64V,(PSSMHANDLE pSSM, int64_t volatile *pi64));
987 DECLR3CALLBACKMEMBER(int, pfnSSMGetU128,(PSSMHANDLE pSSM, uint128_t *pu128));
988 DECLR3CALLBACKMEMBER(int, pfnSSMGetU128V,(PSSMHANDLE pSSM, uint128_t volatile *pu128));
989 DECLR3CALLBACKMEMBER(int, pfnSSMGetS128,(PSSMHANDLE pSSM, int128_t *pi128));
990 DECLR3CALLBACKMEMBER(int, pfnSSMGetS128V,(PSSMHANDLE pSSM, int128_t volatile *pi128));
991 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhys32,(PSSMHANDLE pSSM, PRTGCPHYS32 pGCPhys));
992 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhys32V,(PSSMHANDLE pSSM, RTGCPHYS32 volatile *pGCPhys));
993 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhys64,(PSSMHANDLE pSSM, PRTGCPHYS64 pGCPhys));
994 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhys64V,(PSSMHANDLE pSSM, RTGCPHYS64 volatile *pGCPhys));
995 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhys,(PSSMHANDLE pSSM, PRTGCPHYS pGCPhys));
996 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPhysV,(PSSMHANDLE pSSM, RTGCPHYS volatile *pGCPhys));
997 DECLR3CALLBACKMEMBER(int, pfnSSMGetUInt,(PSSMHANDLE pSSM, PRTUINT pu));
998 DECLR3CALLBACKMEMBER(int, pfnSSMGetSInt,(PSSMHANDLE pSSM, PRTINT pi));
999 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCUInt,(PSSMHANDLE pSSM, PRTGCUINT pu));
1000 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCUIntReg,(PSSMHANDLE pSSM, PRTGCUINTREG pu));
1001 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCPtr,(PSSMHANDLE pSSM, PRTGCPTR pGCPtr));
1002 DECLR3CALLBACKMEMBER(int, pfnSSMGetGCUIntPtr,(PSSMHANDLE pSSM, PRTGCUINTPTR pGCPtr));
1003 DECLR3CALLBACKMEMBER(int, pfnSSMGetRCPtr,(PSSMHANDLE pSSM, PRTRCPTR pRCPtr));
1004 DECLR3CALLBACKMEMBER(int, pfnSSMGetIOPort,(PSSMHANDLE pSSM, PRTIOPORT pIOPort));
1005 DECLR3CALLBACKMEMBER(int, pfnSSMGetSel,(PSSMHANDLE pSSM, PRTSEL pSel));
1006 DECLR3CALLBACKMEMBER(int, pfnSSMGetMem,(PSSMHANDLE pSSM, void *pv, size_t cb));
1007 DECLR3CALLBACKMEMBER(int, pfnSSMGetStrZ,(PSSMHANDLE pSSM, char *psz, size_t cbMax));
1008 DECLR3CALLBACKMEMBER(int, pfnSSMGetStrZEx,(PSSMHANDLE pSSM, char *psz, size_t cbMax, size_t *pcbStr));
1009 DECLR3CALLBACKMEMBER(int, pfnSSMSkip,(PSSMHANDLE pSSM, size_t cb));
1010 DECLR3CALLBACKMEMBER(int, pfnSSMSkipToEndOfUnit,(PSSMHANDLE pSSM));
1011 DECLR3CALLBACKMEMBER(int, pfnSSMSetLoadError,(PSSMHANDLE pSSM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(6, 7));
1012 DECLR3CALLBACKMEMBER(int, pfnSSMSetLoadErrorV,(PSSMHANDLE pSSM, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(6, 0));
1013 DECLR3CALLBACKMEMBER(int, pfnSSMSetCfgError,(PSSMHANDLE pSSM, RT_SRC_POS_DECL, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(5, 6));
1014 DECLR3CALLBACKMEMBER(int, pfnSSMSetCfgErrorV,(PSSMHANDLE pSSM, RT_SRC_POS_DECL, const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(5, 0));
1015 DECLR3CALLBACKMEMBER(int, pfnSSMHandleGetStatus,(PSSMHANDLE pSSM));
1016 DECLR3CALLBACKMEMBER(SSMAFTER, pfnSSMHandleGetAfter,(PSSMHANDLE pSSM));
1017 DECLR3CALLBACKMEMBER(bool, pfnSSMHandleIsLiveSave,(PSSMHANDLE pSSM));
1018 DECLR3CALLBACKMEMBER(uint32_t, pfnSSMHandleMaxDowntime,(PSSMHANDLE pSSM));
1019 DECLR3CALLBACKMEMBER(uint32_t, pfnSSMHandleHostBits,(PSSMHANDLE pSSM));
1020 DECLR3CALLBACKMEMBER(uint32_t, pfnSSMHandleRevision,(PSSMHANDLE pSSM));
1021 DECLR3CALLBACKMEMBER(uint32_t, pfnSSMHandleVersion,(PSSMHANDLE pSSM));
1022 DECLR3CALLBACKMEMBER(const char *, pfnSSMHandleHostOSAndArch,(PSSMHANDLE pSSM));
1023 /** @} */
1024
1025 /** @name Exported CFGM Functions.
1026 * @{ */
1027 DECLR3CALLBACKMEMBER(bool, pfnCFGMExists,( PCFGMNODE pNode, const char *pszName));
1028 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryType,( PCFGMNODE pNode, const char *pszName, PCFGMVALUETYPE penmType));
1029 DECLR3CALLBACKMEMBER(int, pfnCFGMQuerySize,( PCFGMNODE pNode, const char *pszName, size_t *pcb));
1030 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryInteger,( PCFGMNODE pNode, const char *pszName, uint64_t *pu64));
1031 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryIntegerDef,( PCFGMNODE pNode, const char *pszName, uint64_t *pu64, uint64_t u64Def));
1032 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryString,( PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString));
1033 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryStringDef,( PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString, const char *pszDef));
1034 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryPassword,( PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString));
1035 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryPasswordDef,( PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString, const char *pszDef));
1036 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryBytes,( PCFGMNODE pNode, const char *pszName, void *pvData, size_t cbData));
1037 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU64,( PCFGMNODE pNode, const char *pszName, uint64_t *pu64));
1038 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU64Def,( PCFGMNODE pNode, const char *pszName, uint64_t *pu64, uint64_t u64Def));
1039 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS64,( PCFGMNODE pNode, const char *pszName, int64_t *pi64));
1040 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS64Def,( PCFGMNODE pNode, const char *pszName, int64_t *pi64, int64_t i64Def));
1041 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU32,( PCFGMNODE pNode, const char *pszName, uint32_t *pu32));
1042 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU32Def,( PCFGMNODE pNode, const char *pszName, uint32_t *pu32, uint32_t u32Def));
1043 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS32,( PCFGMNODE pNode, const char *pszName, int32_t *pi32));
1044 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS32Def,( PCFGMNODE pNode, const char *pszName, int32_t *pi32, int32_t i32Def));
1045 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU16,( PCFGMNODE pNode, const char *pszName, uint16_t *pu16));
1046 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU16Def,( PCFGMNODE pNode, const char *pszName, uint16_t *pu16, uint16_t u16Def));
1047 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS16,( PCFGMNODE pNode, const char *pszName, int16_t *pi16));
1048 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS16Def,( PCFGMNODE pNode, const char *pszName, int16_t *pi16, int16_t i16Def));
1049 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU8,( PCFGMNODE pNode, const char *pszName, uint8_t *pu8));
1050 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryU8Def,( PCFGMNODE pNode, const char *pszName, uint8_t *pu8, uint8_t u8Def));
1051 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS8,( PCFGMNODE pNode, const char *pszName, int8_t *pi8));
1052 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryS8Def,( PCFGMNODE pNode, const char *pszName, int8_t *pi8, int8_t i8Def));
1053 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryBool,( PCFGMNODE pNode, const char *pszName, bool *pf));
1054 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryBoolDef,( PCFGMNODE pNode, const char *pszName, bool *pf, bool fDef));
1055 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryPort,( PCFGMNODE pNode, const char *pszName, PRTIOPORT pPort));
1056 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryPortDef,( PCFGMNODE pNode, const char *pszName, PRTIOPORT pPort, RTIOPORT PortDef));
1057 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryUInt,( PCFGMNODE pNode, const char *pszName, unsigned int *pu));
1058 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryUIntDef,( PCFGMNODE pNode, const char *pszName, unsigned int *pu, unsigned int uDef));
1059 DECLR3CALLBACKMEMBER(int, pfnCFGMQuerySInt,( PCFGMNODE pNode, const char *pszName, signed int *pi));
1060 DECLR3CALLBACKMEMBER(int, pfnCFGMQuerySIntDef,( PCFGMNODE pNode, const char *pszName, signed int *pi, signed int iDef));
1061 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtr,( PCFGMNODE pNode, const char *pszName, PRTGCPTR pGCPtr));
1062 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtrDef,( PCFGMNODE pNode, const char *pszName, PRTGCPTR pGCPtr, RTGCPTR GCPtrDef));
1063 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtrU,( PCFGMNODE pNode, const char *pszName, PRTGCUINTPTR pGCPtr));
1064 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtrUDef,( PCFGMNODE pNode, const char *pszName, PRTGCUINTPTR pGCPtr, RTGCUINTPTR GCPtrDef));
1065 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtrS,( PCFGMNODE pNode, const char *pszName, PRTGCINTPTR pGCPtr));
1066 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryGCPtrSDef,( PCFGMNODE pNode, const char *pszName, PRTGCINTPTR pGCPtr, RTGCINTPTR GCPtrDef));
1067 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryStringAlloc,( PCFGMNODE pNode, const char *pszName, char **ppszString));
1068 DECLR3CALLBACKMEMBER(int, pfnCFGMQueryStringAllocDef,(PCFGMNODE pNode, const char *pszName, char **ppszString, const char *pszDef));
1069 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetParent,(PCFGMNODE pNode));
1070 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetChild,(PCFGMNODE pNode, const char *pszPath));
1071 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetChildF,(PCFGMNODE pNode, const char *pszPathFormat, ...) RT_IPRT_FORMAT_ATTR(2, 3));
1072 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetChildFV,(PCFGMNODE pNode, const char *pszPathFormat, va_list Args) RT_IPRT_FORMAT_ATTR(3, 0));
1073 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetFirstChild,(PCFGMNODE pNode));
1074 DECLR3CALLBACKMEMBER(PCFGMNODE, pfnCFGMGetNextChild,(PCFGMNODE pCur));
1075 DECLR3CALLBACKMEMBER(int, pfnCFGMGetName,(PCFGMNODE pCur, char *pszName, size_t cchName));
1076 DECLR3CALLBACKMEMBER(size_t, pfnCFGMGetNameLen,(PCFGMNODE pCur));
1077 DECLR3CALLBACKMEMBER(bool, pfnCFGMAreChildrenValid,(PCFGMNODE pNode, const char *pszzValid));
1078 DECLR3CALLBACKMEMBER(PCFGMLEAF, pfnCFGMGetFirstValue,(PCFGMNODE pCur));
1079 DECLR3CALLBACKMEMBER(PCFGMLEAF, pfnCFGMGetNextValue,(PCFGMLEAF pCur));
1080 DECLR3CALLBACKMEMBER(int, pfnCFGMGetValueName,(PCFGMLEAF pCur, char *pszName, size_t cchName));
1081 DECLR3CALLBACKMEMBER(size_t, pfnCFGMGetValueNameLen,(PCFGMLEAF pCur));
1082 DECLR3CALLBACKMEMBER(CFGMVALUETYPE, pfnCFGMGetValueType,(PCFGMLEAF pCur));
1083 DECLR3CALLBACKMEMBER(bool, pfnCFGMAreValuesValid,(PCFGMNODE pNode, const char *pszzValid));
1084 DECLR3CALLBACKMEMBER(int, pfnCFGMValidateConfig,(PCFGMNODE pNode, const char *pszNode,
1085 const char *pszValidValues, const char *pszValidNodes,
1086 const char *pszWho, uint32_t uInstance));
1087 /** @} */
1088
1089 /**
1090 * Free memory allocated with pfnMMHeapAlloc() and pfnMMHeapAllocZ().
1091 *
1092 * @param pDrvIns Driver instance.
1093 * @param pv Pointer to the memory to free.
1094 */
1095 DECLR3CALLBACKMEMBER(void, pfnMMHeapFree,(PPDMDRVINS pDrvIns, void *pv));
1096
1097 /**
1098 * Register an info handler with DBGF.
1099 *
1100 * @returns VBox status code.
1101 * @param pDrvIns Driver instance.
1102 * @param pszName Data unit name.
1103 * @param pszDesc The description of the info and any arguments
1104 * the handler may take.
1105 * @param pfnHandler The handler function to be called to display the
1106 * info.
1107 */
1108 DECLR3CALLBACKMEMBER(int, pfnDBGFInfoRegister,(PPDMDRVINS pDrvIns, const char *pszName, const char *pszDesc, PFNDBGFHANDLERDRV pfnHandler));
1109
1110 /**
1111 * Register an info handler with DBGF, argv style.
1112 *
1113 * @returns VBox status code.
1114 * @param pDrvIns Driver instance.
1115 * @param pszName Data unit name.
1116 * @param pszDesc The description of the info and any arguments
1117 * the handler may take.
1118 * @param pfnHandler The handler function to be called to display the
1119 * info.
1120 */
1121 DECLR3CALLBACKMEMBER(int, pfnDBGFInfoRegisterArgv,(PPDMDRVINS pDrvIns, const char *pszName, const char *pszDesc, PFNDBGFINFOARGVDRV pfnHandler));
1122
1123 /**
1124 * Deregister an info handler from DBGF.
1125 *
1126 * @returns VBox status code.
1127 * @param pDrvIns Driver instance.
1128 * @param pszName Data unit name.
1129 */
1130 DECLR3CALLBACKMEMBER(int, pfnDBGFInfoDeregister,(PPDMDRVINS pDrvIns, const char *pszName));
1131
1132 /**
1133 * Registers a statistics sample if statistics are enabled.
1134 *
1135 * @param pDrvIns Driver instance.
1136 * @param pvSample Pointer to the sample.
1137 * @param enmType Sample type. This indicates what pvSample is pointing at.
1138 * @param pszName Sample name. The name is on this form "/<component>/<sample>".
1139 * Further nesting is possible. If this does not start
1140 * with a '/', the default prefix will be prepended,
1141 * otherwise it will be used as-is.
1142 * @param enmUnit Sample unit.
1143 * @param pszDesc Sample description.
1144 */
1145 DECLR3CALLBACKMEMBER(void, pfnSTAMRegister,(PPDMDRVINS pDrvIns, void *pvSample, STAMTYPE enmType, const char *pszName,
1146 STAMUNIT enmUnit, const char *pszDesc));
1147
1148 /**
1149 * Same as pfnSTAMRegister except that the name is specified in a
1150 * RTStrPrintf like fashion.
1151 *
1152 * @param pDrvIns Driver instance.
1153 * @param pvSample Pointer to the sample.
1154 * @param enmType Sample type. This indicates what pvSample is pointing at.
1155 * @param enmVisibility Visibility type specifying whether unused statistics should be visible or not.
1156 * @param enmUnit Sample unit.
1157 * @param pszDesc Sample description.
1158 * @param pszName The sample name format string. If this does not start
1159 * with a '/', the default prefix will be prepended,
1160 * otherwise it will be used as-is.
1161 * @param ... Arguments to the format string.
1162 */
1163 DECLR3CALLBACKMEMBER(void, pfnSTAMRegisterF,(PPDMDRVINS pDrvIns, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility,
1164 STAMUNIT enmUnit, const char *pszDesc,
1165 const char *pszName, ...) RT_IPRT_FORMAT_ATTR(7, 8));
1166
1167 /**
1168 * Same as pfnSTAMRegister except that the name is specified in a
1169 * RTStrPrintfV like fashion.
1170 *
1171 * @param pDrvIns Driver instance.
1172 * @param pvSample Pointer to the sample.
1173 * @param enmType Sample type. This indicates what pvSample is pointing at.
1174 * @param enmVisibility Visibility type specifying whether unused statistics should be visible or not.
1175 * @param enmUnit Sample unit.
1176 * @param pszDesc Sample description.
1177 * @param pszName The sample name format string. If this does not
1178 * start with a '/', the default prefix will be prepended,
1179 * otherwise it will be used as-is.
1180 * @param args Arguments to the format string.
1181 */
1182 DECLR3CALLBACKMEMBER(void, pfnSTAMRegisterV,(PPDMDRVINS pDrvIns, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility,
1183 STAMUNIT enmUnit, const char *pszDesc,
1184 const char *pszName, va_list args) RT_IPRT_FORMAT_ATTR(7, 0));
1185
1186 /**
1187 * Deregister a statistic item previously registered with pfnSTAMRegister,
1188 * pfnSTAMRegisterF or pfnSTAMRegisterV
1189 *
1190 * @returns VBox status.
1191 * @param pDrvIns Driver instance.
1192 * @param pvSample Pointer to the sample.
1193 */
1194 DECLR3CALLBACKMEMBER(int, pfnSTAMDeregister,(PPDMDRVINS pDrvIns, void *pvSample));
1195
1196 /**
1197 * Calls the HC R0 VMM entry point, in a safer but slower manner than
1198 * SUPR3CallVMMR0.
1199 *
1200 * When entering using this call the R0 components can call into the host kernel
1201 * (i.e. use the SUPR0 and RT APIs).
1202 *
1203 * See VMMR0Entry() for more details.
1204 *
1205 * @returns error code specific to uFunction.
1206 * @param pDrvIns The driver instance.
1207 * @param uOperation Operation to execute.
1208 * This is limited to services.
1209 * @param pvArg Pointer to argument structure or if cbArg is 0 just an value.
1210 * @param cbArg The size of the argument. This is used to copy whatever the argument
1211 * points at into a kernel buffer to avoid problems like the user page
1212 * being invalidated while we're executing the call.
1213 */
1214 DECLR3CALLBACKMEMBER(int, pfnSUPCallVMMR0Ex,(PPDMDRVINS pDrvIns, unsigned uOperation, void *pvArg, unsigned cbArg));
1215
1216 /**
1217 * Registers a USB HUB.
1218 *
1219 * @returns VBox status code.
1220 * @param pDrvIns The driver instance.
1221 * @param fVersions Indicates the kinds of USB devices that can be attached to this HUB.
1222 * @param cPorts The number of ports.
1223 * @param pUsbHubReg The hub callback structure that PDMUsb uses to interact with it.
1224 * @param ppUsbHubHlp The helper callback structure that the hub uses to talk to PDMUsb.
1225 *
1226 * @thread EMT.
1227 */
1228 DECLR3CALLBACKMEMBER(int, pfnUSBRegisterHub,(PPDMDRVINS pDrvIns, uint32_t fVersions, uint32_t cPorts, PCPDMUSBHUBREG pUsbHubReg, PPCPDMUSBHUBHLP ppUsbHubHlp));
1229
1230 /**
1231 * Set up asynchronous handling of a suspend, reset or power off notification.
1232 *
1233 * This shall only be called when getting the notification. It must be called
1234 * for each one.
1235 *
1236 * @returns VBox status code.
1237 * @param pDrvIns The driver instance.
1238 * @param pfnAsyncNotify The callback.
1239 * @thread EMT(0)
1240 */
1241 DECLR3CALLBACKMEMBER(int, pfnSetAsyncNotification, (PPDMDRVINS pDrvIns, PFNPDMDRVASYNCNOTIFY pfnAsyncNotify));
1242
1243 /**
1244 * Notify EMT(0) that the driver has completed the asynchronous notification
1245 * handling.
1246 *
1247 * This can be called at any time, spurious calls will simply be ignored.
1248 *
1249 * @param pDrvIns The driver instance.
1250 * @thread Any
1251 */
1252 DECLR3CALLBACKMEMBER(void, pfnAsyncNotificationCompleted, (PPDMDRVINS pDrvIns));
1253
1254 /**
1255 * Creates a PDM thread.
1256 *
1257 * This differs from the RTThreadCreate() API in that PDM takes care of suspending,
1258 * resuming, and destroying the thread as the VM state changes.
1259 *
1260 * @returns VBox status code.
1261 * @param pDrvIns The driver instance.
1262 * @param ppThread Where to store the thread 'handle'.
1263 * @param pvUser The user argument to the thread function.
1264 * @param pfnThread The thread function.
1265 * @param pfnWakeup The wakup callback. This is called on the EMT thread when
1266 * a state change is pending.
1267 * @param cbStack See RTThreadCreate.
1268 * @param enmType See RTThreadCreate.
1269 * @param pszName See RTThreadCreate.
1270 */
1271 DECLR3CALLBACKMEMBER(int, pfnThreadCreate,(PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
1272 PFNPDMTHREADWAKEUPDRV pfnWakeup, size_t cbStack, RTTHREADTYPE enmType, const char *pszName));
1273
1274 /** @name Exported PDM Thread Functions
1275 * @{ */
1276 DECLR3CALLBACKMEMBER(int, pfnThreadDestroy,(PPDMTHREAD pThread, int *pRcThread));
1277 DECLR3CALLBACKMEMBER(int, pfnThreadIAmSuspending,(PPDMTHREAD pThread));
1278 DECLR3CALLBACKMEMBER(int, pfnThreadIAmRunning,(PPDMTHREAD pThread));
1279 DECLR3CALLBACKMEMBER(int, pfnThreadSleep,(PPDMTHREAD pThread, RTMSINTERVAL cMillies));
1280 DECLR3CALLBACKMEMBER(int, pfnThreadSuspend,(PPDMTHREAD pThread));
1281 DECLR3CALLBACKMEMBER(int, pfnThreadResume,(PPDMTHREAD pThread));
1282 /** @} */
1283
1284 /**
1285 * Creates an async completion template for a driver instance.
1286 *
1287 * The template is used when creating new completion tasks.
1288 *
1289 * @returns VBox status code.
1290 * @param pDrvIns The driver instance.
1291 * @param ppTemplate Where to store the template pointer on success.
1292 * @param pfnCompleted The completion callback routine.
1293 * @param pvTemplateUser Template user argument.
1294 * @param pszDesc Description.
1295 */
1296 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionTemplateCreate,(PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate,
1297 PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser,
1298 const char *pszDesc));
1299
1300 /** @name Exported PDM Async Completion Functions
1301 * @{ */
1302 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionTemplateDestroy,(PPDMASYNCCOMPLETIONTEMPLATE pTemplate));
1303 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpCreateForFile,(PPPDMASYNCCOMPLETIONENDPOINT ppEndpoint,
1304 const char *pszFilename, uint32_t fFlags,
1305 PPDMASYNCCOMPLETIONTEMPLATE pTemplate));
1306 DECLR3CALLBACKMEMBER(void, pfnAsyncCompletionEpClose,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint));
1307 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpGetSize,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t *pcbSize));
1308 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpSetSize,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbSize));
1309 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpSetBwMgr,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, const char *pszBwMgr));
1310 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpFlush,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, void *pvUser, PPPDMASYNCCOMPLETIONTASK ppTask));
1311 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpRead,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
1312 PCRTSGSEG paSegments, unsigned cSegments,
1313 size_t cbRead, void *pvUser,
1314 PPPDMASYNCCOMPLETIONTASK ppTask));
1315 DECLR3CALLBACKMEMBER(int, pfnAsyncCompletionEpWrite,(PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
1316 PCRTSGSEG paSegments, unsigned cSegments,
1317 size_t cbWrite, void *pvUser,
1318 PPPDMASYNCCOMPLETIONTASK ppTask));
1319 /** @} */
1320
1321
1322 /**
1323 * Attaches a network filter driver to a named bandwidth group.
1324 *
1325 * @returns VBox status code.
1326 * @retval VERR_ALREADY_INITIALIZED if already attached to a group.
1327 * @param pDrvIns The driver instance.
1328 * @param pszBwGroup Name of the bandwidth group to attach to.
1329 * @param pFilter Pointer to the filter we attach.
1330 */
1331 DECLR3CALLBACKMEMBER(int, pfnNetShaperAttach,(PPDMDRVINS pDrvIns, const char *pszBwGroup, PPDMNSFILTER pFilter));
1332
1333 /**
1334 * Detaches a network filter driver from its current bandwidth group (if any).
1335 *
1336 * @returns VBox status code.
1337 * @param pDrvIns The driver instance.
1338 * @param pFilter Pointer to the filter we attach.
1339 */
1340 DECLR3CALLBACKMEMBER(int, pfnNetShaperDetach,(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter));
1341
1342 /**
1343 * Obtains bandwidth in a bandwidth group.
1344 *
1345 * @returns True if bandwidth was allocated, false if not.
1346 * @param pDrvIns The driver instance.
1347 * @param pFilter Pointer to the filter that allocates bandwidth.
1348 * @param cbTransfer Number of bytes to allocate.
1349 */
1350 DECLR3CALLBACKMEMBER(bool, pfnNetShaperAllocateBandwidth,(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer));
1351
1352 /**
1353 * Resolves the symbol for a raw-mode context interface.
1354 *
1355 * @returns VBox status code.
1356 * @param pDrvIns The driver instance.
1357 * @param pvInterface The interface structure.
1358 * @param cbInterface The size of the interface structure.
1359 * @param pszSymPrefix What to prefix the symbols in the list with before
1360 * resolving them. This must start with 'drv' and
1361 * contain the driver name.
1362 * @param pszSymList List of symbols corresponding to the interface.
1363 * There is generally a there is generally a define
1364 * holding this list associated with the interface
1365 * definition (INTERFACE_SYM_LIST). For more details
1366 * see PDMR3LdrGetInterfaceSymbols.
1367 * @thread EMT
1368 */
1369 DECLR3CALLBACKMEMBER(int, pfnLdrGetRCInterfaceSymbols,(PPDMDRVINS pDrvIns, void *pvInterface, size_t cbInterface,
1370 const char *pszSymPrefix, const char *pszSymList));
1371
1372 /**
1373 * Resolves the symbol for a ring-0 context interface.
1374 *
1375 * @returns VBox status code.
1376 * @param pDrvIns The driver instance.
1377 * @param pvInterface The interface structure.
1378 * @param cbInterface The size of the interface structure.
1379 * @param pszSymPrefix What to prefix the symbols in the list with before
1380 * resolving them. This must start with 'drv' and
1381 * contain the driver name.
1382 * @param pszSymList List of symbols corresponding to the interface.
1383 * There is generally a there is generally a define
1384 * holding this list associated with the interface
1385 * definition (INTERFACE_SYM_LIST). For more details
1386 * see PDMR3LdrGetInterfaceSymbols.
1387 * @thread EMT
1388 */
1389 DECLR3CALLBACKMEMBER(int, pfnLdrGetR0InterfaceSymbols,(PPDMDRVINS pDrvIns, void *pvInterface, size_t cbInterface,
1390 const char *pszSymPrefix, const char *pszSymList));
1391 /**
1392 * Initializes a PDM critical section.
1393 *
1394 * The PDM critical sections are derived from the IPRT critical sections, but
1395 * works in both RC and R0 as well as R3.
1396 *
1397 * @returns VBox status code.
1398 * @param pDrvIns The driver instance.
1399 * @param pCritSect Pointer to the critical section.
1400 * @param SRC_POS Use RT_SRC_POS.
1401 * @param pszName The base name of the critical section. Will be
1402 * mangeled with the instance number. For
1403 * statistics and lock validation.
1404 * @thread EMT
1405 */
1406 DECLR3CALLBACKMEMBER(int, pfnCritSectInit,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL, const char *pszName));
1407
1408 /** @name Exported PDM Critical Section Functions
1409 * @{ */
1410 DECLR3CALLBACKMEMBER(bool, pfnCritSectYield,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
1411 DECLR3CALLBACKMEMBER(int, pfnCritSectEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy));
1412 DECLR3CALLBACKMEMBER(int, pfnCritSectEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL));
1413 DECLR3CALLBACKMEMBER(int, pfnCritSectTryEnter,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
1414 DECLR3CALLBACKMEMBER(int, pfnCritSectTryEnterDebug,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL));
1415 DECLR3CALLBACKMEMBER(int, pfnCritSectLeave,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
1416 DECLR3CALLBACKMEMBER(bool, pfnCritSectIsOwner,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
1417 DECLR3CALLBACKMEMBER(bool, pfnCritSectIsInitialized,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
1418 DECLR3CALLBACKMEMBER(bool, pfnCritSectHasWaiters,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
1419 DECLR3CALLBACKMEMBER(uint32_t, pfnCritSectGetRecursion,(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect));
1420 DECLR3CALLBACKMEMBER(int, pfnCritSectScheduleExitEvent,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, SUPSEMEVENT hEventToSignal));
1421 DECLR3CALLBACKMEMBER(int, pfnCritSectDelete,(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect));
1422 /** @} */
1423
1424 /**
1425 * Call the ring-0 request handler routine of the driver.
1426 *
1427 * For this to work, the driver must be ring-0 enabled and export a request
1428 * handler function. The name of the function must be the driver name in the
1429 * PDMDRVREG struct prefixed with 'drvR0' and suffixed with 'ReqHandler'.
1430 * The driver name will be capitalized. It shall take the exact same
1431 * arguments as this function and be declared using PDMBOTHCBDECL. See
1432 * FNPDMDRVREQHANDLERR0.
1433 *
1434 * @returns VBox status code.
1435 * @retval VERR_SYMBOL_NOT_FOUND if the driver doesn't export the required
1436 * handler function.
1437 * @retval VERR_ACCESS_DENIED if the driver isn't ring-0 capable.
1438 *
1439 * @param pDrvIns The driver instance.
1440 * @param uOperation The operation to perform.
1441 * @param u64Arg 64-bit integer argument.
1442 * @thread Any
1443 */
1444 DECLR3CALLBACKMEMBER(int, pfnCallR0,(PPDMDRVINS pDrvIns, uint32_t uOperation, uint64_t u64Arg));
1445
1446 /**
1447 * Creates a block cache for a driver driver instance.
1448 *
1449 * @returns VBox status code.
1450 * @param pDrvIns The driver instance.
1451 * @param ppBlkCache Where to store the handle to the block cache.
1452 * @param pfnXferComplete The I/O transfer complete callback.
1453 * @param pfnXferEnqueue The I/O request enqueue callback.
1454 * @param pfnXferEnqueueDiscard The discard request enqueue callback.
1455 * @param pcszId Unique ID used to identify the user.
1456 */
1457 DECLR3CALLBACKMEMBER(int, pfnBlkCacheRetain, (PPDMDRVINS pDrvIns, PPPDMBLKCACHE ppBlkCache,
1458 PFNPDMBLKCACHEXFERCOMPLETEDRV pfnXferComplete,
1459 PFNPDMBLKCACHEXFERENQUEUEDRV pfnXferEnqueue,
1460 PFNPDMBLKCACHEXFERENQUEUEDISCARDDRV pfnXferEnqueueDiscard,
1461 const char *pcszId));
1462
1463 /** @name Exported PDM Block Cache Functions
1464 * @{ */
1465 DECLR3CALLBACKMEMBER(void, pfnBlkCacheRelease,(PPDMBLKCACHE pBlkCache));
1466 DECLR3CALLBACKMEMBER(int, pfnBlkCacheClear,(PPDMBLKCACHE pBlkCache));
1467 DECLR3CALLBACKMEMBER(int, pfnBlkCacheSuspend,(PPDMBLKCACHE pBlkCache));
1468 DECLR3CALLBACKMEMBER(int, pfnBlkCacheResume,(PPDMBLKCACHE pBlkCache));
1469 DECLR3CALLBACKMEMBER(void, pfnBlkCacheIoXferComplete,(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEIOXFER hIoXfer, int rcIoXfer));
1470 DECLR3CALLBACKMEMBER(int, pfnBlkCacheRead,(PPDMBLKCACHE pBlkCache, uint64_t off, PCRTSGBUF pSgBuf, size_t cbRead, void *pvUser));
1471 DECLR3CALLBACKMEMBER(int, pfnBlkCacheWrite,(PPDMBLKCACHE pBlkCache, uint64_t off, PCRTSGBUF pSgBuf, size_t cbRead, void *pvUser));
1472 DECLR3CALLBACKMEMBER(int, pfnBlkCacheFlush,(PPDMBLKCACHE pBlkCache, void *pvUser));
1473 DECLR3CALLBACKMEMBER(int, pfnBlkCacheDiscard,(PPDMBLKCACHE pBlkCache, PCRTRANGE paRanges, unsigned cRanges, void *pvUser));
1474 /** @} */
1475
1476 /**
1477 * Gets the reason for the most recent VM suspend.
1478 *
1479 * @returns The suspend reason. VMSUSPENDREASON_INVALID is returned if no
1480 * suspend has been made or if the pDrvIns is invalid.
1481 * @param pDrvIns The driver instance.
1482 */
1483 DECLR3CALLBACKMEMBER(VMSUSPENDREASON, pfnVMGetSuspendReason,(PPDMDRVINS pDrvIns));
1484
1485 /**
1486 * Gets the reason for the most recent VM resume.
1487 *
1488 * @returns The resume reason. VMRESUMEREASON_INVALID is returned if no
1489 * resume has been made or if the pDrvIns is invalid.
1490 * @param pDrvIns The driver instance.
1491 */
1492 DECLR3CALLBACKMEMBER(VMRESUMEREASON, pfnVMGetResumeReason,(PPDMDRVINS pDrvIns));
1493
1494 /** @name Space reserved for minor interface changes.
1495 * @{ */
1496 DECLR3CALLBACKMEMBER(int, pfnTimerSetMillies,(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext));
1497
1498 /**
1499 * Deregister zero or more samples given their name prefix.
1500 *
1501 * @returns VBox status code.
1502 * @param pDrvIns The driver instance.
1503 * @param pszPrefix The name prefix of the samples to remove. If this does
1504 * not start with a '/', the default prefix will be
1505 * prepended, otherwise it will be used as-is.
1506 */
1507 DECLR3CALLBACKMEMBER(int, pfnSTAMDeregisterByPrefix,(PPDMDRVINS pDrvIns, const char *pszPrefix));
1508
1509 /**
1510 * Queries a generic object from the VMM user.
1511 *
1512 * @returns Pointer to the object if found, NULL if not.
1513 * @param pDrvIns The driver instance.
1514 * @param pUuid The UUID of what's being queried. The UUIDs and
1515 * the usage conventions are defined by the user.
1516 */
1517 DECLR3CALLBACKMEMBER(void *, pfnQueryGenericUserObject,(PPDMDRVINS pDrvIns, PCRTUUID pUuid));
1518
1519 DECLR3CALLBACKMEMBER(void, pfnReserved0,(PPDMDRVINS pDrvIns));
1520 DECLR3CALLBACKMEMBER(void, pfnReserved1,(PPDMDRVINS pDrvIns));
1521 DECLR3CALLBACKMEMBER(void, pfnReserved2,(PPDMDRVINS pDrvIns));
1522 DECLR3CALLBACKMEMBER(void, pfnReserved3,(PPDMDRVINS pDrvIns));
1523 DECLR3CALLBACKMEMBER(void, pfnReserved4,(PPDMDRVINS pDrvIns));
1524 DECLR3CALLBACKMEMBER(void, pfnReserved5,(PPDMDRVINS pDrvIns));
1525 DECLR3CALLBACKMEMBER(void, pfnReserved6,(PPDMDRVINS pDrvIns));
1526 DECLR3CALLBACKMEMBER(void, pfnReserved7,(PPDMDRVINS pDrvIns));
1527 DECLR3CALLBACKMEMBER(void, pfnReserved8,(PPDMDRVINS pDrvIns));
1528 /** @} */
1529
1530 /** Just a safety precaution. */
1531 uint32_t u32TheEnd;
1532} PDMDRVHLPR3;
1533/** Current DRVHLP version number. */
1534#define PDM_DRVHLPR3_VERSION PDM_VERSION_MAKE(0xf0fb, 16, 0)
1535
1536
1537/**
1538 * Set the VM error message
1539 *
1540 * @returns rc.
1541 * @param pDrvIns Driver instance.
1542 * @param rc VBox status code.
1543 * @param SRC_POS Use RT_SRC_POS.
1544 * @param pszFormat Error message format string.
1545 * @param ... Error message arguments.
1546 * @sa PDMDRV_SET_ERROR, PDMDrvHlpVMSetErrorV, VMSetError
1547 */
1548DECLINLINE(int) RT_IPRT_FORMAT_ATTR(6, 7) PDMDrvHlpVMSetError(PPDMDRVINS pDrvIns, const int rc, RT_SRC_POS_DECL,
1549 const char *pszFormat, ...)
1550{
1551 va_list va;
1552 va_start(va, pszFormat);
1553 pDrvIns->CTX_SUFF(pHlp)->pfnVMSetErrorV(pDrvIns, rc, RT_SRC_POS_ARGS, pszFormat, va);
1554 va_end(va);
1555 return rc;
1556}
1557
1558/** @def PDMDRV_SET_ERROR
1559 * Set the VM error. See PDMDrvHlpVMSetError() for printf like message formatting.
1560 */
1561#define PDMDRV_SET_ERROR(pDrvIns, rc, pszError) \
1562 PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, "%s", pszError)
1563
1564/**
1565 * @copydoc PDMDRVHLPR3::pfnVMSetErrorV
1566 */
1567DECLINLINE(int) RT_IPRT_FORMAT_ATTR(6, 0) PDMDrvHlpVMSetErrorV(PPDMDRVINS pDrvIns, const int rc, RT_SRC_POS_DECL,
1568 const char *pszFormat, va_list va)
1569{
1570 return pDrvIns->CTX_SUFF(pHlp)->pfnVMSetErrorV(pDrvIns, rc, RT_SRC_POS_ARGS, pszFormat, va);
1571}
1572
1573
1574/**
1575 * Set the VM runtime error message
1576 *
1577 * @returns VBox status code.
1578 * @param pDrvIns Driver instance.
1579 * @param fFlags The action flags. See VMSETRTERR_FLAGS_*.
1580 * @param pszErrorId Error ID string.
1581 * @param pszFormat Error message format string.
1582 * @param ... Error message arguments.
1583 * @sa PDMDRV_SET_RUNTIME_ERROR, PDMDrvHlpVMSetRuntimeErrorV,
1584 * VMSetRuntimeError
1585 */
1586DECLINLINE(int) RT_IPRT_FORMAT_ATTR(4, 5) PDMDrvHlpVMSetRuntimeError(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId,
1587 const char *pszFormat, ...)
1588{
1589 va_list va;
1590 int rc;
1591 va_start(va, pszFormat);
1592 rc = pDrvIns->CTX_SUFF(pHlp)->pfnVMSetRuntimeErrorV(pDrvIns, fFlags, pszErrorId, pszFormat, va);
1593 va_end(va);
1594 return rc;
1595}
1596
1597/** @def PDMDRV_SET_RUNTIME_ERROR
1598 * Set the VM runtime error. See PDMDrvHlpVMSetRuntimeError() for printf like message formatting.
1599 */
1600#define PDMDRV_SET_RUNTIME_ERROR(pDrvIns, fFlags, pszErrorId, pszError) \
1601 PDMDrvHlpVMSetRuntimeError(pDrvIns, fFlags, pszErrorId, "%s", pszError)
1602
1603/**
1604 * @copydoc PDMDRVHLPR3::pfnVMSetRuntimeErrorV
1605 */
1606DECLINLINE(int) RT_IPRT_FORMAT_ATTR(4, 0) PDMDrvHlpVMSetRuntimeErrorV(PPDMDRVINS pDrvIns, uint32_t fFlags,
1607 const char *pszErrorId, const char *pszFormat, va_list va)
1608{
1609 return pDrvIns->CTX_SUFF(pHlp)->pfnVMSetRuntimeErrorV(pDrvIns, fFlags, pszErrorId, pszFormat, va);
1610}
1611
1612#endif /* IN_RING3 */
1613
1614/** @def PDMDRV_ASSERT_EMT
1615 * Assert that the current thread is the emulation thread.
1616 */
1617#ifdef VBOX_STRICT
1618# define PDMDRV_ASSERT_EMT(pDrvIns) pDrvIns->CTX_SUFF(pHlp)->pfnAssertEMT(pDrvIns, __FILE__, __LINE__, __FUNCTION__)
1619#else
1620# define PDMDRV_ASSERT_EMT(pDrvIns) do { } while (0)
1621#endif
1622
1623/** @def PDMDRV_ASSERT_OTHER
1624 * Assert that the current thread is NOT the emulation thread.
1625 */
1626#ifdef VBOX_STRICT
1627# define PDMDRV_ASSERT_OTHER(pDrvIns) pDrvIns->CTX_SUFF(pHlp)->pfnAssertOther(pDrvIns, __FILE__, __LINE__, __FUNCTION__)
1628#else
1629# define PDMDRV_ASSERT_OTHER(pDrvIns) do { } while (0)
1630#endif
1631
1632
1633#ifdef IN_RING3
1634
1635/**
1636 * @copydoc PDMDRVHLPR3::pfnAttach
1637 */
1638DECLINLINE(int) PDMDrvHlpAttach(PPDMDRVINS pDrvIns, uint32_t fFlags, PPDMIBASE *ppBaseInterface)
1639{
1640 return pDrvIns->pHlpR3->pfnAttach(pDrvIns, fFlags, ppBaseInterface);
1641}
1642
1643/**
1644 * Check that there is no driver below the us that we should attach to.
1645 *
1646 * @returns VERR_PDM_NO_ATTACHED_DRIVER if there is no driver.
1647 * @param pDrvIns The driver instance.
1648 */
1649DECLINLINE(int) PDMDrvHlpNoAttach(PPDMDRVINS pDrvIns)
1650{
1651 return pDrvIns->pHlpR3->pfnAttach(pDrvIns, 0, NULL);
1652}
1653
1654/**
1655 * @copydoc PDMDRVHLPR3::pfnDetach
1656 */
1657DECLINLINE(int) PDMDrvHlpDetach(PPDMDRVINS pDrvIns, uint32_t fFlags)
1658{
1659 return pDrvIns->pHlpR3->pfnDetach(pDrvIns, fFlags);
1660}
1661
1662/**
1663 * @copydoc PDMDRVHLPR3::pfnDetachSelf
1664 */
1665DECLINLINE(int) PDMDrvHlpDetachSelf(PPDMDRVINS pDrvIns, uint32_t fFlags)
1666{
1667 return pDrvIns->pHlpR3->pfnDetachSelf(pDrvIns, fFlags);
1668}
1669
1670/**
1671 * @copydoc PDMDRVHLPR3::pfnMountPrepare
1672 */
1673DECLINLINE(int) PDMDrvHlpMountPrepare(PPDMDRVINS pDrvIns, const char *pszFilename, const char *pszCoreDriver)
1674{
1675 return pDrvIns->pHlpR3->pfnMountPrepare(pDrvIns, pszFilename, pszCoreDriver);
1676}
1677
1678/**
1679 * @copydoc PDMDRVHLPR3::pfnVMState
1680 */
1681DECLINLINE(VMSTATE) PDMDrvHlpVMState(PPDMDRVINS pDrvIns)
1682{
1683 return pDrvIns->CTX_SUFF(pHlp)->pfnVMState(pDrvIns);
1684}
1685
1686/**
1687 * @copydoc PDMDRVHLPR3::pfnVMTeleportedAndNotFullyResumedYet
1688 */
1689DECLINLINE(bool) PDMDrvHlpVMTeleportedAndNotFullyResumedYet(PPDMDRVINS pDrvIns)
1690{
1691 return pDrvIns->pHlpR3->pfnVMTeleportedAndNotFullyResumedYet(pDrvIns);
1692}
1693
1694/**
1695 * @copydoc PDMDRVHLPR3::pfnGetSupDrvSession
1696 */
1697DECLINLINE(PSUPDRVSESSION) PDMDrvHlpGetSupDrvSession(PPDMDRVINS pDrvIns)
1698{
1699 return pDrvIns->pHlpR3->pfnGetSupDrvSession(pDrvIns);
1700}
1701
1702/**
1703 * @copydoc PDMDRVHLPR3::pfnQueueCreate
1704 */
1705DECLINLINE(int) PDMDrvHlpQueueCreate(PPDMDRVINS pDrvIns, uint32_t cbItem, uint32_t cItems, uint32_t cMilliesInterval,
1706 PFNPDMQUEUEDRV pfnCallback, const char *pszName, PDMQUEUEHANDLE *phQueue)
1707{
1708 return pDrvIns->pHlpR3->pfnQueueCreate(pDrvIns, cbItem, cItems, cMilliesInterval, pfnCallback, pszName, phQueue);
1709}
1710
1711/**
1712 * @copydoc PDMDRVHLPR3::pfnQueueAlloc
1713 */
1714DECLINLINE(PPDMQUEUEITEMCORE) PDMDrvHlpQueueAlloc(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue)
1715{
1716 return pDrvIns->CTX_SUFF(pHlp)->pfnQueueAlloc(pDrvIns, hQueue);
1717}
1718
1719/**
1720 * @copydoc PDMDRVHLPR3::pfnQueueInsert
1721 */
1722DECLINLINE(int) PDMDrvHlpQueueInsert(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue, PPDMQUEUEITEMCORE pItem)
1723{
1724 return pDrvIns->CTX_SUFF(pHlp)->pfnQueueInsert(pDrvIns, hQueue, pItem);
1725}
1726
1727/**
1728 * @copydoc PDMDRVHLPR3::pfnQueueFlushIfNecessary
1729 */
1730DECLINLINE(bool) PDMDrvHlpQueueFlushIfNecessary(PPDMDRVINS pDrvIns, PDMQUEUEHANDLE hQueue)
1731{
1732 return pDrvIns->CTX_SUFF(pHlp)->pfnQueueFlushIfNecessary(pDrvIns, hQueue);
1733}
1734
1735/**
1736 * @copydoc PDMDRVHLPR3::pfnTMGetVirtualFreq
1737 */
1738DECLINLINE(uint64_t) PDMDrvHlpTMGetVirtualFreq(PPDMDRVINS pDrvIns)
1739{
1740 return pDrvIns->pHlpR3->pfnTMGetVirtualFreq(pDrvIns);
1741}
1742
1743/**
1744 * @copydoc PDMDRVHLPR3::pfnTMGetVirtualTime
1745 */
1746DECLINLINE(uint64_t) PDMDrvHlpTMGetVirtualTime(PPDMDRVINS pDrvIns)
1747{
1748 return pDrvIns->pHlpR3->pfnTMGetVirtualTime(pDrvIns);
1749}
1750
1751/**
1752 * @copydoc PDMDRVHLPR3::pfnTimerCreate
1753 */
1754DECLINLINE(int) PDMDrvHlpTMTimerCreate(PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, void *pvUser,
1755 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer)
1756
1757{
1758 return pDrvIns->pHlpR3->pfnTimerCreate(pDrvIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, phTimer);
1759}
1760
1761/**
1762 * @copydoc PDMDRVHLPR3::pfnTimerDestroy
1763 */
1764DECLINLINE(int) PDMDrvHlpTimerDestroy(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer)
1765
1766{
1767 return pDrvIns->pHlpR3->pfnTimerDestroy(pDrvIns, hTimer);
1768}
1769
1770/**
1771 * @copydoc PDMDRVHLPR3::pfnTimerSetMillies
1772 */
1773DECLINLINE(int) PDMDrvHlpTimerSetMillies(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext)
1774
1775{
1776 return pDrvIns->pHlpR3->pfnTimerSetMillies(pDrvIns, hTimer, cMilliesToNext);
1777}
1778
1779/**
1780 * Register a save state data unit.
1781 *
1782 * @returns VBox status.
1783 * @param pDrvIns Driver instance.
1784 * @param uVersion Data layout version number.
1785 * @param cbGuess The approximate amount of data in the unit.
1786 * Only for progress indicators.
1787 * @param pfnSaveExec Execute save callback, optional.
1788 * @param pfnLoadExec Execute load callback, optional.
1789 */
1790DECLINLINE(int) PDMDrvHlpSSMRegister(PPDMDRVINS pDrvIns, uint32_t uVersion, size_t cbGuess,
1791 PFNSSMDRVSAVEEXEC pfnSaveExec, PFNSSMDRVLOADEXEC pfnLoadExec)
1792{
1793 return pDrvIns->pHlpR3->pfnSSMRegister(pDrvIns, uVersion, cbGuess,
1794 NULL /*pfnLivePrep*/, NULL /*pfnLiveExec*/, NULL /*pfnLiveVote*/,
1795 NULL /*pfnSavePrep*/, pfnSaveExec, NULL /*pfnSaveDone*/,
1796 NULL /*pfnLoadPrep*/, pfnLoadExec, NULL /*pfnLoadDone*/);
1797}
1798
1799/**
1800 * @copydoc PDMDRVHLPR3::pfnSSMRegister
1801 */
1802DECLINLINE(int) PDMDrvHlpSSMRegisterEx(PPDMDRVINS pDrvIns, uint32_t uVersion, size_t cbGuess,
1803 PFNSSMDRVLIVEPREP pfnLivePrep, PFNSSMDRVLIVEEXEC pfnLiveExec, PFNSSMDRVLIVEVOTE pfnLiveVote,
1804 PFNSSMDRVSAVEPREP pfnSavePrep, PFNSSMDRVSAVEEXEC pfnSaveExec, PFNSSMDRVSAVEDONE pfnSaveDone,
1805 PFNSSMDRVLOADPREP pfnLoadPrep, PFNSSMDRVLOADEXEC pfnLoadExec, PFNSSMDRVLOADDONE pfnLoadDone)
1806{
1807 return pDrvIns->pHlpR3->pfnSSMRegister(pDrvIns, uVersion, cbGuess,
1808 pfnLivePrep, pfnLiveExec, pfnLiveVote,
1809 pfnSavePrep, pfnSaveExec, pfnSaveDone,
1810 pfnLoadPrep, pfnLoadExec, pfnLoadDone);
1811}
1812
1813/**
1814 * Register a load done callback.
1815 *
1816 * @returns VBox status.
1817 * @param pDrvIns Driver instance.
1818 * @param pfnLoadDone Done load callback, optional.
1819 */
1820DECLINLINE(int) PDMDrvHlpSSMRegisterLoadDone(PPDMDRVINS pDrvIns, PFNSSMDRVLOADDONE pfnLoadDone)
1821{
1822 return pDrvIns->pHlpR3->pfnSSMRegister(pDrvIns, 0 /*uVersion*/, 0 /*cbGuess*/,
1823 NULL /*pfnLivePrep*/, NULL /*pfnLiveExec*/, NULL /*pfnLiveVote*/,
1824 NULL /*pfnSavePrep*/, NULL /*pfnSaveExec*/, NULL /*pfnSaveDone*/,
1825 NULL /*pfnLoadPrep*/, NULL /*pfnLoadExec*/, pfnLoadDone);
1826}
1827
1828/**
1829 * Get the status of an saved state operation.
1830 *
1831 * This can sometimes be useful in FNSSMDRVLOADDONE implementations to determine
1832 * whether the load succeeded or not.
1833 *
1834 * @returns VBox status.
1835 * @param pDrvIns Driver instance.
1836 * @param pSSM The saved state handle.
1837 * @sa SSMR3HandleGetStatus
1838 */
1839DECLINLINE(int) PDMDrvHlpSSMHandleGetStatus(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM)
1840{
1841 return pDrvIns->pHlpR3->pfnSSMHandleGetStatus(pSSM);
1842}
1843
1844/**
1845 * @copydoc PDMDRVHLPR3::pfnMMHeapFree
1846 */
1847DECLINLINE(void) PDMDrvHlpMMHeapFree(PPDMDRVINS pDrvIns, void *pv)
1848{
1849 pDrvIns->pHlpR3->pfnMMHeapFree(pDrvIns, pv);
1850}
1851
1852/**
1853 * @copydoc PDMDRVHLPR3::pfnDBGFInfoRegister
1854 */
1855DECLINLINE(int) PDMDrvHlpDBGFInfoRegister(PPDMDRVINS pDrvIns, const char *pszName, const char *pszDesc, PFNDBGFHANDLERDRV pfnHandler)
1856{
1857 return pDrvIns->pHlpR3->pfnDBGFInfoRegister(pDrvIns, pszName, pszDesc, pfnHandler);
1858}
1859
1860/**
1861 * @copydoc PDMDRVHLPR3::pfnDBGFInfoRegisterArgv
1862 */
1863DECLINLINE(int) PDMDrvHlpDBGFInfoRegisterArgv(PPDMDRVINS pDrvIns, const char *pszName, const char *pszDesc, PFNDBGFINFOARGVDRV pfnHandler)
1864{
1865 return pDrvIns->pHlpR3->pfnDBGFInfoRegisterArgv(pDrvIns, pszName, pszDesc, pfnHandler);
1866}
1867
1868/**
1869 * @copydoc PDMDRVHLPR3::pfnDBGFInfoRegister
1870 */
1871DECLINLINE(int) PDMDrvHlpDBGFInfoDeregister(PPDMDRVINS pDrvIns, const char *pszName, const char *pszDesc, PFNDBGFHANDLERDRV pfnHandler)
1872{
1873 return pDrvIns->pHlpR3->pfnDBGFInfoRegister(pDrvIns, pszName, pszDesc, pfnHandler);
1874}
1875
1876/**
1877 * @copydoc PDMDRVHLPR3::pfnSTAMRegister
1878 */
1879DECLINLINE(void) PDMDrvHlpSTAMRegister(PPDMDRVINS pDrvIns, void *pvSample, STAMTYPE enmType, const char *pszName, STAMUNIT enmUnit, const char *pszDesc)
1880{
1881 pDrvIns->pHlpR3->pfnSTAMRegister(pDrvIns, pvSample, enmType, pszName, enmUnit, pszDesc);
1882}
1883
1884/**
1885 * @copydoc PDMDRVHLPR3::pfnSTAMRegisterF
1886 */
1887DECLINLINE(void) RT_IPRT_FORMAT_ATTR(7, 8) PDMDrvHlpSTAMRegisterF(PPDMDRVINS pDrvIns, void *pvSample, STAMTYPE enmType,
1888 STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1889 const char *pszDesc, const char *pszName, ...)
1890{
1891 va_list va;
1892 va_start(va, pszName);
1893 pDrvIns->pHlpR3->pfnSTAMRegisterV(pDrvIns, pvSample, enmType, enmVisibility, enmUnit, pszDesc, pszName, va);
1894 va_end(va);
1895}
1896
1897/**
1898 * Convenience wrapper that registers counter which is always visible.
1899 *
1900 * @param pDrvIns The driver instance.
1901 * @param pCounter Pointer to the counter variable.
1902 * @param pszName The name of the sample. This is prefixed with
1903 * "/Drivers/<drivername>-<instance no>/".
1904 * @param enmUnit The unit.
1905 * @param pszDesc The description.
1906 */
1907DECLINLINE(void) PDMDrvHlpSTAMRegCounterEx(PPDMDRVINS pDrvIns, PSTAMCOUNTER pCounter, const char *pszName, STAMUNIT enmUnit, const char *pszDesc)
1908{
1909 pDrvIns->pHlpR3->pfnSTAMRegisterF(pDrvIns, pCounter, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, enmUnit, pszDesc,
1910 "/Drivers/%s-%u/%s", pDrvIns->pReg->szName, pDrvIns->iInstance, pszName);
1911}
1912
1913/**
1914 * Convenience wrapper that registers counter which is always visible and has
1915 * the STAMUNIT_COUNT unit.
1916 *
1917 * @param pDrvIns The driver instance.
1918 * @param pCounter Pointer to the counter variable.
1919 * @param pszName The name of the sample. This is prefixed with
1920 * "/Drivers/<drivername>-<instance no>/".
1921 * @param pszDesc The description.
1922 */
1923DECLINLINE(void) PDMDrvHlpSTAMRegCounter(PPDMDRVINS pDrvIns, PSTAMCOUNTER pCounter, const char *pszName, const char *pszDesc)
1924{
1925 PDMDrvHlpSTAMRegCounterEx(pDrvIns, pCounter, pszName, STAMUNIT_COUNT, pszDesc);
1926}
1927
1928/**
1929 * Convenience wrapper that registers profiling sample which is always visible.
1930 *
1931 * @param pDrvIns The driver instance.
1932 * @param pProfile Pointer to the profiling variable.
1933 * @param pszName The name of the sample. This is prefixed with
1934 * "/Drivers/<drivername>-<instance no>/".
1935 * @param enmUnit The unit.
1936 * @param pszDesc The description.
1937 */
1938DECLINLINE(void) PDMDrvHlpSTAMRegProfileEx(PPDMDRVINS pDrvIns, PSTAMPROFILE pProfile, const char *pszName, STAMUNIT enmUnit, const char *pszDesc)
1939{
1940 pDrvIns->pHlpR3->pfnSTAMRegisterF(pDrvIns, pProfile, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, enmUnit, pszDesc,
1941 "/Drivers/%s-%u/%s", pDrvIns->pReg->szName, pDrvIns->iInstance, pszName);
1942}
1943
1944/**
1945 * Convenience wrapper that registers profiling sample which is always visible
1946 * hand counts ticks per call (STAMUNIT_TICKS_PER_CALL).
1947 *
1948 * @param pDrvIns The driver instance.
1949 * @param pProfile Pointer to the profiling variable.
1950 * @param pszName The name of the sample. This is prefixed with
1951 * "/Drivers/<drivername>-<instance no>/".
1952 * @param pszDesc The description.
1953 */
1954DECLINLINE(void) PDMDrvHlpSTAMRegProfile(PPDMDRVINS pDrvIns, PSTAMPROFILE pProfile, const char *pszName, const char *pszDesc)
1955{
1956 PDMDrvHlpSTAMRegProfileEx(pDrvIns, pProfile, pszName, STAMUNIT_TICKS_PER_CALL, pszDesc);
1957}
1958
1959/**
1960 * Convenience wrapper that registers an advanced profiling sample which is
1961 * always visible.
1962 *
1963 * @param pDrvIns The driver instance.
1964 * @param pProfile Pointer to the profiling variable.
1965 * @param enmUnit The unit.
1966 * @param pszName The name of the sample. This is prefixed with
1967 * "/Drivers/<drivername>-<instance no>/".
1968 * @param pszDesc The description.
1969 */
1970DECLINLINE(void) PDMDrvHlpSTAMRegProfileAdvEx(PPDMDRVINS pDrvIns, PSTAMPROFILEADV pProfile, const char *pszName, STAMUNIT enmUnit, const char *pszDesc)
1971{
1972 pDrvIns->pHlpR3->pfnSTAMRegisterF(pDrvIns, pProfile, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, enmUnit, pszDesc,
1973 "/Drivers/%s-%u/%s", pDrvIns->pReg->szName, pDrvIns->iInstance, pszName);
1974}
1975
1976/**
1977 * Convenience wrapper that registers an advanced profiling sample which is
1978 * always visible.
1979 *
1980 * @param pDrvIns The driver instance.
1981 * @param pProfile Pointer to the profiling variable.
1982 * @param pszName The name of the sample. This is prefixed with
1983 * "/Drivers/<drivername>-<instance no>/".
1984 * @param pszDesc The description.
1985 */
1986DECLINLINE(void) PDMDrvHlpSTAMRegProfileAdv(PPDMDRVINS pDrvIns, PSTAMPROFILEADV pProfile, const char *pszName, const char *pszDesc)
1987{
1988 PDMDrvHlpSTAMRegProfileAdvEx(pDrvIns, pProfile, pszName, STAMUNIT_TICKS_PER_CALL, pszDesc);
1989}
1990
1991/**
1992 * @copydoc PDMDRVHLPR3::pfnSTAMDeregister
1993 */
1994DECLINLINE(int) PDMDrvHlpSTAMDeregister(PPDMDRVINS pDrvIns, void *pvSample)
1995{
1996 return pDrvIns->pHlpR3->pfnSTAMDeregister(pDrvIns, pvSample);
1997}
1998
1999/**
2000 * @copydoc PDMDRVHLPR3::pfnSTAMDeregisterByPrefix
2001 */
2002DECLINLINE(int) PDMDrvHlpSTAMDeregisterByPrefix(PPDMDRVINS pDrvIns, const char *pszPrefix)
2003{
2004 return pDrvIns->pHlpR3->pfnSTAMDeregisterByPrefix(pDrvIns, pszPrefix);
2005}
2006
2007/**
2008 * @copydoc PDMDRVHLPR3::pfnSUPCallVMMR0Ex
2009 */
2010DECLINLINE(int) PDMDrvHlpSUPCallVMMR0Ex(PPDMDRVINS pDrvIns, unsigned uOperation, void *pvArg, unsigned cbArg)
2011{
2012 return pDrvIns->pHlpR3->pfnSUPCallVMMR0Ex(pDrvIns, uOperation, pvArg, cbArg);
2013}
2014
2015/**
2016 * @copydoc PDMDRVHLPR3::pfnUSBRegisterHub
2017 */
2018DECLINLINE(int) PDMDrvHlpUSBRegisterHub(PPDMDRVINS pDrvIns, uint32_t fVersions, uint32_t cPorts, PCPDMUSBHUBREG pUsbHubReg, PPCPDMUSBHUBHLP ppUsbHubHlp)
2019{
2020 return pDrvIns->pHlpR3->pfnUSBRegisterHub(pDrvIns, fVersions, cPorts, pUsbHubReg, ppUsbHubHlp);
2021}
2022
2023/**
2024 * @copydoc PDMDRVHLPR3::pfnSetAsyncNotification
2025 */
2026DECLINLINE(int) PDMDrvHlpSetAsyncNotification(PPDMDRVINS pDrvIns, PFNPDMDRVASYNCNOTIFY pfnAsyncNotify)
2027{
2028 return pDrvIns->pHlpR3->pfnSetAsyncNotification(pDrvIns, pfnAsyncNotify);
2029}
2030
2031/**
2032 * @copydoc PDMDRVHLPR3::pfnAsyncNotificationCompleted
2033 */
2034DECLINLINE(void) PDMDrvHlpAsyncNotificationCompleted(PPDMDRVINS pDrvIns)
2035{
2036 pDrvIns->pHlpR3->pfnAsyncNotificationCompleted(pDrvIns);
2037}
2038
2039/**
2040 * @copydoc PDMDRVHLPR3::pfnThreadCreate
2041 */
2042DECLINLINE(int) PDMDrvHlpThreadCreate(PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
2043 PFNPDMTHREADWAKEUPDRV pfnWakeup, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)
2044{
2045 return pDrvIns->pHlpR3->pfnThreadCreate(pDrvIns, ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName);
2046}
2047
2048/**
2049 * @copydoc PDMR3ThreadDestroy
2050 * @param pDrvIns The driver instance.
2051 */
2052DECLINLINE(int) PDMDrvHlpThreadDestroy(PPDMDRVINS pDrvIns, PPDMTHREAD pThread, int *pRcThread)
2053{
2054 return pDrvIns->pHlpR3->pfnThreadDestroy(pThread, pRcThread);
2055}
2056
2057/**
2058 * @copydoc PDMR3ThreadIAmSuspending
2059 * @param pDrvIns The driver instance.
2060 */
2061DECLINLINE(int) PDMDrvHlpThreadIAmSuspending(PPDMDRVINS pDrvIns, PPDMTHREAD pThread)
2062{
2063 return pDrvIns->pHlpR3->pfnThreadIAmSuspending(pThread);
2064}
2065
2066/**
2067 * @copydoc PDMR3ThreadIAmRunning
2068 * @param pDrvIns The driver instance.
2069 */
2070DECLINLINE(int) PDMDrvHlpThreadIAmRunning(PPDMDRVINS pDrvIns, PPDMTHREAD pThread)
2071{
2072 return pDrvIns->pHlpR3->pfnThreadIAmRunning(pThread);
2073}
2074
2075/**
2076 * @copydoc PDMR3ThreadSleep
2077 * @param pDrvIns The driver instance.
2078 */
2079DECLINLINE(int) PDMDrvHlpThreadSleep(PPDMDRVINS pDrvIns, PPDMTHREAD pThread, RTMSINTERVAL cMillies)
2080{
2081 return pDrvIns->pHlpR3->pfnThreadSleep(pThread, cMillies);
2082}
2083
2084/**
2085 * @copydoc PDMR3ThreadSuspend
2086 * @param pDrvIns The driver instance.
2087 */
2088DECLINLINE(int) PDMDrvHlpThreadSuspend(PPDMDRVINS pDrvIns, PPDMTHREAD pThread)
2089{
2090 return pDrvIns->pHlpR3->pfnThreadSuspend(pThread);
2091}
2092
2093/**
2094 * @copydoc PDMR3ThreadResume
2095 * @param pDrvIns The driver instance.
2096 */
2097DECLINLINE(int) PDMDrvHlpThreadResume(PPDMDRVINS pDrvIns, PPDMTHREAD pThread)
2098{
2099 return pDrvIns->pHlpR3->pfnThreadResume(pThread);
2100}
2101
2102# ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
2103/**
2104 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionTemplateCreate
2105 */
2106DECLINLINE(int) PDMDrvHlpAsyncCompletionTemplateCreate(PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONTEMPLATE ppTemplate,
2107 PFNPDMASYNCCOMPLETEDRV pfnCompleted, void *pvTemplateUser, const char *pszDesc)
2108{
2109 return pDrvIns->pHlpR3->pfnAsyncCompletionTemplateCreate(pDrvIns, ppTemplate, pfnCompleted, pvTemplateUser, pszDesc);
2110}
2111
2112/**
2113 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionTemplateDestroy
2114 */
2115DECLINLINE(int) PDMDrvHlpAsyncCompletionTemplateDestroy(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONTEMPLATE pTemplate)
2116{
2117 return pDrvIns->pHlpR3->pfnAsyncCompletionTemplateDestroy(pTemplate);
2118}
2119
2120/**
2121 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpCreateForFile
2122 */
2123DECLINLINE(int) PDMDrvHlpAsyncCompletionEpCreateForFile(PPDMDRVINS pDrvIns, PPPDMASYNCCOMPLETIONENDPOINT ppEndpoint,
2124 const char *pszFilename, uint32_t fFlags,
2125 PPDMASYNCCOMPLETIONTEMPLATE pTemplate)
2126{
2127 return pDrvIns->pHlpR3->pfnAsyncCompletionEpCreateForFile(ppEndpoint, pszFilename, fFlags, pTemplate);
2128}
2129
2130/**
2131 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpClose
2132 */
2133DECLINLINE(void) PDMDrvHlpAsyncCompletionEpClose(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint)
2134{
2135 pDrvIns->pHlpR3->pfnAsyncCompletionEpClose(pEndpoint);
2136}
2137
2138/**
2139 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpGetSize
2140 */
2141DECLINLINE(int) PDMDrvHlpAsyncCompletionEpGetSize(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t *pcbSize)
2142{
2143 return pDrvIns->pHlpR3->pfnAsyncCompletionEpGetSize(pEndpoint, pcbSize);
2144}
2145
2146/**
2147 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpSetSize
2148 */
2149DECLINLINE(int) PDMDrvHlpAsyncCompletionEpSetSize(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, uint64_t cbSize)
2150{
2151 return pDrvIns->pHlpR3->pfnAsyncCompletionEpSetSize(pEndpoint, cbSize);
2152}
2153
2154/**
2155 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpSetBwMgr
2156 */
2157DECLINLINE(int) PDMDrvHlpAsyncCompletionEpSetBwMgr(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, const char *pszBwMgr)
2158{
2159 return pDrvIns->pHlpR3->pfnAsyncCompletionEpSetBwMgr(pEndpoint, pszBwMgr);
2160}
2161
2162/**
2163 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpFlush
2164 */
2165DECLINLINE(int) PDMDrvHlpAsyncCompletionEpFlush(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, void *pvUser,
2166 PPPDMASYNCCOMPLETIONTASK ppTask)
2167{
2168 return pDrvIns->pHlpR3->pfnAsyncCompletionEpFlush(pEndpoint, pvUser, ppTask);
2169}
2170
2171/**
2172 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpRead
2173 */
2174DECLINLINE(int) PDMDrvHlpAsyncCompletionEpRead(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
2175 PCRTSGSEG paSegments, unsigned cSegments,
2176 size_t cbRead, void *pvUser,
2177 PPPDMASYNCCOMPLETIONTASK ppTask)
2178{
2179 return pDrvIns->pHlpR3->pfnAsyncCompletionEpRead(pEndpoint, off, paSegments, cSegments, cbRead, pvUser, ppTask);
2180}
2181
2182/**
2183 * @copydoc PDMDRVHLPR3::pfnAsyncCompletionEpWrite
2184 */
2185DECLINLINE(int) PDMDrvHlpAsyncCompletionEpWrite(PPDMDRVINS pDrvIns, PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
2186 PCRTSGSEG paSegments, unsigned cSegments,
2187 size_t cbWrite, void *pvUser,
2188 PPPDMASYNCCOMPLETIONTASK ppTask)
2189{
2190 return pDrvIns->pHlpR3->pfnAsyncCompletionEpWrite(pEndpoint, off, paSegments, cSegments, cbWrite, pvUser, ppTask);
2191}
2192# endif
2193
2194#endif /* IN_RING3 */
2195
2196#ifdef VBOX_WITH_NETSHAPER
2197# ifdef IN_RING3
2198
2199/**
2200 * @copydoc PDMDRVHLPR3::pfnNetShaperAttach
2201 */
2202DECLINLINE(int) PDMDrvHlpNetShaperAttach(PPDMDRVINS pDrvIns, const char *pcszBwGroup, PPDMNSFILTER pFilter)
2203{
2204 return pDrvIns->pHlpR3->pfnNetShaperAttach(pDrvIns, pcszBwGroup, pFilter);
2205}
2206
2207/**
2208 * @copydoc PDMDRVHLPR3::pfnNetShaperDetach
2209 */
2210DECLINLINE(int) PDMDrvHlpNetShaperDetach(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter)
2211{
2212 return pDrvIns->pHlpR3->pfnNetShaperDetach(pDrvIns, pFilter);
2213}
2214
2215# endif /* IN_RING3 */
2216
2217/**
2218 * @copydoc PDMDRVHLPR3::pfnNetShaperAllocateBandwidth
2219 */
2220DECLINLINE(bool) PDMDrvHlpNetShaperAllocateBandwidth(PPDMDRVINS pDrvIns, PPDMNSFILTER pFilter, size_t cbTransfer)
2221{
2222 return pDrvIns->CTX_SUFF(pHlp)->pfnNetShaperAllocateBandwidth(pDrvIns, pFilter, cbTransfer);
2223}
2224
2225#endif /* VBOX_WITH_NETSHAPER*/
2226
2227#ifdef IN_RING3
2228/**
2229 * @copydoc PDMDRVHLPR3::pfnCritSectInit
2230 */
2231DECLINLINE(int) PDMDrvHlpCritSectInit(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL, const char *pszName)
2232{
2233 return pDrvIns->pHlpR3->pfnCritSectInit(pDrvIns, pCritSect, RT_SRC_POS_ARGS, pszName);
2234}
2235#endif /* IN_RING3 */
2236
2237/**
2238 * @see PDMCritSectEnter
2239 */
2240DECLINLINE(int) PDMDrvHlpCritSectEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy)
2241{
2242 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectEnter(pDrvIns, pCritSect, rcBusy);
2243}
2244
2245/**
2246 * @see PDMCritSectEnterDebug
2247 */
2248DECLINLINE(int) PDMDrvHlpCritSectEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL)
2249{
2250 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectEnterDebug(pDrvIns, pCritSect, rcBusy, uId, RT_SRC_POS_ARGS);
2251}
2252
2253/**
2254 * @see PDMCritSectTryEnter
2255 */
2256DECLINLINE(int) PDMDrvHlpCritSectTryEnter(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
2257{
2258 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectTryEnter(pDrvIns, pCritSect);
2259}
2260
2261/**
2262 * @see PDMCritSectTryEnterDebug
2263 */
2264DECLINLINE(int) PDMDrvHlpCritSectTryEnterDebug(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL)
2265{
2266 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectTryEnterDebug(pDrvIns, pCritSect, uId, RT_SRC_POS_ARGS);
2267}
2268
2269/**
2270 * @see PDMCritSectLeave
2271 */
2272DECLINLINE(int) PDMDrvHlpCritSectLeave(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
2273{
2274 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectLeave(pDrvIns, pCritSect);
2275}
2276
2277/**
2278 * @see PDMCritSectIsOwner
2279 */
2280DECLINLINE(bool) PDMDrvHlpCritSectIsOwner(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
2281{
2282 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectIsOwner(pDrvIns, pCritSect);
2283}
2284
2285/**
2286 * @see PDMCritSectIsInitialized
2287 */
2288DECLINLINE(bool) PDMDrvHlpCritSectIsInitialized(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
2289{
2290 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectIsInitialized(pDrvIns, pCritSect);
2291}
2292
2293/**
2294 * @see PDMCritSectHasWaiters
2295 */
2296DECLINLINE(bool) PDMDrvHlpCritSectHasWaiters(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
2297{
2298 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectHasWaiters(pDrvIns, pCritSect);
2299}
2300
2301/**
2302 * @see PDMCritSectGetRecursion
2303 */
2304DECLINLINE(uint32_t) PDMDrvHlpCritSectGetRecursion(PPDMDRVINS pDrvIns, PCPDMCRITSECT pCritSect)
2305{
2306 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectGetRecursion(pDrvIns, pCritSect);
2307}
2308
2309#if defined(IN_RING3) || defined(IN_RING0)
2310/**
2311 * @see PDMHCCritSectScheduleExitEvent
2312 */
2313DECLINLINE(int) PDMDrvHlpCritSectScheduleExitEvent(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect, SUPSEMEVENT hEventToSignal)
2314{
2315 return pDrvIns->CTX_SUFF(pHlp)->pfnCritSectScheduleExitEvent(pDrvIns, pCritSect, hEventToSignal);
2316}
2317#endif
2318
2319/* Strict build: Remap the two enter calls to the debug versions. */
2320#ifdef VBOX_STRICT
2321# ifdef IPRT_INCLUDED_asm_h
2322# define PDMDrvHlpCritSectEnter(pDrvIns, pCritSect, rcBusy) PDMDrvHlpCritSectEnterDebug((pDrvIns), (pCritSect), (rcBusy), (uintptr_t)ASMReturnAddress(), RT_SRC_POS)
2323# define PDMDrvHlpCritSectTryEnter(pDrvIns, pCritSect) PDMDrvHlpCritSectTryEnterDebug((pDrvIns), (pCritSect), (uintptr_t)ASMReturnAddress(), RT_SRC_POS)
2324# else
2325# define PDMDrvHlpCritSectEnter(pDrvIns, pCritSect, rcBusy) PDMDrvHlpCritSectEnterDebug((pDrvIns), (pCritSect), (rcBusy), 0, RT_SRC_POS)
2326# define PDMDrvHlpCritSectTryEnter(pDrvIns, pCritSect) PDMDrvHlpCritSectTryEnterDebug((pDrvIns), (pCritSect), 0, RT_SRC_POS)
2327# endif
2328#endif
2329
2330#if defined(IN_RING3) || defined(DOXYGEN_RUNNING)
2331
2332/**
2333 * @see PDMR3CritSectDelete
2334 */
2335DECLINLINE(int) PDMDrvHlpCritSectDelete(PPDMDRVINS pDrvIns, PPDMCRITSECT pCritSect)
2336{
2337 return pDrvIns->pHlpR3->pfnCritSectDelete(pDrvIns, pCritSect);
2338}
2339
2340/**
2341 * @copydoc PDMDRVHLPR3::pfnCallR0
2342 */
2343DECLINLINE(int) PDMDrvHlpCallR0(PPDMDRVINS pDrvIns, uint32_t uOperation, uint64_t u64Arg)
2344{
2345 return pDrvIns->pHlpR3->pfnCallR0(pDrvIns, uOperation, u64Arg);
2346}
2347
2348/**
2349 * @copydoc PDMDRVHLPR3::pfnBlkCacheRetain
2350 */
2351DECLINLINE(int) PDMDrvHlpBlkCacheRetain(PPDMDRVINS pDrvIns, PPPDMBLKCACHE ppBlkCache,
2352 PFNPDMBLKCACHEXFERCOMPLETEDRV pfnXferComplete,
2353 PFNPDMBLKCACHEXFERENQUEUEDRV pfnXferEnqueue,
2354 PFNPDMBLKCACHEXFERENQUEUEDISCARDDRV pfnXferEnqueueDiscard,
2355 const char *pcszId)
2356{
2357 return pDrvIns->pHlpR3->pfnBlkCacheRetain(pDrvIns, ppBlkCache, pfnXferComplete, pfnXferEnqueue, pfnXferEnqueueDiscard, pcszId);
2358}
2359
2360/**
2361 * @copydoc PDMDRVHLPR3::pfnBlkCacheRelease
2362 */
2363DECLINLINE(void) PDMDrvHlpBlkCacheRelease(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache)
2364{
2365 pDrvIns->pHlpR3->pfnBlkCacheRelease(pBlkCache);
2366}
2367
2368/**
2369 * @copydoc PDMDRVHLPR3::pfnBlkCacheClear
2370 */
2371DECLINLINE(int) PDMDrvHlpBlkCacheClear(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache)
2372{
2373 return pDrvIns->pHlpR3->pfnBlkCacheClear(pBlkCache);
2374}
2375
2376/**
2377 * @copydoc PDMDRVHLPR3::pfnBlkCacheSuspend
2378 */
2379DECLINLINE(int) PDMDrvHlpBlkCacheSuspend(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache)
2380{
2381 return pDrvIns->pHlpR3->pfnBlkCacheSuspend(pBlkCache);
2382}
2383
2384/**
2385 * @copydoc PDMDRVHLPR3::pfnBlkCacheResume
2386 */
2387DECLINLINE(int) PDMDrvHlpBlkCacheResume(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache)
2388{
2389 return pDrvIns->pHlpR3->pfnBlkCacheResume(pBlkCache);
2390}
2391
2392/**
2393 * @copydoc PDMDRVHLPR3::pfnBlkCacheIoXferComplete
2394 */
2395DECLINLINE(void) PDMDrvHlpBlkCacheIoXferComplete(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache,
2396 PPDMBLKCACHEIOXFER hIoXfer, int rcIoXfer)
2397{
2398 pDrvIns->pHlpR3->pfnBlkCacheIoXferComplete(pBlkCache, hIoXfer, rcIoXfer);
2399}
2400
2401/**
2402 * @copydoc PDMDRVHLPR3::pfnBlkCacheRead
2403 */
2404DECLINLINE(int) PDMDrvHlpBlkCacheRead(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache, uint64_t off,
2405 PCRTSGBUF pSgBuf, size_t cbRead, void *pvUser)
2406{
2407 return pDrvIns->pHlpR3->pfnBlkCacheRead(pBlkCache, off, pSgBuf, cbRead, pvUser);
2408}
2409
2410/**
2411 * @copydoc PDMDRVHLPR3::pfnBlkCacheWrite
2412 */
2413DECLINLINE(int) PDMDrvHlpBlkCacheWrite(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache, uint64_t off,
2414 PCRTSGBUF pSgBuf, size_t cbRead, void *pvUser)
2415{
2416 return pDrvIns->pHlpR3->pfnBlkCacheWrite(pBlkCache, off, pSgBuf, cbRead, pvUser);
2417}
2418
2419/**
2420 * @copydoc PDMDRVHLPR3::pfnBlkCacheFlush
2421 */
2422DECLINLINE(int) PDMDrvHlpBlkCacheFlush(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache, void *pvUser)
2423{
2424 return pDrvIns->pHlpR3->pfnBlkCacheFlush(pBlkCache, pvUser);
2425}
2426
2427/**
2428 * @copydoc PDMDRVHLPR3::pfnBlkCacheDiscard
2429 */
2430DECLINLINE(int) PDMDrvHlpBlkCacheDiscard(PPDMDRVINS pDrvIns, PPDMBLKCACHE pBlkCache, PCRTRANGE paRanges,
2431 unsigned cRanges, void *pvUser)
2432{
2433 return pDrvIns->pHlpR3->pfnBlkCacheDiscard(pBlkCache, paRanges, cRanges, pvUser);
2434}
2435
2436/**
2437 * @copydoc PDMDRVHLPR3::pfnVMGetSuspendReason
2438 */
2439DECLINLINE(VMSUSPENDREASON) PDMDrvHlpVMGetSuspendReason(PPDMDRVINS pDrvIns)
2440{
2441 return pDrvIns->pHlpR3->pfnVMGetSuspendReason(pDrvIns);
2442}
2443
2444/**
2445 * @copydoc PDMDRVHLPR3::pfnVMGetResumeReason
2446 */
2447DECLINLINE(VMRESUMEREASON) PDMDrvHlpVMGetResumeReason(PPDMDRVINS pDrvIns)
2448{
2449 return pDrvIns->pHlpR3->pfnVMGetResumeReason(pDrvIns);
2450}
2451
2452/**
2453 * @copydoc PDMDRVHLPR3::pfnQueryGenericUserObject
2454 */
2455DECLINLINE(void *) PDMDrvHlpQueryGenericUserObject(PPDMDRVINS pDrvIns, PCRTUUID pUuid)
2456{
2457 return pDrvIns->pHlpR3->pfnQueryGenericUserObject(pDrvIns, pUuid);
2458}
2459
2460
2461/** Pointer to callbacks provided to the VBoxDriverRegister() call. */
2462typedef struct PDMDRVREGCB *PPDMDRVREGCB;
2463/** Pointer to const callbacks provided to the VBoxDriverRegister() call. */
2464typedef const struct PDMDRVREGCB *PCPDMDRVREGCB;
2465
2466/**
2467 * Callbacks for VBoxDriverRegister().
2468 */
2469typedef struct PDMDRVREGCB
2470{
2471 /** Interface version.
2472 * This is set to PDM_DRVREG_CB_VERSION. */
2473 uint32_t u32Version;
2474
2475 /**
2476 * Registers a driver with the current VM instance.
2477 *
2478 * @returns VBox status code.
2479 * @param pCallbacks Pointer to the callback table.
2480 * @param pReg Pointer to the driver registration record.
2481 * This data must be permanent and readonly.
2482 */
2483 DECLR3CALLBACKMEMBER(int, pfnRegister,(PCPDMDRVREGCB pCallbacks, PCPDMDRVREG pReg));
2484} PDMDRVREGCB;
2485
2486/** Current version of the PDMDRVREGCB structure. */
2487#define PDM_DRVREG_CB_VERSION PDM_VERSION_MAKE(0xf0fa, 1, 0)
2488
2489
2490/**
2491 * The VBoxDriverRegister callback function.
2492 *
2493 * PDM will invoke this function after loading a driver module and letting
2494 * the module decide which drivers to register and how to handle conflicts.
2495 *
2496 * @returns VBox status code.
2497 * @param pCallbacks Pointer to the callback table.
2498 * @param u32Version VBox version number.
2499 */
2500typedef DECLCALLBACKTYPE(int, FNPDMVBOXDRIVERSREGISTER,(PCPDMDRVREGCB pCallbacks, uint32_t u32Version));
2501
2502VMMR3DECL(int) PDMR3DrvStaticRegistration(PVM pVM, FNPDMVBOXDRIVERSREGISTER pfnCallback);
2503
2504#endif /* IN_RING3 */
2505
2506/** @} */
2507
2508RT_C_DECLS_END
2509
2510#endif /* !VBOX_INCLUDED_vmm_pdmdrv_h */
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