VirtualBox

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

Last change on this file since 67837 was 62478, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.8 KB
Line 
1/* $Id: REMInternal.h 62478 2016-07-22 18:29:06Z vboxsync $ */
2/** @file
3 * REM - Internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2016 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 @bugref{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 PGMPHYSHANDLERKIND enmKind;
82 bool fHasHCHandler;
83 } PhysicalRegister;
84
85 struct
86 {
87 RTGCPHYS GCPhys;
88 RTGCPHYS cb;
89 PGMPHYSHANDLERKIND enmKind;
90 bool fHasHCHandler;
91 bool fRestoreAsRAM;
92 } PhysicalDeregister;
93
94 struct
95 {
96 RTGCPHYS GCPhysOld;
97 RTGCPHYS GCPhysNew;
98 RTGCPHYS cb;
99 PGMPHYSHANDLERKIND enmKind;
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 that remR3LoadDone will assert with TRPM. */
159 uint32_t uStateLoadPendingInterrupt;
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);
237# ifdef VBOX_WITH_RAW_MODE
238bool remR3GetOpcode(CPUState *env, RTGCPTR GCPtrInstr, uint8_t *pu8Byte);
239# endif
240bool remR3DisasInstr(CPUState *env, int f32BitCode, char *pszPrefix);
241void remR3FlushPage(CPUState *env, RTGCPTR GCPtr);
242void remR3FlushTLB(CPUState *env, bool fGlobal);
243void remR3ProtectCode(CPUState *env, RTGCPTR GCPtr);
244void remR3ChangeCpuMode(CPUState *env);
245void remR3DmaRun(CPUState *env);
246void remR3TimersRun(CPUState *env);
247int remR3NotifyTrap(CPUState *env, uint32_t uTrap, uint32_t uErrorCode, RTGCPTR pvNextEIP);
248void remR3TrapStat(CPUState *env, uint32_t uTrap);
249void remR3RecordCall(CPUState *env);
250#endif /* REM_INCLUDE_CPU_H */
251void remR3TrapClear(PVM pVM);
252void remR3RaiseRC(PVM pVM, int rc);
253void remR3DumpLnxSyscall(PVMCPU pVCpu);
254void remR3DumpOBsdSyscall(PVMCPU pVCpu);
255
256
257/** @todo r=bird: clean up the RAWEx stats. */
258/* temporary hacks */
259#define RAWEx_ProfileStart(a, b) remR3ProfileStart(b)
260#define RAWEx_ProfileStop(a, b) remR3ProfileStop(b)
261
262
263#ifdef VBOX_WITH_STATISTICS
264
265# define STATS_EMULATE_SINGLE_INSTR 1
266# define STATS_QEMU_COMPILATION 2
267# define STATS_QEMU_RUN_EMULATED_CODE 3
268# define STATS_QEMU_TOTAL 4
269# define STATS_QEMU_RUN_TIMERS 5
270# define STATS_TLB_LOOKUP 6
271# define STATS_IRQ_HANDLING 7
272# define STATS_RAW_CHECK 8
273
274void remR3ProfileStart(int statcode);
275void remR3ProfileStop(int statcode);
276
277#else /* !VBOX_WITH_STATISTICS */
278# define remR3ProfileStart(c) do { } while (0)
279# define remR3ProfileStop(c) do { } while (0)
280#endif /* !VBOX_WITH_STATISTICS */
281
282/** @} */
283
284#endif
285
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