VirtualBox

source: vbox/trunk/src/VBox/Devices/testcase/tstDeviceInternal.h@ 86692

Last change on this file since 86692 was 84509, checked in by vboxsync, 5 years ago

iprt/cdefs.h,*: Introducing RT_FLEXIBLE_ARRAY_EXTENSION as a g++ hack that allows us to use RT_FLEXIBLE_ARRAY without the compiler going all pendantic on us. Only tested with 10.1.0. bugref:9746

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.0 KB
Line 
1/** @file
2 * tstDevice: Shared definitions between the framework and the shim library.
3 */
4
5/*
6 * Copyright (C) 2017-2020 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17#ifndef VBOX_INCLUDED_SRC_testcase_tstDeviceInternal_h
18#define VBOX_INCLUDED_SRC_testcase_tstDeviceInternal_h
19#ifndef RT_WITHOUT_PRAGMA_ONCE
20# pragma once
21#endif
22
23#include <VBox/param.h>
24#include <VBox/types.h>
25#include <iprt/assert.h>
26#include <iprt/list.h>
27#include <iprt/semaphore.h>
28#include <iprt/critsect.h>
29
30#include "tstDeviceCfg.h"
31#include "tstDevicePlugin.h"
32
33RT_C_DECLS_BEGIN
34
35
36/** Converts PDM device instance to the device under test structure. */
37#define TSTDEV_PDMDEVINS_2_DUT(a_pDevIns) ((a_pDevIns)->Internal.s.pDut)
38
39/** Forward declaration of internal test device instance data. */
40typedef struct TSTDEVDUTINT *PTSTDEVDUTINT;
41
42
43/**
44 * CFGM node structure.
45 */
46typedef struct CFGMNODE
47{
48 /** Device under test this CFGM node is for. */
49 PTSTDEVDUTINT pDut;
50 /** @todo: */
51} CFGMNODE;
52
53
54/**
55 * Private device instance data.
56 */
57typedef struct PDMDEVINSINTR3
58{
59 /** Pointer to the device under test the PDM device instance is for. */
60 PTSTDEVDUTINT pDut;
61} PDMDEVINSINTR3;
62AssertCompile(sizeof(PDMDEVINSINTR3) <= (HC_ARCH_BITS == 32 ? 72 : 112 + 0x28));
63
64/**
65 * Private device instance data.
66 */
67typedef struct PDMDEVINSINTR0
68{
69 /** Pointer to the device under test the PDM device instance is for. */
70 PTSTDEVDUTINT pDut;
71} PDMDEVINSINTR0;
72AssertCompile(sizeof(PDMDEVINSINTR0) <= (HC_ARCH_BITS == 32 ? 72 : 112 + 0x28));
73
74/**
75 * Private device instance data.
76 */
77typedef struct PDMDEVINSINTRC
78{
79 /** Pointer to the device under test the PDM device instance is for. */
80 PTSTDEVDUTINT pDut;
81} PDMDEVINSINTRC;
82AssertCompile(sizeof(PDMDEVINSINTRC) <= (HC_ARCH_BITS == 32 ? 72 : 112 + 0x28));
83
84typedef struct PDMPCIDEVINT
85{
86 bool fRegistered;
87} PDMPCIDEVINT;
88
89
90/**
91 * Internal PDM critical section structure.
92 */
93typedef struct PDMCRITSECTINT
94{
95 /** The actual critical section used for emulation. */
96 RTCRITSECT CritSect;
97} PDMCRITSECTINT;
98AssertCompile(sizeof(PDMCRITSECTINT) <= (HC_ARCH_BITS == 32 ? 0x80 : 0xc0));
99
100
101/**
102 * SSM handle state.
103 */
104typedef struct SSMHANDLE
105{
106 /** Pointer to the device under test the handle is for. */
107 PTSTDEVDUTINT pDut;
108 /** The saved state data buffer. */
109 uint8_t *pbSavedState;
110 /** Size of the saved state. */
111 size_t cbSavedState;
112 /** Current offset into the data buffer. */
113 uint32_t offDataBuffer;
114 /** Current unit version. */
115 uint32_t uCurUnitVer;
116 /** Status code. */
117 int rc;
118} SSMHANDLE;
119
120
121/**
122 * MM Heap allocation.
123 */
124typedef struct TSTDEVMMHEAPALLOC
125{
126 /** Node for the list of allocations. */
127 RTLISTNODE NdMmHeap;
128 /** Pointer to the device under test the allocation was made for. */
129 PTSTDEVDUTINT pDut;
130 /** Size of the allocation. */
131 size_t cbAlloc;
132 /** Start of the real allocation. */
133 RT_FLEXIBLE_ARRAY_EXTENSION
134 uint8_t abAlloc[RT_FLEXIBLE_ARRAY];
135} TSTDEVMMHEAPALLOC;
136/** Pointer to a MM Heap allocation. */
137typedef TSTDEVMMHEAPALLOC *PTSTDEVMMHEAPALLOC;
138/** Pointer to a const MM Heap allocation. */
139typedef const TSTDEVMMHEAPALLOC *PCTSTDEVMMHEAPALLOC;
140
141AssertCompileMemberAlignment(TSTDEVMMHEAPALLOC, abAlloc, HC_ARCH_BITS == 64 ? 16 : 8);
142
143
144/**
145 * The usual device/driver/internal/external stuff.
146 */
147typedef enum
148{
149 /** The usual invalid entry. */
150 PDMTHREADTYPE_INVALID = 0,
151 /** Device type. */
152 PDMTHREADTYPE_DEVICE,
153 /** USB Device type. */
154 PDMTHREADTYPE_USB,
155 /** Driver type. */
156 PDMTHREADTYPE_DRIVER,
157 /** Internal type. */
158 PDMTHREADTYPE_INTERNAL,
159 /** External type. */
160 PDMTHREADTYPE_EXTERNAL,
161 /** The usual 32-bit hack. */
162 PDMTHREADTYPE_32BIT_HACK = 0x7fffffff
163} PDMTHREADTYPE;
164
165
166/**
167 * The internal structure for the thread.
168 */
169typedef struct PDMTHREADINT
170{
171 /** Node for the list of threads. */
172 RTLISTNODE NdPdmThrds;
173 /** Pointer to the device under test the allocation was made for. */
174 PTSTDEVDUTINT pDut;
175 /** The event semaphore the thread blocks on when not running. */
176 RTSEMEVENTMULTI BlockEvent;
177 /** The event semaphore the thread sleeps on while running. */
178 RTSEMEVENTMULTI SleepEvent;
179 /** The thread type. */
180 PDMTHREADTYPE enmType;
181} PDMTHREADINT;
182
183
184#define PDMTHREADINT_DECLARED
185#define PDMCRITSECTINT_DECLARED
186#define PDMDEVINSINT_DECLARED
187#define PDMPCIDEVINT_DECLARED
188#define VMM_INCLUDED_SRC_include_VMInternal_h
189#define VMM_INCLUDED_SRC_include_VMMInternal_h
190RT_C_DECLS_END
191#include <VBox/vmm/pdmcritsect.h>
192#include <VBox/vmm/pdmthread.h>
193#include <VBox/vmm/pdmdev.h>
194#include <VBox/vmm/pdmpci.h>
195#include <VBox/vmm/pdmdrv.h>
196#include <VBox/vmm/tm.h>
197RT_C_DECLS_BEGIN
198
199
200/**
201 * TM timer structure.
202 */
203typedef struct TMTIMER
204{
205 /** List of timers created by the device. */
206 RTLISTNODE NdDevTimers;
207 /** Clock this timer belongs to. */
208 TMCLOCK enmClock;
209 /** Callback to call when the timer expires. */
210 PFNTMTIMERDEV pfnCallbackDev;
211 /** Opaque user data to pass to the callback. */
212 void *pvUser;
213 /** Flags. */
214 uint32_t fFlags;
215 /** Assigned critical section. */
216 PPDMCRITSECT pCritSect;
217 /** @todo: */
218} TMTIMER;
219
220
221/**
222 * PDM module descriptor type.
223 */
224typedef enum TSTDEVPDMMODTYPE
225{
226 /** Invalid module type. */
227 TSTDEVPDMMODTYPE_INVALID = 0,
228 /** Ring 3 module. */
229 TSTDEVPDMMODTYPE_R3,
230 /** Ring 0 module. */
231 TSTDEVPDMMODTYPE_R0,
232 /** Raw context module. */
233 TSTDEVPDMMODTYPE_RC,
234 /** 32bit hack. */
235 TSTDEVPDMMODTYPE_32BIT_HACK = 0x7fffffff
236} TSTDEVPDMMODTYPE;
237
238/**
239 * Registered I/O port access handler.
240 */
241typedef struct RTDEVDUTIOPORT
242{
243 /** Node for the list of registered handlers. */
244 RTLISTNODE NdIoPorts;
245 /** Start I/O port the handler is for. */
246 RTIOPORT PortStart;
247 /** Number of ports handled. */
248 RTIOPORT cPorts;
249 /** Opaque user data - R3. */
250 void *pvUserR3;
251 /** Out handler - R3. */
252 PFNIOMIOPORTNEWOUT pfnOutR3;
253 /** In handler - R3. */
254 PFNIOMIOPORTNEWIN pfnInR3;
255 /** Out string handler - R3. */
256 PFNIOMIOPORTNEWOUTSTRING pfnOutStrR3;
257 /** In string handler - R3. */
258 PFNIOMIOPORTNEWINSTRING pfnInStrR3;
259
260 /** Opaque user data - R0. */
261 void *pvUserR0;
262 /** Out handler - R0. */
263 PFNIOMIOPORTNEWOUT pfnOutR0;
264 /** In handler - R0. */
265 PFNIOMIOPORTNEWIN pfnInR0;
266 /** Out string handler - R0. */
267 PFNIOMIOPORTNEWOUTSTRING pfnOutStrR0;
268 /** In string handler - R0. */
269 PFNIOMIOPORTNEWINSTRING pfnInStrR0;
270
271#ifdef TSTDEV_SUPPORTS_RC
272 /** Opaque user data - RC. */
273 void *pvUserRC;
274 /** Out handler - RC. */
275 PFNIOMIOPORTNEWOUT pfnOutRC;
276 /** In handler - RC. */
277 PFNIOMIOPORTNEWIN pfnInRC;
278 /** Out string handler - RC. */
279 PFNIOMIOPORTNEWOUTSTRING pfnOutStrRC;
280 /** In string handler - RC. */
281 PFNIOMIOPORTNEWINSTRING pfnInStrRC;
282#endif
283} RTDEVDUTIOPORT;
284/** Pointer to a registered I/O port handler. */
285typedef RTDEVDUTIOPORT *PRTDEVDUTIOPORT;
286/** Pointer to a const I/O port handler. */
287typedef const RTDEVDUTIOPORT *PCRTDEVDUTIOPORT;
288
289
290/**
291 * Registered SSM handlers.
292 */
293typedef struct TSTDEVDUTSSM
294{
295 /** Node for the list of registered SSM handlers. */
296 RTLISTNODE NdSsm;
297 /** Version */
298 uint32_t uVersion;
299 PFNSSMDEVLIVEPREP pfnLivePrep;
300 PFNSSMDEVLIVEEXEC pfnLiveExec;
301 PFNSSMDEVLIVEVOTE pfnLiveVote;
302 PFNSSMDEVSAVEPREP pfnSavePrep;
303 PFNSSMDEVSAVEEXEC pfnSaveExec;
304 PFNSSMDEVSAVEDONE pfnSaveDone;
305 PFNSSMDEVLOADPREP pfnLoadPrep;
306 PFNSSMDEVLOADEXEC pfnLoadExec;
307 PFNSSMDEVLOADDONE pfnLoadDone;
308} TSTDEVDUTSSM;
309/** Pointer to the registered SSM handlers. */
310typedef TSTDEVDUTSSM *PTSTDEVDUTSSM;
311/** Pointer to a const SSM handler. */
312typedef const TSTDEVDUTSSM *PCTSTDEVDUTSSM;
313
314
315/**
316 * The Support Driver session state.
317 */
318typedef struct TSTDEVSUPDRVSESSION
319{
320 /** Pointer to the owning device under test instance. */
321 PTSTDEVDUTINT pDut;
322 /** List of event semaphores. */
323 RTLISTANCHOR LstSupSem;
324} TSTDEVSUPDRVSESSION;
325/** Pointer to the Support Driver session state. */
326typedef TSTDEVSUPDRVSESSION *PTSTDEVSUPDRVSESSION;
327
328/** Converts a Support Driver session handle to the internal state. */
329#define TSTDEV_PSUPDRVSESSION_2_PTSTDEVSUPDRVSESSION(a_pSession) ((PTSTDEVSUPDRVSESSION)(a_pSession))
330/** Converts the internal session state to a Support Driver session handle. */
331#define TSTDEV_PTSTDEVSUPDRVSESSION_2_PSUPDRVSESSION(a_pSession) ((PSUPDRVSESSION)(a_pSession))
332
333/**
334 * Support driver event semaphore.
335 */
336typedef struct TSTDEVSUPSEMEVENT
337{
338 /** Node for the event semaphore list. */
339 RTLISTNODE NdSupSem;
340 /** Flag whether this is multi event semaphore. */
341 bool fMulti;
342 /** Event smeaphore handles depending on the flag above. */
343 union
344 {
345 RTSEMEVENT hSemEvt;
346 RTSEMEVENTMULTI hSemEvtMulti;
347 } u;
348} TSTDEVSUPSEMEVENT;
349/** Pointer to a support event semaphore state. */
350typedef TSTDEVSUPSEMEVENT *PTSTDEVSUPSEMEVENT;
351
352/** Converts a Support event semaphore handle to the internal state. */
353#define TSTDEV_SUPSEMEVENT_2_PTSTDEVSUPSEMEVENT(a_pSupSemEvt) ((PTSTDEVSUPSEMEVENT)(a_pSupSemEvt))
354/** Converts the internal session state to a Support event semaphore handle. */
355#define TSTDEV_PTSTDEVSUPSEMEVENT_2_SUPSEMEVENT(a_pSupSemEvt) ((SUPSEMEVENT)(a_pSupSemEvt))
356
357/**
358 * The contex the device under test is currently in.
359 */
360typedef enum TSTDEVDUTCTX
361{
362 /** Invalid context. */
363 TSTDEVDUTCTX_INVALID = 0,
364 /** R3 context. */
365 TSTDEVDUTCTX_R3,
366 /** R0 context. */
367 TSTDEVDUTCTX_R0,
368 /** RC context. */
369 TSTDEVDUTCTX_RC,
370 /** 32bit hack. */
371 TSTDEVDUTCTX_32BIT_HACK = 0x7fffffff
372} TSTDEVDUTCTX;
373
374/**
375 * PCI region descriptor.
376 */
377typedef struct TSTDEVDUTPCIREGION
378{
379 /** Size of the region. */
380 RTGCPHYS cbRegion;
381 /** Address space type. */
382 PCIADDRESSSPACE enmType;
383 /** Region mapping callback. */
384 PFNPCIIOREGIONMAP pfnRegionMap;
385} TSTDEVDUTPCIREGION;
386/** Pointer to a PCI region descriptor. */
387typedef TSTDEVDUTPCIREGION *PTSTDEVDUTPCIREGION;
388/** Pointer to a const PCI region descriptor. */
389typedef const TSTDEVDUTPCIREGION *PCTSTDEVDUTPCIREGION;
390
391/**
392 * Device under test instance data.
393 */
394typedef struct TSTDEVDUTINT
395{
396 /** Pointer to the test this device is running under. */
397 PCTSTDEVTEST pTest;
398 /** Pointer to the PDM device instance. */
399 PPDMDEVINS pDevIns;
400 /** CFGM root config node for the device. */
401 CFGMNODE Cfg;
402 /** Current device context. */
403 TSTDEVDUTCTX enmCtx;
404 /** Critical section protecting the lists below. */
405 RTCRITSECTRW CritSectLists;
406 /** List of registered I/O port handlers. */
407 RTLISTANCHOR LstIoPorts;
408 /** List of timers registered. */
409 RTLISTANCHOR LstTimers;
410 /** List of registered MMIO regions. */
411 RTLISTANCHOR LstMmio;
412 /** List of MM Heap allocations. */
413 RTLISTANCHOR LstMmHeap;
414 /** List of PDM threads. */
415 RTLISTANCHOR LstPdmThreads;
416 /** List of SSM handlers (just one normally). */
417 RTLISTANCHOR LstSsmHandlers;
418 /** The SUP session we emulate. */
419 TSTDEVSUPDRVSESSION SupSession;
420 /** The NOP critical section. */
421 PDMCRITSECT CritSectNop;
422 /** The VM state associated with this device. */
423 PVM pVm;
424 /** The registered PCI device instance if this is a PCI device. */
425 PPDMPCIDEV pPciDev;
426 /** PCI Region descriptors. */
427 TSTDEVDUTPCIREGION aPciRegions[VBOX_PCI_NUM_REGIONS];
428 /** The status port interface we implement. */
429 PDMIBASE IBaseSts;
430 /** */
431} TSTDEVDUTINT;
432
433
434extern const PDMDEVHLPR3 g_tstDevPdmDevHlpR3;
435
436
437DECLHIDDEN(int) tstDevPdmLdrGetSymbol(PTSTDEVDUTINT pThis, const char *pszMod, TSTDEVPDMMODTYPE enmModType,
438 const char *pszSymbol, PFNRT *ppfn);
439
440
441DECLINLINE(int) tstDevDutLockShared(PTSTDEVDUTINT pThis)
442{
443 return RTCritSectRwEnterShared(&pThis->CritSectLists);
444}
445
446DECLINLINE(int) tstDevDutUnlockShared(PTSTDEVDUTINT pThis)
447{
448 return RTCritSectRwLeaveShared(&pThis->CritSectLists);
449}
450
451DECLINLINE(int) tstDevDutLockExcl(PTSTDEVDUTINT pThis)
452{
453 return RTCritSectRwEnterExcl(&pThis->CritSectLists);
454}
455
456DECLINLINE(int) tstDevDutUnlockExcl(PTSTDEVDUTINT pThis)
457{
458 return RTCritSectRwLeaveExcl(&pThis->CritSectLists);
459}
460
461DECLHIDDEN(int) tstDevPdmR3ThreadCreateDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,
462 PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
463DECLHIDDEN(int) tstDevPdmR3ThreadCreateUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,
464 PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
465DECLHIDDEN(int) tstDevPdmR3ThreadCreateDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,
466 PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
467DECLHIDDEN(int) tstDevPdmR3ThreadCreate(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,
468 PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
469DECLHIDDEN(int) tstDevPdmR3ThreadCreateExternal(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,
470 PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
471DECLHIDDEN(int) tstDevPdmR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread);
472DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns);
473DECLHIDDEN(int) tstDevPdmR3ThreadDestroyUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns);
474DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns);
475DECLHIDDEN(void) tstDevPdmR3ThreadDestroyAll(PTSTDEVDUTINT pDut);
476DECLHIDDEN(int) tstDevPdmR3ThreadIAmSuspending(PPDMTHREAD pThread);
477DECLHIDDEN(int) tstDevPdmR3ThreadIAmRunning(PPDMTHREAD pThread);
478DECLHIDDEN(int) tstDevPdmR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies);
479DECLHIDDEN(int) tstDevPdmR3ThreadSuspend(PPDMTHREAD pThread);
480DECLHIDDEN(int) tstDevPdmR3ThreadResume(PPDMTHREAD pThread);
481
482
483RT_C_DECLS_END
484
485#endif /* !VBOX_INCLUDED_SRC_testcase_tstDeviceInternal_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