VirtualBox

source: vbox/trunk/src/VBox/VMM/EMInternal.h@ 7954

Last change on this file since 7954 was 7286, checked in by vboxsync, 17 years ago

emulate [lock] xadd in GC

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.4 KB
Line 
1/* $Id: EMInternal.h 7286 2008-03-05 08:06:41Z vboxsync $ */
2/** @file
3 * EM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek 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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___EMInternal_h
19#define ___EMInternal_h
20
21#include <VBox/cdefs.h>
22#include <VBox/types.h>
23#include <VBox/em.h>
24#include <VBox/stam.h>
25#include <VBox/patm.h>
26#include <VBox/dis.h>
27#include <iprt/avl.h>
28#include <setjmp.h>
29
30__BEGIN_DECLS
31
32
33/** @defgroup grp_em_int Internal
34 * @ingroup grp_em
35 * @internal
36 * @{
37 */
38
39/** The saved state version. */
40#define EM_SAVED_STATE_VERSION 2
41
42/** Enable for tracing in raw mode.
43 * @remark SvL: debugging help primarily for myself. */
44#define DEBUG_TRACING_ENABLED
45
46/**
47 * Converts a EM pointer into a VM pointer.
48 * @returns Pointer to the VM structure the EM is part of.
49 * @param pEM Pointer to EM instance data.
50 */
51#define EM2VM(pEM) ( (PVM)((char*)pEM - pEM->offVM) )
52
53/**
54 * Cli node structure
55 */
56typedef struct CLISTAT
57{
58 /** The key is the cli address. */
59 AVLPVNODECORE Core;
60 /** Occurrences. */
61 STAMCOUNTER Counter;
62} CLISTAT, *PCLISTAT;
63
64
65/**
66 * Excessive EM statistics.
67 */
68typedef struct EMSTATS
69{
70 /** GC: Profiling of EMInterpretInstruction(). */
71 STAMPROFILE StatGCEmulate;
72 /** HC: Profiling of EMInterpretInstruction(). */
73 STAMPROFILE StatHCEmulate;
74
75 /** @name Interpreter Instruction statistics.
76 * @{
77 */
78 STAMCOUNTER StatGCInterpretSucceeded;
79 STAMCOUNTER StatHCInterpretSucceeded;
80
81 STAMCOUNTER StatGCAnd;
82 STAMCOUNTER StatHCAnd;
83 STAMCOUNTER StatGCCpuId;
84 STAMCOUNTER StatHCCpuId;
85 STAMCOUNTER StatGCDec;
86 STAMCOUNTER StatHCDec;
87 STAMCOUNTER StatGCHlt;
88 STAMCOUNTER StatHCHlt;
89 STAMCOUNTER StatGCInc;
90 STAMCOUNTER StatHCInc;
91 STAMCOUNTER StatGCInvlPg;
92 STAMCOUNTER StatHCInvlPg;
93 STAMCOUNTER StatGCIret;
94 STAMCOUNTER StatHCIret;
95 STAMCOUNTER StatGCLLdt;
96 STAMCOUNTER StatHCLLdt;
97 STAMCOUNTER StatGCMov;
98 STAMCOUNTER StatHCMov;
99 STAMCOUNTER StatGCMovCRx;
100 STAMCOUNTER StatHCMovCRx;
101 STAMCOUNTER StatGCMovDRx;
102 STAMCOUNTER StatHCMovDRx;
103 STAMCOUNTER StatGCOr;
104 STAMCOUNTER StatHCOr;
105 STAMCOUNTER StatGCPop;
106 STAMCOUNTER StatHCPop;
107 STAMCOUNTER StatGCSti;
108 STAMCOUNTER StatHCSti;
109 STAMCOUNTER StatGCXchg;
110 STAMCOUNTER StatHCXchg;
111 STAMCOUNTER StatGCXor;
112 STAMCOUNTER StatHCXor;
113 STAMCOUNTER StatGCMonitor;
114 STAMCOUNTER StatHCMonitor;
115 STAMCOUNTER StatGCMWait;
116 STAMCOUNTER StatHCMWait;
117 STAMCOUNTER StatGCAdd;
118 STAMCOUNTER StatHCAdd;
119 STAMCOUNTER StatGCSub;
120 STAMCOUNTER StatHCSub;
121 STAMCOUNTER StatGCAdc;
122 STAMCOUNTER StatHCAdc;
123 STAMCOUNTER StatGCRdtsc;
124 STAMCOUNTER StatHCRdtsc;
125 STAMCOUNTER StatGCBtr;
126 STAMCOUNTER StatHCBtr;
127 STAMCOUNTER StatGCBts;
128 STAMCOUNTER StatHCBts;
129 STAMCOUNTER StatGCBtc;
130 STAMCOUNTER StatHCBtc;
131 STAMCOUNTER StatGCCmpXchg;
132 STAMCOUNTER StatHCCmpXchg;
133 STAMCOUNTER StatGCXAdd;
134 STAMCOUNTER StatHCXAdd;
135 STAMCOUNTER StatGCClts;
136 STAMCOUNTER StatHCClts;
137
138 STAMCOUNTER StatGCInterpretFailed;
139 STAMCOUNTER StatHCInterpretFailed;
140
141 STAMCOUNTER StatGCFailedAnd;
142 STAMCOUNTER StatHCFailedAnd;
143 STAMCOUNTER StatGCFailedCpuId;
144 STAMCOUNTER StatHCFailedCpuId;
145 STAMCOUNTER StatGCFailedDec;
146 STAMCOUNTER StatHCFailedDec;
147 STAMCOUNTER StatGCFailedHlt;
148 STAMCOUNTER StatHCFailedHlt;
149 STAMCOUNTER StatGCFailedInc;
150 STAMCOUNTER StatHCFailedInc;
151 STAMCOUNTER StatGCFailedInvlPg;
152 STAMCOUNTER StatHCFailedInvlPg;
153 STAMCOUNTER StatGCFailedIret;
154 STAMCOUNTER StatHCFailedIret;
155 STAMCOUNTER StatGCFailedLLdt;
156 STAMCOUNTER StatHCFailedLLdt;
157 STAMCOUNTER StatGCFailedMisc;
158 STAMCOUNTER StatHCFailedMisc;
159 STAMCOUNTER StatGCFailedMov;
160 STAMCOUNTER StatHCFailedMov;
161 STAMCOUNTER StatGCFailedMovCRx;
162 STAMCOUNTER StatHCFailedMovCRx;
163 STAMCOUNTER StatGCFailedMovDRx;
164 STAMCOUNTER StatHCFailedMovDRx;
165 STAMCOUNTER StatGCFailedOr;
166 STAMCOUNTER StatHCFailedOr;
167 STAMCOUNTER StatGCFailedPop;
168 STAMCOUNTER StatHCFailedPop;
169 STAMCOUNTER StatGCFailedSti;
170 STAMCOUNTER StatHCFailedSti;
171 STAMCOUNTER StatGCFailedXchg;
172 STAMCOUNTER StatHCFailedXchg;
173 STAMCOUNTER StatGCFailedXor;
174 STAMCOUNTER StatHCFailedXor;
175 STAMCOUNTER StatGCFailedMonitor;
176 STAMCOUNTER StatHCFailedMonitor;
177 STAMCOUNTER StatGCFailedMWait;
178 STAMCOUNTER StatHCFailedMWait;
179
180 STAMCOUNTER StatGCFailedAdd;
181 STAMCOUNTER StatHCFailedAdd;
182 STAMCOUNTER StatGCFailedAdc;
183 STAMCOUNTER StatHCFailedAdc;
184 STAMCOUNTER StatGCFailedBtr;
185 STAMCOUNTER StatHCFailedBtr;
186 STAMCOUNTER StatGCFailedBts;
187 STAMCOUNTER StatHCFailedBts;
188 STAMCOUNTER StatGCFailedBtc;
189 STAMCOUNTER StatHCFailedBtc;
190 STAMCOUNTER StatGCFailedCli;
191 STAMCOUNTER StatHCFailedCli;
192 STAMCOUNTER StatGCFailedCmpXchg;
193 STAMCOUNTER StatHCFailedCmpXchg;
194 STAMCOUNTER StatGCFailedXAdd;
195 STAMCOUNTER StatHCFailedXAdd;
196 STAMCOUNTER StatHCFailedMovNTPS;
197 STAMCOUNTER StatGCFailedMovNTPS;
198 STAMCOUNTER StatGCFailedStosWD;
199 STAMCOUNTER StatHCFailedStosWD;
200 STAMCOUNTER StatGCFailedSub;
201 STAMCOUNTER StatHCFailedSub;
202 STAMCOUNTER StatGCFailedWbInvd;
203 STAMCOUNTER StatHCFailedWbInvd;
204 STAMCOUNTER StatGCFailedRdtsc;
205 STAMCOUNTER StatHCFailedRdtsc;
206 STAMCOUNTER StatGCFailedClts;
207 STAMCOUNTER StatHCFailedClts;
208
209 STAMCOUNTER StatGCFailedUserMode;
210 STAMCOUNTER StatHCFailedUserMode;
211 STAMCOUNTER StatGCFailedPrefix;
212 STAMCOUNTER StatHCFailedPrefix;
213 /** @} */
214
215 /** @name Privileged Instructions Ending Up In HC.
216 * @{ */
217 STAMCOUNTER StatCli;
218 STAMCOUNTER StatSti;
219 STAMCOUNTER StatIn;
220 STAMCOUNTER StatOut;
221 STAMCOUNTER StatInvlpg;
222 STAMCOUNTER StatHlt;
223 STAMCOUNTER StatMovReadCR[USE_REG_CR4 + 1];
224 STAMCOUNTER StatMovWriteCR[USE_REG_CR4 + 1];
225 STAMCOUNTER StatMovDRx;
226 STAMCOUNTER StatIret;
227 STAMCOUNTER StatMovLgdt;
228 STAMCOUNTER StatMovLldt;
229 STAMCOUNTER StatMovLidt;
230 STAMCOUNTER StatMisc;
231 STAMCOUNTER StatSysEnter;
232 STAMCOUNTER StatSysExit;
233 STAMCOUNTER StatSysCall;
234 STAMCOUNTER StatSysRet;
235 /** @} */
236
237} EMSTATS, *PEMSTATS;
238
239/**
240 * EM VM Instance data.
241 * Changes to this must checked against the padding of the cfgm union in VM!
242 */
243typedef struct EM
244{
245 /** Offset to the VM structure.
246 * See EM2VM(). */
247 RTUINT offVM;
248
249 /** Execution Manager State. */
250 volatile EMSTATE enmState;
251 /** Force raw-mode execution.
252 * This is used to prevent REM from trying to execute patch code.
253 * The flag is cleared upon entering emR3RawExecute() and updated in certain return paths. */
254 bool fForceRAW;
255
256#ifdef DEBUG_TRACING_ENABLED
257 /** @see DEBUG_TRACING_ENABLED */
258 bool fTracing;
259#endif
260
261 /** Inhibit interrupts for this instruction. Valid only when VM_FF_INHIBIT_INTERRUPTS is set. */
262 RTGCUINTPTR GCPtrInhibitInterrupts;
263
264
265 /** Pointer to the PATM status structure. (HC Ptr) */
266 R3R0PTRTYPE(PPATMGCSTATE) pPatmGCState;
267
268 /** Pointer to the guest CPUM state. (HC Ptr) */
269 R3R0PTRTYPE(PCPUMCTX) pCtx;
270
271
272 union
273 {
274 /** Padding used in the other rings.
275 * This must be larger than jmp_buf on any supported platform. */
276 char achPaddingFatalLongJump[HC_ARCH_BITS == 32 ? 176 : 256];
277#ifdef IN_RING3
278 /** Long buffer jump for fatal VM errors.
279 * It will jump to before the outer EM loop is entered. */
280 jmp_buf FatalLongJump;
281#endif
282 } u;
283
284 /** @name Execution profiling.
285 * @{ */
286 STAMPROFILE StatForcedActions;
287 STAMPROFILE StatHalted;
288 STAMPROFILEADV StatHwAccEntry;
289 STAMPROFILE StatHwAccExec;
290 STAMPROFILE StatREMEmu;
291 STAMPROFILE StatREMExec;
292 STAMPROFILE StatREMSync;
293 STAMPROFILEADV StatREMTotal;
294 STAMPROFILE StatRAWExec;
295 STAMPROFILEADV StatRAWEntry;
296 STAMPROFILEADV StatRAWTail;
297 STAMPROFILEADV StatRAWTotal;
298 STAMPROFILEADV StatTotal;
299 /** @} */
300
301 /** HC: Profiling of emR3RawExecuteIOInstruction. */
302 STAMPROFILE StatIOEmu;
303 /** HC: Profiling of emR3RawPrivileged. */
304 STAMPROFILE StatPrivEmu;
305 /** HC: Profiling of emR3RawExecuteInstruction. */
306 STAMPROFILE StatMiscEmu;
307
308 /** @todo r=bird: Are any of these actually used? */
309 STAMCOUNTER StatPatchTrap;
310 STAMCOUNTER StatPatchInt3;
311 STAMCOUNTER StatPatchIF0;
312 STAMCOUNTER StatPatchEmulate;
313 STAMCOUNTER StatPageOutOfSync;
314 STAMCOUNTER StatHwAccExecuteEntry;
315
316 /** More statistics (HC). */
317 R3R0PTRTYPE(PEMSTATS) pStatsHC;
318 /** More statistics (GC). */
319 GCPTRTYPE(PEMSTATS) pStatsGC;
320#if HC_ARCH_BITS != GC_ARCH_BITS && GC_ARCH_BITS == 32
321 RTGCPTR padding0;
322#endif
323
324 /** Tree for keeping track of cli occurances (debug only). */
325 R3PTRTYPE(PAVLPVNODECORE) pCliStatTree;
326 STAMCOUNTER StatTotalClis;
327#if 0
328 /** 64-bit Visual C++ rounds the struct size up to 16 byte. */
329 uint64_t padding1;
330#endif
331
332} EM;
333/** Pointer to EM VM instance data. */
334typedef EM *PEM;
335
336
337
338/** @} */
339
340__END_DECLS
341
342#endif
343
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