VirtualBox

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

Last change on this file since 20364 was 19870, checked in by vboxsync, 16 years ago

Save current EMT state to the saved state. Important for restoring VCPUs, that are in the wait for sipi state.

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