VirtualBox

source: vbox/trunk/src/VBox/VMM/include/SELMInternal.h@ 62890

Last change on this file since 62890 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: 10.0 KB
Line 
1/* $Id: SELMInternal.h 62478 2016-07-22 18:29:06Z vboxsync $ */
2/** @file
3 * SELM - 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 ___SELMInternal_h
19#define ___SELMInternal_h
20
21#include <VBox/cdefs.h>
22#include <VBox/types.h>
23#include <VBox/vmm/stam.h>
24#include <VBox/vmm/cpum.h>
25#include <VBox/vmm/pgm.h>
26#include <VBox/log.h>
27#include <iprt/x86.h>
28
29
30
31/** @defgroup grp_selm_int Internals
32 * @ingroup grp_selm
33 * @internal
34 * @{
35 */
36
37/** Enable or disable tracking of Shadow GDT/LDT/TSS.
38 * @{
39 */
40#if defined(VBOX_WITH_RAW_MODE) || defined(DOXYGEN_RUNNING)
41# define SELM_TRACK_SHADOW_GDT_CHANGES
42# define SELM_TRACK_SHADOW_LDT_CHANGES
43# define SELM_TRACK_SHADOW_TSS_CHANGES
44#endif
45/** @} */
46
47/** Enable or disable tracking of Guest GDT/LDT/TSS.
48 * @{
49 */
50#if defined(VBOX_WITH_RAW_MODE) || defined(DOXYGEN_RUNNING)
51# define SELM_TRACK_GUEST_GDT_CHANGES
52# define SELM_TRACK_GUEST_LDT_CHANGES
53# define SELM_TRACK_GUEST_TSS_CHANGES
54#endif
55/** @} */
56
57
58/** The number of GDTS allocated for our GDT. (full size) */
59#define SELM_GDT_ELEMENTS 8192
60
61/** aHyperSel index to retrieve hypervisor selectors */
62/** The Flat CS selector used by the VMM inside the GC. */
63#define SELM_HYPER_SEL_CS 0
64/** The Flat DS selector used by the VMM inside the GC. */
65#define SELM_HYPER_SEL_DS 1
66/** The 64-bit mode CS selector used by the VMM inside the GC. */
67#define SELM_HYPER_SEL_CS64 2
68/** The TSS selector used by the VMM inside the GC. */
69#define SELM_HYPER_SEL_TSS 3
70/** The TSS selector for taking trap 08 (\#DF). */
71#define SELM_HYPER_SEL_TSS_TRAP08 4
72/** Number of GDTs we need for internal use */
73#define SELM_HYPER_SEL_MAX (SELM_HYPER_SEL_TSS_TRAP08 + 1)
74
75
76/** Default GDT selectors we use for the hypervisor. */
77#define SELM_HYPER_DEFAULT_SEL_CS ((SELM_GDT_ELEMENTS - 0x1) << 3)
78#define SELM_HYPER_DEFAULT_SEL_DS ((SELM_GDT_ELEMENTS - 0x2) << 3)
79#define SELM_HYPER_DEFAULT_SEL_CS64 ((SELM_GDT_ELEMENTS - 0x3) << 3)
80#define SELM_HYPER_DEFAULT_SEL_TSS ((SELM_GDT_ELEMENTS - 0x4) << 3)
81#define SELM_HYPER_DEFAULT_SEL_TSS_TRAP08 ((SELM_GDT_ELEMENTS - 0x5) << 3)
82/** The lowest value default we use. */
83#define SELM_HYPER_DEFAULT_BASE SELM_HYPER_DEFAULT_SEL_TSS_TRAP08
84
85/**
86 * Converts a SELM pointer into a VM pointer.
87 * @returns Pointer to the VM structure the SELM is part of.
88 * @param pSELM Pointer to SELM instance data.
89 */
90#define SELM2VM(pSELM) ( (PVM)((char *)pSELM - pSELM->offVM) )
91
92
93
94/**
95 * SELM Data (part of VM)
96 */
97typedef struct SELM
98{
99 /** Offset to the VM structure.
100 * See SELM2VM(). */
101 RTINT offVM;
102
103 /** Flat CS, DS, 64 bit mode CS, TSS & trap 8 TSS. */
104 RTSEL aHyperSel[SELM_HYPER_SEL_MAX];
105
106 /** @name GDT
107 * @{ */
108 /** Shadow GDT virtual write access handler type. */
109 PGMVIRTHANDLERTYPE hShadowGdtWriteHandlerType;
110 /** Guest GDT virtual write access handler type. */
111 PGMVIRTHANDLERTYPE hGuestGdtWriteHandlerType;
112 /** Pointer to the GCs - R3 Ptr.
113 * This size is governed by SELM_GDT_ELEMENTS. */
114 R3PTRTYPE(PX86DESC) paGdtR3;
115 /** Pointer to the GCs - RC Ptr.
116 * This is not initialized until the first relocation because it's used to
117 * check if the shadow GDT virtual handler requires deregistration. */
118 RCPTRTYPE(PX86DESC) paGdtRC;
119 /** Current (last) Guest's GDTR.
120 * The pGdt member is set to RTRCPTR_MAX if we're not monitoring the guest GDT. */
121 VBOXGDTR GuestGdtr;
122 /** The current (last) effective Guest GDT size. */
123 uint32_t cbEffGuestGdtLimit;
124 /** Indicates that the Guest GDT access handler have been registered. */
125 bool fGDTRangeRegistered;
126 /** @} */
127 bool padding0[3];
128
129 /** @name LDT
130 * @{ */
131 /** Shadow LDT virtual write access handler type. */
132 PGMVIRTHANDLERTYPE hShadowLdtWriteHandlerType;
133 /** Guest LDT virtual write access handler type. */
134 PGMVIRTHANDLERTYPE hGuestLdtWriteHandlerType;
135 /** R3 pointer to the LDT shadow area in HMA. */
136 R3PTRTYPE(void *) pvLdtR3;
137 /** RC pointer to the LDT shadow area in HMA. */
138 RCPTRTYPE(void *) pvLdtRC;
139#if GC_ARCH_BITS == 64
140 RTRCPTR padding1;
141#endif
142 /** The address of the guest LDT.
143 * RTRCPTR_MAX if not monitored. */
144 RTGCPTR GCPtrGuestLdt;
145 /** Current LDT limit, both Guest and Shadow. */
146 uint32_t cbLdtLimit;
147 /** Current LDT offset relative to pvLdtR3/pvLdtRC. */
148 uint32_t offLdtHyper;
149#if HC_ARCH_BITS == 32 && GC_ARCH_BITS == 64
150 uint32_t padding2[2];
151#endif
152 /** @} */
153
154 /** @name TSS
155 * @{ */
156 /** TSS. (This is 16 byte aligned!)
157 * @todo I/O bitmap & interrupt redirection table? */
158 VBOXTSS Tss;
159 /** TSS for trap 08 (\#DF). */
160 VBOXTSS TssTrap08;
161 /** Shadow TSS virtual write access handler type. */
162 PGMVIRTHANDLERTYPE hShadowTssWriteHandlerType;
163 /** Guerst TSS virtual write access handler type. */
164 PGMVIRTHANDLERTYPE hGuestTssWriteHandlerType;
165 /** Monitored shadow TSS address. */
166 RCPTRTYPE(void *) pvMonShwTssRC;
167#if GC_ARCH_BITS == 64
168 RTRCPTR padding3;
169#endif
170 /** GC Pointer to the current Guest's TSS.
171 * RTRCPTR_MAX if not monitored. */
172 RTGCPTR GCPtrGuestTss;
173 /** The size of the guest TSS. */
174 uint32_t cbGuestTss;
175 /** Set if it's a 32-bit TSS. */
176 bool fGuestTss32Bit;
177 /** Indicates whether the TSS stack selector & base address need to be refreshed. */
178 bool fSyncTSSRing0Stack;
179 /** The size of the Guest's TSS part we're monitoring. */
180 uint32_t cbMonitoredGuestTss;
181 /** The guest TSS selector at last sync (part of monitoring).
182 * Contains RTSEL_MAX if not set. */
183 RTSEL GCSelTss;
184 /** The last known offset of the I/O bitmap.
185 * This is only used if we monitor the bitmap. */
186 uint16_t offGuestIoBitmap;
187 /** @} */
188 uint16_t padding4[3];
189
190 /** SELMR3UpdateFromCPUM() profiling. */
191 STAMPROFILE StatUpdateFromCPUM;
192 /** SELMR3SyncTSS() profiling. */
193 STAMPROFILE StatTSSSync;
194
195 /** GC: The number of handled writes to the Guest's GDT. */
196 STAMCOUNTER StatRCWriteGuestGDTHandled;
197 /** GC: The number of unhandled write to the Guest's GDT. */
198 STAMCOUNTER StatRCWriteGuestGDTUnhandled;
199 /** GC: The number of times writes to Guest's LDT was detected. */
200 STAMCOUNTER StatRCWriteGuestLDT;
201 /** GC: The number of handled writes to the Guest's TSS. */
202 STAMCOUNTER StatRCWriteGuestTSSHandled;
203 /** GC: The number of handled writes to the Guest's TSS where we detected a change. */
204 STAMCOUNTER StatRCWriteGuestTSSHandledChanged;
205 /** GC: The number of handled redir writes to the Guest's TSS where we detected a change. */
206 STAMCOUNTER StatRCWriteGuestTSSRedir;
207 /** GC: The number of unhandled writes to the Guest's TSS. */
208 STAMCOUNTER StatRCWriteGuestTSSUnhandled;
209 /** The number of times we had to relocate our hypervisor selectors. */
210 STAMCOUNTER StatHyperSelsChanged;
211 /** The number of times we had find free hypervisor selectors. */
212 STAMCOUNTER StatScanForHyperSels;
213 /** Counts the times we detected state selectors in SELMR3UpdateFromCPUM. */
214 STAMCOUNTER aStatDetectedStaleSReg[X86_SREG_COUNT];
215 /** Counts the times we were called with already state selectors in
216 * SELMR3UpdateFromCPUM. */
217 STAMCOUNTER aStatAlreadyStaleSReg[X86_SREG_COUNT];
218 /** Counts the times we found a stale selector becomming valid again. */
219 STAMCOUNTER StatStaleToUnstaleSReg;
220#ifdef VBOX_WITH_STATISTICS
221 /** Times we updated hidden selector registers in CPUMR3UpdateFromCPUM. */
222 STAMCOUNTER aStatUpdatedSReg[X86_SREG_COUNT];
223 STAMCOUNTER StatLoadHidSelGst;
224 STAMCOUNTER StatLoadHidSelShw;
225#endif
226 STAMCOUNTER StatLoadHidSelReadErrors;
227 STAMCOUNTER StatLoadHidSelGstNoGood;
228} SELM, *PSELM;
229
230RT_C_DECLS_BEGIN
231
232PGM_ALL_CB2_DECL(FNPGMVIRTHANDLER) selmGuestGDTWriteHandler;
233DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCGuestGDTWritePfHandler;
234PGM_ALL_CB2_DECL(FNPGMVIRTHANDLER) selmGuestLDTWriteHandler;
235DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCGuestLDTWritePfHandler;
236PGM_ALL_CB2_DECL(FNPGMVIRTHANDLER) selmGuestTSSWriteHandler;
237DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCGuestTSSWritePfHandler;
238DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCShadowGDTWritePfHandler;
239DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCShadowLDTWritePfHandler;
240DECLEXPORT(FNPGMRCVIRTPFHANDLER) selmRCShadowTSSWritePfHandler;
241
242void selmRCSyncGdtSegRegs(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, unsigned iGDTEntry);
243void selmRCGuestGdtPreWriteCheck(PVM pVM, PVMCPU pVCpu, uint32_t offGuestGdt, uint32_t cbWrite, PCPUMCTX pCtx);
244VBOXSTRICTRC selmRCGuestGdtPostWriteCheck(PVM pVM, PVMCPU pVCpu, uint32_t offGuestTss, uint32_t cbWrite, PCPUMCTX pCtx);
245VBOXSTRICTRC selmRCGuestTssPostWriteCheck(PVM pVM, PVMCPU pVCpu, uint32_t offGuestTss, uint32_t cbWrite);
246void selmSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp);
247#ifdef VBOX_WITH_RAW_RING1
248void selmSetRing2Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp);
249#endif
250
251RT_C_DECLS_END
252
253/** @} */
254
255#endif
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