VirtualBox

source: vbox/trunk/src/VBox/VMM/include/REMInternal.h@ 41049

Last change on this file since 41049 was 37702, checked in by vboxsync, 13 years ago

REM/VMM: Don't flush the TLB if you don't hold the EM/REM lock, some other EMT may be executing code in the recompiler and could be really surprised by a TLB flush.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.8 KB
Line 
1/* $Id: REMInternal.h 37702 2011-06-30 10:09:59Z vboxsync $ */
2/** @file
3 * REM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Oracle Corporation
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 ___REMInternal_h
19#define ___REMInternal_h
20
21#include <VBox/types.h>
22#include <VBox/vmm/cpum.h>
23#include <VBox/vmm/stam.h>
24#include <VBox/vmm/pgm.h>
25#include <VBox/vmm/pdmcritsect.h>
26#ifdef REM_INCLUDE_CPU_H
27# include "target-i386/cpu.h"
28#endif
29
30
31
32/** @defgroup grp_rem_int Internals
33 * @ingroup grp_rem
34 * @internal
35 * @{
36 */
37
38/** The saved state version number. */
39#define REM_SAVED_STATE_VERSION_VER1_6 6
40#define REM_SAVED_STATE_VERSION 7
41
42
43/** @def REM_MONITOR_CODE_PAGES
44 * Enable to monitor code pages that have been translated by the recompiler. */
45/** Currently broken and interferes with CSAM monitoring (see #2784) */
46////#define REM_MONITOR_CODE_PAGES
47#ifdef DOXYGEN_RUNNING
48# define REM_MONITOR_CODE_PAGES
49#endif
50
51typedef enum REMHANDLERNOTIFICATIONKIND
52{
53 /** The usual invalid 0 entry. */
54 REMHANDLERNOTIFICATIONKIND_INVALID = 0,
55 /** REMR3NotifyHandlerPhysicalRegister. */
56 REMHANDLERNOTIFICATIONKIND_PHYSICAL_REGISTER,
57 /** REMR3NotifyHandlerPhysicalDeregister. */
58 REMHANDLERNOTIFICATIONKIND_PHYSICAL_DEREGISTER,
59 /** REMR3NotifyHandlerPhysicalModify. */
60 REMHANDLERNOTIFICATIONKIND_PHYSICAL_MODIFY,
61 /** The usual 32-bit hack. */
62 REMHANDLERNOTIFICATIONKIND_32BIT_HACK = 0x7fffffff
63} REMHANDLERNOTIFICATIONKIND;
64
65
66/**
67 * A recorded handler notification.
68 */
69typedef struct REMHANDLERNOTIFICATION
70{
71 /** The notification kind. */
72 REMHANDLERNOTIFICATIONKIND enmKind;
73 uint32_t padding;
74 /** Type specific data. */
75 union
76 {
77 struct
78 {
79 RTGCPHYS GCPhys;
80 RTGCPHYS cb;
81 PGMPHYSHANDLERTYPE enmType;
82 bool fHasHCHandler;
83 } PhysicalRegister;
84
85 struct
86 {
87 RTGCPHYS GCPhys;
88 RTGCPHYS cb;
89 PGMPHYSHANDLERTYPE enmType;
90 bool fHasHCHandler;
91 bool fRestoreAsRAM;
92 } PhysicalDeregister;
93
94 struct
95 {
96 RTGCPHYS GCPhysOld;
97 RTGCPHYS GCPhysNew;
98 RTGCPHYS cb;
99 PGMPHYSHANDLERTYPE enmType;
100 bool fHasHCHandler;
101 bool fRestoreAsRAM;
102 } PhysicalModify;
103 uint64_t padding[5];
104 } u;
105 uint32_t idxSelf;
106 uint32_t volatile idxNext;
107} REMHANDLERNOTIFICATION;
108/** Pointer to a handler notification record. */
109typedef REMHANDLERNOTIFICATION *PREMHANDLERNOTIFICATION;
110
111/**
112 * Converts a REM pointer into a VM pointer.
113 * @returns Pointer to the VM structure the REM is part of.
114 * @param pREM Pointer to REM instance data.
115 */
116#define REM2VM(pREM) ( (PVM)((char*)pREM - pREM->offVM) )
117
118
119/**
120 * REM Data (part of VM)
121 */
122typedef struct REM
123{
124 /** Offset to the VM structure. */
125 RTINT offVM;
126 /** Alignment padding. */
127 RTUINT uPadding0;
128
129 /** Cached pointer of the register context of the current VCPU. */
130 R3PTRTYPE(PCPUMCTX) pCtx;
131
132 /** In REM mode.
133 * I.e. the correct CPU state and some other bits are with REM. */
134 bool volatile fInREM;
135 /** In REMR3State. */
136 bool fInStateSync;
137
138 /** Set when the translation blocks cache need to be flushed. */
139 bool fFlushTBs;
140
141 /** Ignore CR3 load notifications from the REM. */
142 bool fIgnoreCR3Load;
143 /** Ignore invlpg notifications from the REM. */
144 bool fIgnoreInvlPg;
145 /** Ignore CR0, CR4 and EFER load. */
146 bool fIgnoreCpuMode;
147 /** Ignore set page. */
148 bool fIgnoreSetPage;
149 bool bPadding1;
150
151 /** Ignore all that can be ignored. */
152 uint32_t cIgnoreAll;
153
154 /** Number of times REMR3CanExecuteRaw has been called.
155 * It is used to prevent rescheduling on the first call. */
156 uint32_t cCanExecuteRaw;
157
158 /** Pending interrupt (~0 -> nothing). */
159 uint32_t u32PendingInterrupt;
160
161 /** Number of recorded invlpg instructions. */
162 uint32_t volatile cInvalidatedPages;
163#if HC_ARCH_BITS == 32
164 uint32_t uPadding2;
165#endif
166 /** Array of recorded invlpg instruction.
167 * These instructions are replayed when entering REM. */
168 RTGCPTR aGCPtrInvalidatedPages[48];
169
170 /** Array of recorded handler notifications.
171 * These are replayed when entering REM. */
172 REMHANDLERNOTIFICATION aHandlerNotifications[64];
173 volatile uint32_t idxPendingList;
174 volatile uint32_t idxFreeList;
175
176 /** MMIO memory type.
177 * This is used to register MMIO physical access handlers. */
178 int32_t iMMIOMemType;
179 /** Handler memory type.
180 * This is used to register non-MMIO physical access handlers which are executed in HC. */
181 int32_t iHandlerMemType;
182
183 /** Pending exception */
184 uint32_t uPendingException;
185 /** Nr of pending exceptions */
186 uint32_t cPendingExceptions;
187 /** Pending exception's EIP */
188 RTGCPTR uPendingExcptEIP;
189 /** Pending exception's CR2 */
190 RTGCPTR uPendingExcptCR2;
191
192 /** The highest known RAM address. */
193 RTGCPHYS GCPhysLastRam;
194 /** Whether GCPhysLastRam has been fixed (see REMR3Init()). */
195 bool fGCPhysLastRamFixed;
196
197 /** Pending rc. */
198 int32_t rc;
199
200 /** REM critical section.
201 * This protects cpu_register_physical_memory usage
202 */
203 PDMCRITSECT CritSectRegister;
204
205 /** Time spent in QEMU. */
206 STAMPROFILEADV StatsInQEMU;
207 /** Time spent in rawmode.c. */
208 STAMPROFILEADV StatsInRAWEx;
209 /** Time spent switching state. */
210 STAMPROFILE StatsState;
211 /** Time spent switching state back. */
212 STAMPROFILE StatsStateBack;
213
214 /** Padding the CPUX86State structure to 64 byte. */
215 uint32_t abPadding[HC_ARCH_BITS == 32 ? 4 : 4];
216
217# define REM_ENV_SIZE 0xff00
218
219 /** Recompiler CPU state. */
220#ifdef REM_INCLUDE_CPU_H
221 CPUX86State Env;
222#else
223 struct FakeEnv
224 {
225 char achPadding[REM_ENV_SIZE];
226 } Env;
227#endif /* !REM_INCLUDE_CPU_H */
228} REM;
229
230/** Pointer to the REM Data. */
231typedef REM *PREM;
232
233
234#ifdef REM_INCLUDE_CPU_H
235bool remR3CanExecuteRaw(CPUState *env, RTGCPTR eip, unsigned fFlags, int *piException);
236void remR3CSAMCheckEIP(CPUState *env, RTGCPTR GCPtrCode);
237bool remR3GetOpcode(CPUState *env, RTGCPTR GCPtrInstr, uint8_t *pu8Byte);
238bool remR3DisasInstr(CPUState *env, int f32BitCode, char *pszPrefix);
239void remR3FlushPage(CPUState *env, RTGCPTR GCPtr);
240void remR3FlushTLB(CPUState *env, bool fGlobal);
241void remR3ProtectCode(CPUState *env, RTGCPTR GCPtr);
242void remR3ChangeCpuMode(CPUState *env);
243void remR3DmaRun(CPUState *env);
244void remR3TimersRun(CPUState *env);
245int remR3NotifyTrap(CPUState *env, uint32_t uTrap, uint32_t uErrorCode, RTGCPTR pvNextEIP);
246void remR3TrapStat(CPUState *env, uint32_t uTrap);
247void remR3RecordCall(CPUState *env);
248#endif /* REM_INCLUDE_CPU_H */
249void remR3TrapClear(PVM pVM);
250void remR3RaiseRC(PVM pVM, int rc);
251void remR3DumpLnxSyscall(PVMCPU pVCpu);
252void remR3DumpOBsdSyscall(PVMCPU pVCpu);
253
254
255/** @todo r=bird: clean up the RAWEx stats. */
256/* temporary hacks */
257#define RAWEx_ProfileStart(a, b) remR3ProfileStart(b)
258#define RAWEx_ProfileStop(a, b) remR3ProfileStop(b)
259
260
261#ifdef VBOX_WITH_STATISTICS
262
263# define STATS_EMULATE_SINGLE_INSTR 1
264# define STATS_QEMU_COMPILATION 2
265# define STATS_QEMU_RUN_EMULATED_CODE 3
266# define STATS_QEMU_TOTAL 4
267# define STATS_QEMU_RUN_TIMERS 5
268# define STATS_TLB_LOOKUP 6
269# define STATS_IRQ_HANDLING 7
270# define STATS_RAW_CHECK 8
271
272void remR3ProfileStart(int statcode);
273void remR3ProfileStop(int statcode);
274
275#else /* !VBOX_WITH_STATISTICS */
276# define remR3ProfileStart(c) do { } while (0)
277# define remR3ProfileStop(c) do { } while (0)
278#endif /* !VBOX_WITH_STATISTICS */
279
280/** @} */
281
282#endif
283
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