VirtualBox

source: vbox/trunk/src/VBox/VMM/IOMInternal.h@ 332

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

string.h & stdio.h + header cleanups.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 15.4 KB
Line 
1/* $Id: IOMInternal.h 23 2007-01-15 14:08:28Z vboxsync $ */
2/** @file
3 * IOM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006 InnoTek Systemberatung GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * If you received this file as part of a commercial VirtualBox
18 * distribution, then only the terms of your commercial VirtualBox
19 * license agreement apply instead of the previous paragraph.
20 */
21
22#ifndef __IOMInternal_h__
23#define __IOMInternal_h__
24
25#include <VBox/cdefs.h>
26#include <VBox/types.h>
27#include <VBox/iom.h>
28#include <VBox/stam.h>
29#include <iprt/avl.h>
30
31#if !defined(IN_IOM_R3) && !defined(IN_IOM_R0) && !defined(IN_IOM_GC)
32# error "Not in IOM! This is an internal header!"
33#endif
34
35
36/** @defgroup grp_iom_int Internals
37 * @ingroup grp_iom
38 * @internal
39 * @{
40 */
41
42/**
43 * MMIO range descriptor, R3 version.
44 */
45typedef struct IOMMMIORANGER3
46{
47 /** Avl node core with GCPhys as Key and GCPhys + cbSize - 1 as KeyLast. */
48 AVLROGCPHYSNODECORE Core;
49 /** Start physical address. */
50 RTGCPHYS GCPhys;
51 /** Size of the range. */
52 RTUINT cbSize;
53 /** Pointer to user argument. */
54 RTHCPTR pvUser;
55 /** Pointer to device instance. */
56 HCPTRTYPE(PPDMDEVINS) pDevIns;
57 /** Pointer to write callback function. */
58 HCPTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback;
59 /** Pointer to read callback function. */
60 HCPTRTYPE(PFNIOMMMIOREAD) pfnReadCallback;
61 /** Pointer to fill (memset) callback function. */
62 HCPTRTYPE(PFNIOMMMIOFILL) pfnFillCallback;
63 /** Description / Name. For easing debugging. */
64 HCPTRTYPE(const char *) pszDesc;
65} IOMMMIORANGER3;
66/** Pointer to a MMIO range descriptor, R3 version. */
67typedef struct IOMMMIORANGER3 *PIOMMMIORANGER3;
68
69/** MMIO range descriptor, R0 version. */
70typedef IOMMMIORANGER3 IOMMMIORANGER0;
71/** Pointer to a MMIO range descriptor, R0 version. */
72typedef PIOMMMIORANGER3 PIOMMMIORANGER0;
73
74/**
75 * MMIO range descriptor, GC version.
76 */
77typedef struct IOMMMIORANGEGC
78{
79 /** Avl node core with GCPhys as Key and GCPhys + cbSize - 1 as KeyLast. */
80 AVLROGCPHYSNODECORE Core;
81 /** Start physical address. */
82 RTGCPHYS GCPhys;
83 /** Size of the range. */
84 RTUINT cbSize;
85 /** Pointer to user argument. */
86 RTGCPTR pvUser;
87 /** Pointer to device instance. */
88 GCPTRTYPE(PPDMDEVINS) pDevIns;
89 /** Pointer to write callback function. */
90 GCPTRTYPE(PFNIOMMMIOWRITE) pfnWriteCallback;
91 /** Pointer to read callback function. */
92 GCPTRTYPE(PFNIOMMMIOREAD) pfnReadCallback;
93 /** Pointer to fill (memset) callback function. */
94 GCPTRTYPE(PFNIOMMMIOFILL) pfnFillCallback;
95 /** Description / Name. For easing debugging. */
96 HCPTRTYPE(const char *) pszDesc;
97} IOMMMIORANGEGC;
98/** Pointer to a MMIO range descriptor, GC version. */
99typedef struct IOMMMIORANGEGC *PIOMMMIORANGEGC;
100
101
102/**
103 * MMIO address statistics. (one address)
104 *
105 * This is a simple way of making on demand statistics, however it's a
106 * bit free with the hypervisor heap memory..
107 */
108typedef struct IOMMMIOSTATS
109{
110 /** Avl node core with the address as Key. */
111 AVLOGCPHYSNODECORE Core;
112 /** Number of reads to this address from R3. */
113 STAMCOUNTER ReadR3;
114 /** Number of writes to this address from R3. */
115 STAMCOUNTER WriteR3;
116 /** Number of reads to this address from R0. */
117 STAMCOUNTER ReadR0;
118 /** Number of writes to this address from R0. */
119 STAMCOUNTER WriteR0;
120 /** Number of reads to this address from GC. */
121 STAMCOUNTER ReadGC;
122 /** Number of writes to this address from GC. */
123 STAMCOUNTER WriteGC;
124 /** Number of reads to this address from R0 which was serviced in R3. */
125 STAMCOUNTER ReadR0ToR3;
126 /** Number of writes to this address from R0 which was serviced in R3. */
127 STAMCOUNTER WriteR0ToR3;
128 /** Number of reads to this address from GC which was serviced in R3. */
129 STAMCOUNTER ReadGCToR3;
130 /** Number of writes to this address from GC which was serviced in R3. */
131 STAMCOUNTER WriteGCToR3;
132} IOMMMIOSTATS;
133/** Pointer to I/O port statistics. */
134typedef IOMMMIOSTATS *PIOMMMIOSTATS;
135
136
137/**
138 * I/O port range descriptor, R3 version.
139 */
140typedef struct IOMIOPORTRANGER3
141{
142 /** Avl node core with Port as Key and Port + cPorts - 1 as KeyLast. */
143 AVLROIOPORTNODECORE Core;
144 /** Start I/O port address. */
145 RTIOPORT Port;
146 /** Size of the range. */
147 uint16_t cPorts;
148 /** Pointer to user argument. */
149 RTHCPTR pvUser;
150 /** Pointer to the associated device instance. */
151 HCPTRTYPE(PPDMDEVINS) pDevIns;
152 /** Pointer to OUT callback function. */
153 HCPTRTYPE(PFNIOMIOPORTOUT) pfnOutCallback;
154 /** Pointer to IN callback function. */
155 HCPTRTYPE(PFNIOMIOPORTIN) pfnInCallback;
156 /** Pointer to string OUT callback function. */
157 HCPTRTYPE(PFNIOMIOPORTOUTSTRING) pfnOutStrCallback;
158 /** Pointer to string IN callback function. */
159 HCPTRTYPE(PFNIOMIOPORTINSTRING) pfnInStrCallback;
160 /** Description / Name. For easing debugging. */
161 HCPTRTYPE(const char *) pszDesc;
162} IOMIOPORTRANGER3;
163/** Pointer to I/O port range descriptor, R3 version. */
164typedef IOMIOPORTRANGER3 *PIOMIOPORTRANGER3;
165
166/** I/O port range descriptor, R0 version. */
167typedef IOMIOPORTRANGER3 IOMIOPORTRANGER0;
168/** Pointer to I/O port range descriptor, R0 version. */
169typedef PIOMIOPORTRANGER3 PIOMIOPORTRANGER0;
170
171/**
172 * I/O port range descriptor.
173 */
174typedef struct IOMIOPORTRANGEGC
175{
176 /** Avl node core with Port as Key and Port + cPorts - 1 as KeyLast. */
177 AVLROIOPORTNODECORE Core;
178 /** Start I/O port address. */
179 RTIOPORT Port;
180 /** Size of the range. */
181 uint16_t cPorts;
182 /** Pointer to user argument. */
183 RTGCPTR pvUser;
184 /** Pointer to the associated device instance. */
185 GCPTRTYPE(PPDMDEVINS) pDevIns;
186 /** Pointer to OUT callback function. */
187 GCPTRTYPE(PFNIOMIOPORTOUT) pfnOutCallback;
188 /** Pointer to IN callback function. */
189 GCPTRTYPE(PFNIOMIOPORTIN) pfnInCallback;
190 /** Pointer to string OUT callback function. */
191 GCPTRTYPE(PFNIOMIOPORTOUTSTRING) pfnOutStrCallback;
192 /** Pointer to string IN callback function. */
193 GCPTRTYPE(PFNIOMIOPORTINSTRING) pfnInStrCallback;
194 /** Description / Name. For easing debugging. */
195 HCPTRTYPE(const char *) pszDesc;
196} IOMIOPORTRANGEGC;
197/** Pointer to I/O port range descriptor, GC version. */
198typedef IOMIOPORTRANGEGC *PIOMIOPORTRANGEGC;
199
200
201/**
202 * I/O port statistics. (one I/O port)
203 *
204 * This is a simple way of making on demand statistics, however it's a
205 * bit free with the hypervisor heap memory..
206 */
207typedef struct IOMIOPORTSTATS
208{
209 /** Avl node core with the port as Key. */
210 AVLOIOPORTNODECORE Core;
211 /** Number of INs to this port from R3. */
212 STAMCOUNTER InR3;
213 /** Number of OUTs to this port from R3. */
214 STAMCOUNTER OutR3;
215 /** Number of INs to this port from R0. */
216 STAMCOUNTER InR0;
217 /** Number of OUTs to this port from R0. */
218 STAMCOUNTER OutR0;
219 /** Number of INs to this port from GC. */
220 STAMCOUNTER InGC;
221 /** Number of OUTs to this port from GC. */
222 STAMCOUNTER OutGC;
223 /** Number of INs to this port from R0 which was serviced in R3. */
224 STAMCOUNTER InR0ToR3;
225 /** Number of OUTs to this port from R0 which was serviced in R3. */
226 STAMCOUNTER OutR0ToR3;
227 /** Number of INs to this port from GC which was serviced in R3. */
228 STAMCOUNTER InGCToR3;
229 /** Number of OUTs to this port from GC which was serviced in R3. */
230 STAMCOUNTER OutGCToR3;
231} IOMIOPORTSTATS;
232/** Pointer to I/O port statistics. */
233typedef IOMIOPORTSTATS *PIOMIOPORTSTATS;
234
235
236/**
237 * The IOM trees.
238 * These are offset based the nodes and root must be in the same
239 * memory block in HC. The locations of IOM structure and the hypervisor heap
240 * are quite different in HC and GC.
241 */
242typedef struct IOMTREES
243{
244 /** Tree containing I/O port range descriptors registered for HC (IOMIOPORTRANGEHC). */
245 AVLROIOPORTTREE IOPortTreeR3;
246 /** Tree containing I/O port range descriptors registered for R0 (IOMIOPORTRANGER0). */
247 AVLROIOPORTTREE IOPortTreeR0;
248 /** Tree containing I/O port range descriptors registered for GC (IOMIOPORTRANGEGC). */
249 AVLROIOPORTTREE IOPortTreeGC;
250
251 /** Tree containing MMIO range descriptors registered for HC (IOMMMIORANGEHC). */
252 AVLROGCPHYSTREE MMIOTreeR3;
253 /** Tree containing MMIO range descriptors registered for R0 (IOMMMIORANGER0). */
254 AVLROGCPHYSTREE MMIOTreeR0;
255 /** Tree containing MMIO range descriptors registered for GC (IOMMMIORANGEGC). */
256 AVLROGCPHYSTREE MMIOTreeGC;
257
258 /** Tree containing I/O port statistics (IOMIOPORTSTATS). */
259 AVLOIOPORTTREE IOPortStatTree;
260 /** Tree containing MMIO statistics (IOMMMIOSTATS). */
261 AVLOGCPHYSTREE MMIOStatTree;
262} IOMTREES;
263/** Pointer to the IOM trees. */
264typedef IOMTREES *PIOMTREES;
265
266
267/**
268 * Converts an IOM pointer into a VM pointer.
269 * @returns Pointer to the VM structure the PGM is part of.
270 * @param pIOM Pointer to IOM instance data.
271 */
272#define IOM2VM(pIOM) ( (PVM)((char*)pIOM - pIOM->offVM) )
273
274/**
275 * IOM Data (part of VM)
276 */
277typedef struct IOM
278{
279 /** Offset to the VM structure. */
280 RTINT offVM;
281
282 /** Pointer to the trees - GC ptr. */
283 GCPTRTYPE(PIOMTREES) pTreesGC;
284 /** Pointer to the trees - HC ptr. */
285 HCPTRTYPE(PIOMTREES) pTreesHC;
286
287
288 /** @name Caching of I/O Port ranges and statistics.
289 * (Saves quite some time in rep outs/ins instruction emulation.)
290 * @{ */
291 HCPTRTYPE(PIOMIOPORTRANGER3) pRangeLastReadR3;
292 HCPTRTYPE(PIOMIOPORTRANGER3) pRangeLastWriteR3;
293 HCPTRTYPE(PIOMIOPORTSTATS) pStatsLastReadR3;
294 HCPTRTYPE(PIOMIOPORTSTATS) pStatsLastWriteR3;
295
296 HCPTRTYPE(PIOMIOPORTRANGER0) pRangeLastReadR0;
297 HCPTRTYPE(PIOMIOPORTRANGER0) pRangeLastWriteR0;
298 HCPTRTYPE(PIOMIOPORTSTATS) pStatsLastReadR0;
299 HCPTRTYPE(PIOMIOPORTSTATS) pStatsLastWriteR0;
300
301 GCPTRTYPE(PIOMIOPORTRANGEGC) pRangeLastReadGC;
302 GCPTRTYPE(PIOMIOPORTRANGEGC) pRangeLastWriteGC;
303 GCPTRTYPE(PIOMIOPORTSTATS) pStatsLastReadGC;
304 GCPTRTYPE(PIOMIOPORTSTATS) pStatsLastWriteGC;
305 /** @} */
306
307 /** @name I/O Port statistics.
308 * @{ */
309 STAMPROFILE StatGCIOPortHandler;
310
311 STAMCOUNTER StatGCInstIn;
312 STAMCOUNTER StatGCInstOut;
313 STAMCOUNTER StatGCInstIns;
314 STAMCOUNTER StatGCInstOuts;
315 /** @} */
316
317 /** @name MMIO statistics.
318 * @{ */
319 STAMPROFILE StatGCMMIOHandler;
320 STAMCOUNTER StatGCMMIOFailures;
321
322 STAMPROFILE StatGCInstMov;
323 STAMPROFILE StatGCInstCmp;
324 STAMPROFILE StatGCInstAnd;
325 STAMPROFILE StatGCInstTest;
326 STAMPROFILE StatGCInstXchg;
327 STAMPROFILE StatGCInstStos;
328 STAMPROFILE StatGCInstLods;
329 STAMPROFILE StatGCInstMovs;
330 STAMPROFILE StatGCInstMovsToMMIO;
331 STAMPROFILE StatGCInstMovsFromMMIO;
332 STAMPROFILE StatGCInstMovsMMIO;
333 STAMCOUNTER StatGCInstOther;
334
335 STAMCOUNTER StatGCMMIO1Byte;
336 STAMCOUNTER StatGCMMIO2Bytes;
337 STAMCOUNTER StatGCMMIO4Bytes;
338
339 RTUINT cMovsMaxBytes;
340 RTUINT cStosMaxBytes;
341 /** @} */
342
343} IOM;
344/** Pointer to IOM instance data. */
345typedef IOM *PIOM;
346
347
348__BEGIN_DECLS
349
350#ifdef IN_IOM_R3
351PIOMIOPORTSTATS iomr3IOPortStatsCreate(PVM pVM, RTIOPORT Port, const char *pszDesc);
352PIOMMMIOSTATS iomR3MMIOStatsCreate(PVM pVM, RTGCPHYS GCPhys, const char *pszDesc);
353#endif /* IN_IOM_R3 */
354
355/**
356 * \#PF Handler callback for MMIO ranges.
357 *
358 * @returns VBox status code (appropriate for GC return).
359 *
360 * @param pVM VM Handle.
361 * @param uErrorCode CPU Error code.
362 * @param pRegFrame Trap register frame.
363 * @param pvFault The fault address (cr2).
364 * @param GCPhysFault The GC physical address corresponding to pvFault.
365 * @param pvUser Pointer to the MMIO range entry.
366 */
367IOMDECL(int) IOMMMIOHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, void *pvFault, RTGCPHYS GCPhysFault, void *pvUser);
368
369/**
370 * Gets the I/O port range for the specified I/O port in the current context.
371 *
372 * @returns Pointer to I/O port range.
373 * @returns NULL if no port registered.
374 *
375 * @param pIOM IOM instance data.
376 * @param Port Port to lookup.
377 */
378inline CTXALLSUFF(PIOMIOPORTRANGE) iomIOPortGetRange(PIOM pIOM, RTIOPORT Port)
379{
380 CTXALLSUFF(PIOMIOPORTRANGE) pRange = (CTXALLSUFF(PIOMIOPORTRANGE))RTAvlroIOPortRangeGet(&pIOM->CTXSUFF(pTrees)->CTXALLSUFF(IOPortTree), Port);
381 return pRange;
382}
383
384/**
385 * Gets the I/O port range for the specified I/O port in the HC.
386 *
387 * @returns Pointer to I/O port range.
388 * @returns NULL if no port registered.
389 *
390 * @param pIOM IOM instance data.
391 * @param Port Port to lookup.
392 */
393inline PIOMIOPORTRANGER3 iomIOPortGetRangeHC(PIOM pIOM, RTIOPORT Port)
394{
395 PIOMIOPORTRANGER3 pRange = (PIOMIOPORTRANGER3)RTAvlroIOPortRangeGet(&pIOM->CTXSUFF(pTrees)->IOPortTreeR3, Port);
396 return pRange;
397}
398
399
400/**
401 * Gets the MMIO range for the specified physical address in the current context.
402 *
403 * @returns Pointer to MMIO range.
404 * @returns NULL if address not in a MMIO range.
405 *
406 * @param pIOM IOM instance data.
407 * @param GCPhys Physical address to lookup.
408 */
409inline CTXALLSUFF(PIOMMMIORANGE) iomMMIOGetRange(PIOM pIOM, RTGCPHYS GCPhys)
410{
411 CTXALLSUFF(PIOMMMIORANGE) pRange = (CTXALLSUFF(PIOMMMIORANGE))RTAvlroGCPhysRangeGet(&pIOM->CTXSUFF(pTrees)->CTXALLSUFF(MMIOTree), GCPhys);
412 return pRange;
413}
414
415
416/**
417 * Gets the MMIO range for the specified physical address in the current context.
418 *
419 * @returns Pointer to MMIO range.
420 * @returns NULL if address not in a MMIO range.
421 *
422 * @param pIOM IOM instance data.
423 * @param GCPhys Physical address to lookup.
424 */
425inline PIOMMMIORANGER3 iomMMIOGetRangeHC(PIOM pIOM, RTGCPHYS GCPhys)
426{
427 PIOMMMIORANGER3 pRange = (PIOMMMIORANGER3)RTAvlroGCPhysRangeGet(&pIOM->CTXSUFF(pTrees)->MMIOTreeR3, GCPhys);
428 return pRange;
429}
430
431#ifdef VBOX_WITH_STATISTICS
432/**
433 * Gets the MMIO statistics record.
434 * @returns Pointer to MMIO stats.
435 * @returns NULL if not found.
436 *
437 * @param pIOM IOM instance data.
438 * @param GCPhys Physical address to lookup.
439 */
440inline PIOMMMIOSTATS iomMMIOGetStats(PIOM pIOM, RTGCPHYS GCPhys)
441{
442 PIOMMMIOSTATS pStats = (PIOMMMIOSTATS)RTAvloGCPhysGet(&pIOM->CTXSUFF(pTrees)->MMIOStatTree, GCPhys);
443 return pStats;
444}
445#endif
446
447__END_DECLS
448
449#ifdef IN_RING3
450
451#endif
452
453/** @} */
454
455#endif /* __IOMInternal_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