VirtualBox

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

Last change on this file since 19360 was 19278, checked in by vboxsync, 16 years ago

Critical section for REM execution added

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.6 KB
Line 
1/* $Id: EMInternal.h 19278 2009-04-30 15:55:16Z vboxsync $ */
2/** @file
3 * EM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#ifndef ___EMInternal_h
23#define ___EMInternal_h
24
25#include <VBox/cdefs.h>
26#include <VBox/types.h>
27#include <VBox/em.h>
28#include <VBox/stam.h>
29#include <VBox/patm.h>
30#include <VBox/dis.h>
31#include <VBox/pdmcritsect.h>
32#include <iprt/avl.h>
33#include <setjmp.h>
34
35__BEGIN_DECLS
36
37
38/** @defgroup grp_em_int Internal
39 * @ingroup grp_em
40 * @internal
41 * @{
42 */
43
44/** The saved state version. */
45#define EM_SAVED_STATE_VERSION 2
46
47/** Enable for tracing in raw mode.
48 * @remark SvL: debugging help primarily for myself. */
49#define DEBUG_TRACING_ENABLED
50
51/**
52 * Cli node structure
53 */
54typedef struct CLISTAT
55{
56 /** The key is the cli address. */
57 AVLPVNODECORE Core;
58 /** Occurrences. */
59 STAMCOUNTER Counter;
60} CLISTAT, *PCLISTAT;
61
62
63/**
64 * Excessive EM statistics.
65 */
66typedef struct EMSTATS
67{
68 /** GC: Profiling of EMInterpretInstruction(). */
69 STAMPROFILE StatRZEmulate;
70 /** HC: Profiling of EMInterpretInstruction(). */
71 STAMPROFILE StatR3Emulate;
72
73 /** @name Interpreter Instruction statistics.
74 * @{
75 */
76 STAMCOUNTER StatRZInterpretSucceeded;
77 STAMCOUNTER StatR3InterpretSucceeded;
78
79 STAMCOUNTER StatRZAnd;
80 STAMCOUNTER StatR3And;
81 STAMCOUNTER StatRZCpuId;
82 STAMCOUNTER StatR3CpuId;
83 STAMCOUNTER StatRZDec;
84 STAMCOUNTER StatR3Dec;
85 STAMCOUNTER StatRZHlt;
86 STAMCOUNTER StatR3Hlt;
87 STAMCOUNTER StatRZInc;
88 STAMCOUNTER StatR3Inc;
89 STAMCOUNTER StatRZInvlPg;
90 STAMCOUNTER StatR3InvlPg;
91 STAMCOUNTER StatRZIret;
92 STAMCOUNTER StatR3Iret;
93 STAMCOUNTER StatRZLLdt;
94 STAMCOUNTER StatR3LLdt;
95 STAMCOUNTER StatRZLIdt;
96 STAMCOUNTER StatR3LIdt;
97 STAMCOUNTER StatRZLGdt;
98 STAMCOUNTER StatR3LGdt;
99 STAMCOUNTER StatRZMov;
100 STAMCOUNTER StatR3Mov;
101 STAMCOUNTER StatRZMovCRx;
102 STAMCOUNTER StatR3MovCRx;
103 STAMCOUNTER StatRZMovDRx;
104 STAMCOUNTER StatR3MovDRx;
105 STAMCOUNTER StatRZOr;
106 STAMCOUNTER StatR3Or;
107 STAMCOUNTER StatRZPop;
108 STAMCOUNTER StatR3Pop;
109 STAMCOUNTER StatRZSti;
110 STAMCOUNTER StatR3Sti;
111 STAMCOUNTER StatRZXchg;
112 STAMCOUNTER StatR3Xchg;
113 STAMCOUNTER StatRZXor;
114 STAMCOUNTER StatR3Xor;
115 STAMCOUNTER StatRZMonitor;
116 STAMCOUNTER StatR3Monitor;
117 STAMCOUNTER StatRZMWait;
118 STAMCOUNTER StatR3MWait;
119 STAMCOUNTER StatRZAdd;
120 STAMCOUNTER StatR3Add;
121 STAMCOUNTER StatRZSub;
122 STAMCOUNTER StatR3Sub;
123 STAMCOUNTER StatRZAdc;
124 STAMCOUNTER StatR3Adc;
125 STAMCOUNTER StatRZRdtsc;
126 STAMCOUNTER StatR3Rdtsc;
127 STAMCOUNTER StatRZRdpmc;
128 STAMCOUNTER StatR3Rdpmc;
129 STAMCOUNTER StatRZBtr;
130 STAMCOUNTER StatR3Btr;
131 STAMCOUNTER StatRZBts;
132 STAMCOUNTER StatR3Bts;
133 STAMCOUNTER StatRZBtc;
134 STAMCOUNTER StatR3Btc;
135 STAMCOUNTER StatRZCmpXchg;
136 STAMCOUNTER StatR3CmpXchg;
137 STAMCOUNTER StatRZCmpXchg8b;
138 STAMCOUNTER StatR3CmpXchg8b;
139 STAMCOUNTER StatRZXAdd;
140 STAMCOUNTER StatR3XAdd;
141 STAMCOUNTER StatRZClts;
142 STAMCOUNTER StatR3Clts;
143 STAMCOUNTER StatRZStosWD;
144 STAMCOUNTER StatR3StosWD;
145 STAMCOUNTER StatR3Rdmsr;
146 STAMCOUNTER StatR3Wrmsr;
147 STAMCOUNTER StatRZRdmsr;
148 STAMCOUNTER StatRZWrmsr;
149 STAMCOUNTER StatRZWbInvd;
150 STAMCOUNTER StatR3WbInvd;
151 STAMCOUNTER StatRZLmsw;
152 STAMCOUNTER StatR3Lmsw;
153 STAMCOUNTER StatRZSmsw;
154 STAMCOUNTER StatR3Smsw;
155
156 STAMCOUNTER StatRZInterpretFailed;
157 STAMCOUNTER StatR3InterpretFailed;
158
159 STAMCOUNTER StatRZFailedAnd;
160 STAMCOUNTER StatR3FailedAnd;
161 STAMCOUNTER StatRZFailedCpuId;
162 STAMCOUNTER StatR3FailedCpuId;
163 STAMCOUNTER StatRZFailedDec;
164 STAMCOUNTER StatR3FailedDec;
165 STAMCOUNTER StatRZFailedHlt;
166 STAMCOUNTER StatR3FailedHlt;
167 STAMCOUNTER StatRZFailedInc;
168 STAMCOUNTER StatR3FailedInc;
169 STAMCOUNTER StatRZFailedInvlPg;
170 STAMCOUNTER StatR3FailedInvlPg;
171 STAMCOUNTER StatRZFailedIret;
172 STAMCOUNTER StatR3FailedIret;
173 STAMCOUNTER StatRZFailedLLdt;
174 STAMCOUNTER StatR3FailedLLdt;
175 STAMCOUNTER StatRZFailedLGdt;
176 STAMCOUNTER StatR3FailedLGdt;
177 STAMCOUNTER StatRZFailedLIdt;
178 STAMCOUNTER StatR3FailedLIdt;
179 STAMCOUNTER StatRZFailedMisc;
180 STAMCOUNTER StatR3FailedMisc;
181 STAMCOUNTER StatRZFailedMov;
182 STAMCOUNTER StatR3FailedMov;
183 STAMCOUNTER StatRZFailedMovCRx;
184 STAMCOUNTER StatR3FailedMovCRx;
185 STAMCOUNTER StatRZFailedMovDRx;
186 STAMCOUNTER StatR3FailedMovDRx;
187 STAMCOUNTER StatRZFailedOr;
188 STAMCOUNTER StatR3FailedOr;
189 STAMCOUNTER StatRZFailedPop;
190 STAMCOUNTER StatR3FailedPop;
191 STAMCOUNTER StatRZFailedSti;
192 STAMCOUNTER StatR3FailedSti;
193 STAMCOUNTER StatRZFailedXchg;
194 STAMCOUNTER StatR3FailedXchg;
195 STAMCOUNTER StatRZFailedXor;
196 STAMCOUNTER StatR3FailedXor;
197 STAMCOUNTER StatRZFailedMonitor;
198 STAMCOUNTER StatR3FailedMonitor;
199 STAMCOUNTER StatRZFailedMWait;
200 STAMCOUNTER StatR3FailedMWait;
201 STAMCOUNTER StatR3FailedRdmsr;
202 STAMCOUNTER StatR3FailedWrmsr;
203 STAMCOUNTER StatRZFailedRdmsr;
204 STAMCOUNTER StatRZFailedWrmsr;
205 STAMCOUNTER StatRZFailedLmsw;
206 STAMCOUNTER StatR3FailedLmsw;
207 STAMCOUNTER StatRZFailedSmsw;
208 STAMCOUNTER StatR3FailedSmsw;
209
210 STAMCOUNTER StatRZFailedAdd;
211 STAMCOUNTER StatR3FailedAdd;
212 STAMCOUNTER StatRZFailedAdc;
213 STAMCOUNTER StatR3FailedAdc;
214 STAMCOUNTER StatRZFailedBtr;
215 STAMCOUNTER StatR3FailedBtr;
216 STAMCOUNTER StatRZFailedBts;
217 STAMCOUNTER StatR3FailedBts;
218 STAMCOUNTER StatRZFailedBtc;
219 STAMCOUNTER StatR3FailedBtc;
220 STAMCOUNTER StatRZFailedCli;
221 STAMCOUNTER StatR3FailedCli;
222 STAMCOUNTER StatRZFailedCmpXchg;
223 STAMCOUNTER StatR3FailedCmpXchg;
224 STAMCOUNTER StatRZFailedCmpXchg8b;
225 STAMCOUNTER StatR3FailedCmpXchg8b;
226 STAMCOUNTER StatRZFailedXAdd;
227 STAMCOUNTER StatR3FailedXAdd;
228 STAMCOUNTER StatR3FailedMovNTPS;
229 STAMCOUNTER StatRZFailedMovNTPS;
230 STAMCOUNTER StatRZFailedStosWD;
231 STAMCOUNTER StatR3FailedStosWD;
232 STAMCOUNTER StatRZFailedSub;
233 STAMCOUNTER StatR3FailedSub;
234 STAMCOUNTER StatRZFailedWbInvd;
235 STAMCOUNTER StatR3FailedWbInvd;
236 STAMCOUNTER StatRZFailedRdtsc;
237 STAMCOUNTER StatR3FailedRdtsc;
238 STAMCOUNTER StatRZFailedRdpmc;
239 STAMCOUNTER StatR3FailedRdpmc;
240 STAMCOUNTER StatRZFailedClts;
241 STAMCOUNTER StatR3FailedClts;
242
243 STAMCOUNTER StatRZFailedUserMode;
244 STAMCOUNTER StatR3FailedUserMode;
245 STAMCOUNTER StatRZFailedPrefix;
246 STAMCOUNTER StatR3FailedPrefix;
247 /** @} */
248
249 /** @name Privileged Instructions Ending Up In HC.
250 * @{ */
251 STAMCOUNTER StatCli;
252 STAMCOUNTER StatSti;
253 STAMCOUNTER StatIn;
254 STAMCOUNTER StatOut;
255 STAMCOUNTER StatInvlpg;
256 STAMCOUNTER StatHlt;
257 STAMCOUNTER StatMovReadCR[USE_REG_CR4 + 1];
258 STAMCOUNTER StatMovWriteCR[USE_REG_CR4 + 1];
259 STAMCOUNTER StatMovDRx;
260 STAMCOUNTER StatIret;
261 STAMCOUNTER StatMovLgdt;
262 STAMCOUNTER StatMovLldt;
263 STAMCOUNTER StatMovLidt;
264 STAMCOUNTER StatMisc;
265 STAMCOUNTER StatSysEnter;
266 STAMCOUNTER StatSysExit;
267 STAMCOUNTER StatSysCall;
268 STAMCOUNTER StatSysRet;
269 /** @} */
270
271} EMSTATS;
272/** Pointer to the excessive EM statistics. */
273typedef EMSTATS *PEMSTATS;
274
275
276/**
277 * Converts a EM pointer into a VM pointer.
278 * @returns Pointer to the VM structure the EM is part of.
279 * @param pEM Pointer to EM instance data.
280 */
281#define EM2VM(pEM) ( (PVM)((char*)pEM - pEM->offVM) )
282
283/**
284 * EM VM Instance data.
285 * Changes to this must checked against the padding of the cfgm union in VM!
286 */
287typedef struct EM
288{
289 /** Offset to the VM structure.
290 * See EM2VM(). */
291 RTUINT offVM;
292
293 /** Id of the VCPU that last executed code in the recompiler. */
294 VMCPUID idLastRemCpu;
295
296 /** PGM critical section.
297 * This protects recompiler usage
298 */
299 PDMCRITSECT CritSectREM;
300} EM;
301/** Pointer to EM VM instance data. */
302typedef EM *PEM;
303
304
305/**
306 * EM VMCPU Instance data.
307 */
308typedef struct EMCPU
309{
310 /** Offset to the VM structure.
311 * See EMCPU2VM(). */
312 RTUINT offVMCPU;
313
314 /** Execution Manager State. */
315 EMSTATE volatile enmState;
316 /** Force raw-mode execution.
317 * This is used to prevent REM from trying to execute patch code.
318 * The flag is cleared upon entering emR3RawExecute() and updated in certain return paths. */
319 bool fForceRAW;
320
321#ifdef DEBUG_TRACING_ENABLED
322 /** @see DEBUG_TRACING_ENABLED */
323 bool fTracing;
324#endif
325
326 uint8_t u8Padding[GC_ARCH_BITS == 64 ? 6 : 2];
327
328 /** Inhibit interrupts for this instruction. Valid only when VM_FF_INHIBIT_INTERRUPTS is set. */
329 RTGCUINTPTR GCPtrInhibitInterrupts;
330
331
332 /** Pointer to the PATM status structure. (R3 Ptr) */
333 R3PTRTYPE(PPATMGCSTATE) pPatmGCState;
334
335 /** Pointer to the guest CPUM state. (R3 Ptr) */
336 R3PTRTYPE(PCPUMCTX) pCtx;
337
338#if GC_ARCH_BITS == 64
339 RTGCPTR aPadding1;
340#endif
341
342 union
343 {
344 /** Padding used in the other rings.
345 * This must be larger than jmp_buf on any supported platform. */
346 char achPaddingFatalLongJump[HC_ARCH_BITS == 32 ? 176 : 256];
347#ifdef IN_RING3
348 /** Long buffer jump for fatal VM errors.
349 * It will jump to before the outer EM loop is entered. */
350 jmp_buf FatalLongJump;
351#endif
352 } u;
353
354 /** @name Execution profiling.
355 * @{ */
356 STAMPROFILE StatForcedActions;
357 STAMPROFILE StatHalted;
358 STAMPROFILEADV StatHwAccEntry;
359 STAMPROFILE StatHwAccExec;
360 STAMPROFILE StatREMEmu;
361 STAMPROFILE StatREMExec;
362 STAMPROFILE StatREMSync;
363 STAMPROFILEADV StatREMTotal;
364 STAMPROFILE StatRAWExec;
365 STAMPROFILEADV StatRAWEntry;
366 STAMPROFILEADV StatRAWTail;
367 STAMPROFILEADV StatRAWTotal;
368 STAMPROFILEADV StatTotal;
369 /** @} */
370
371 /** R3: Profiling of emR3RawExecuteIOInstruction. */
372 STAMPROFILE StatIOEmu;
373 /** R3: Profiling of emR3RawPrivileged. */
374 STAMPROFILE StatPrivEmu;
375 /** R3: Profiling of emR3RawExecuteInstruction. */
376 STAMPROFILE StatMiscEmu;
377 /** R3: Number of time emR3HwAccExecute is called. */
378 STAMCOUNTER StatHwAccExecuteEntry;
379
380 /** More statistics (R3). */
381 R3PTRTYPE(PEMSTATS) pStatsR3;
382 /** More statistics (R0). */
383 R0PTRTYPE(PEMSTATS) pStatsR0;
384 /** More statistics (RC). */
385 RCPTRTYPE(PEMSTATS) pStatsRC;
386#if HC_ARCH_BITS == 64
387 RTRCPTR padding0;
388#endif
389
390 /** Tree for keeping track of cli occurances (debug only). */
391 R3PTRTYPE(PAVLPVNODECORE) pCliStatTree;
392 STAMCOUNTER StatTotalClis;
393#if 0
394 /** 64-bit Visual C++ rounds the struct size up to 16 byte. */
395 uint64_t padding1;
396#endif
397} EMCPU;
398/** Pointer to EM VM instance data. */
399typedef EMCPU *PEMCPU;
400
401/** @} */
402
403__END_DECLS
404
405#endif
406
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