VirtualBox

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

Last change on this file since 28800 was 28800, checked in by vboxsync, 14 years ago

Automated rebranding to Oracle copyright/license strings via filemuncher

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.7 KB
Line 
1/* $Id: SELMInternal.h 28800 2010-04-27 08:22:32Z vboxsync $ */
2/** @file
3 * SELM - 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 ___SELMInternal_h
19#define ___SELMInternal_h
20
21#include <VBox/cdefs.h>
22#include <VBox/types.h>
23#include <VBox/stam.h>
24#include <VBox/cpum.h>
25
26
27
28/** @defgroup grp_selm_int Internals
29 * @ingroup grp_selm
30 * @internal
31 * @{
32 */
33
34/** The number of GDTS allocated for our GDT. (full size) */
35#define SELM_GDT_ELEMENTS 8192
36
37/** aHyperSel index to retrieve hypervisor selectors */
38/** The Flat CS selector used by the VMM inside the GC. */
39#define SELM_HYPER_SEL_CS 0
40/** The Flat DS selector used by the VMM inside the GC. */
41#define SELM_HYPER_SEL_DS 1
42/** The 64-bit mode CS selector used by the VMM inside the GC. */
43#define SELM_HYPER_SEL_CS64 2
44/** The TSS selector used by the VMM inside the GC. */
45#define SELM_HYPER_SEL_TSS 3
46/** The TSS selector for taking trap 08 (\#DF). */
47#define SELM_HYPER_SEL_TSS_TRAP08 4
48/** Number of GDTs we need for internal use */
49#define SELM_HYPER_SEL_MAX (SELM_HYPER_SEL_TSS_TRAP08 + 1)
50
51
52/** Default GDT selectors we use for the hypervisor. */
53#define SELM_HYPER_DEFAULT_SEL_CS ((SELM_GDT_ELEMENTS - 0x1) << 3)
54#define SELM_HYPER_DEFAULT_SEL_DS ((SELM_GDT_ELEMENTS - 0x2) << 3)
55#define SELM_HYPER_DEFAULT_SEL_CS64 ((SELM_GDT_ELEMENTS - 0x3) << 3)
56#define SELM_HYPER_DEFAULT_SEL_TSS ((SELM_GDT_ELEMENTS - 0x4) << 3)
57#define SELM_HYPER_DEFAULT_SEL_TSS_TRAP08 ((SELM_GDT_ELEMENTS - 0x5) << 3)
58/** The lowest value default we use. */
59#define SELM_HYPER_DEFAULT_BASE SELM_HYPER_DEFAULT_SEL_TSS_TRAP08
60
61/**
62 * Converts a SELM pointer into a VM pointer.
63 * @returns Pointer to the VM structure the SELM is part of.
64 * @param pSELM Pointer to SELM instance data.
65 */
66#define SELM2VM(pSELM) ( (PVM)((char *)pSELM - pSELM->offVM) )
67
68
69
70/**
71 * SELM Data (part of VM)
72 */
73typedef struct SELM
74{
75 /** Offset to the VM structure.
76 * See SELM2VM(). */
77 RTINT offVM;
78
79 /** Flat CS, DS, 64 bit mode CS, TSS & trap 8 TSS. */
80 RTSEL aHyperSel[SELM_HYPER_SEL_MAX];
81
82 /** Pointer to the GCs - R3 Ptr.
83 * This size is governed by SELM_GDT_ELEMENTS. */
84 R3PTRTYPE(PX86DESC) paGdtR3;
85 /** Pointer to the GCs - RC Ptr.
86 * This is not initialized until the first relocation because it's used to
87 * check if the shadow GDT virtual handler requires deregistration. */
88 RCPTRTYPE(PX86DESC) paGdtRC;
89 /** Current (last) Guest's GDTR.
90 * The pGdt member is set to RTRCPTR_MAX if we're not monitoring the guest GDT. */
91 VBOXGDTR GuestGdtr;
92 /** The current (last) effective Guest GDT size. */
93 RTUINT cbEffGuestGdtLimit;
94
95 uint32_t padding0;
96
97 /** R3 pointer to the LDT shadow area in HMA. */
98 R3PTRTYPE(void *) pvLdtR3;
99 /** RC pointer to the LDT shadow area in HMA. */
100 RCPTRTYPE(void *) pvLdtRC;
101#if GC_ARCH_BITS == 64
102 RTRCPTR padding1;
103#endif
104 /** The address of the guest LDT.
105 * RTRCPTR_MAX if not monitored. */
106 RTGCPTR GCPtrGuestLdt;
107 /** Current LDT limit, both Guest and Shadow. */
108 RTUINT cbLdtLimit;
109 /** Current LDT offset relative to pvLdtR3/pvLdtRC. */
110 RTUINT offLdtHyper;
111#if HC_ARCH_BITS == 32 && GC_ARCH_BITS == 64
112 uint32_t padding2[2];
113#endif
114 /** TSS. (This is 16 byte aligned!)
115 * @todo I/O bitmap & interrupt redirection table? */
116 VBOXTSS Tss;
117
118 /** TSS for trap 08 (\#DF). */
119 VBOXTSS TssTrap08;
120
121 /** Monitored shadow TSS address. */
122 RCPTRTYPE(void *) pvMonShwTssRC;
123#if GC_ARCH_BITS == 64
124 RTRCPTR padding3;
125#endif
126 /** GC Pointer to the current Guest's TSS.
127 * RTRCPTR_MAX if not monitored. */
128 RTGCPTR GCPtrGuestTss;
129 /** The size of the guest TSS. */
130 RTUINT cbGuestTss;
131 /** Set if it's a 32-bit TSS. */
132 bool fGuestTss32Bit;
133 /** The size of the Guest's TSS part we're monitoring. */
134 RTUINT cbMonitoredGuestTss;
135 /** The guest TSS selector at last sync (part of monitoring).
136 * Contains RTSEL_MAX if not set. */
137 RTSEL GCSelTss;
138 /** The last known offset of the I/O bitmap.
139 * This is only used if we monitor the bitmap. */
140 uint16_t offGuestIoBitmap;
141
142 /** Indicates that the Guest GDT access handler have been registered. */
143 bool fGDTRangeRegistered;
144
145 /** Indicates whether LDT/GDT/TSS monitoring and syncing is disabled. */
146 bool fDisableMonitoring;
147
148 /** Indicates whether the TSS stack selector & base address need to be refreshed. */
149 bool fSyncTSSRing0Stack;
150 bool fPadding2[1+2];
151
152 /** SELMR3UpdateFromCPUM() profiling. */
153 STAMPROFILE StatUpdateFromCPUM;
154 /** SELMR3SyncTSS() profiling. */
155 STAMPROFILE StatTSSSync;
156
157 /** GC: The number of handled writes to the Guest's GDT. */
158 STAMCOUNTER StatRCWriteGuestGDTHandled;
159 /** GC: The number of unhandled write to the Guest's GDT. */
160 STAMCOUNTER StatRCWriteGuestGDTUnhandled;
161 /** GC: The number of times writes to Guest's LDT was detected. */
162 STAMCOUNTER StatRCWriteGuestLDT;
163 /** GC: The number of handled writes to the Guest's TSS. */
164 STAMCOUNTER StatRCWriteGuestTSSHandled;
165 /** GC: The number of handled writes to the Guest's TSS where we detected a change. */
166 STAMCOUNTER StatRCWriteGuestTSSHandledChanged;
167 /** GC: The number of handled redir writes to the Guest's TSS where we detected a change. */
168 STAMCOUNTER StatRCWriteGuestTSSRedir;
169 /** GC: The number of unhandled writes to the Guest's TSS. */
170 STAMCOUNTER StatRCWriteGuestTSSUnhandled;
171 /** The number of times we had to relocate our hypervisor selectors. */
172 STAMCOUNTER StatHyperSelsChanged;
173 /** The number of times we had find free hypervisor selectors. */
174 STAMCOUNTER StatScanForHyperSels;
175} SELM, *PSELM;
176
177RT_C_DECLS_BEGIN
178
179VMMRCDECL(int) selmRCGuestGDTWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
180VMMRCDECL(int) selmRCGuestLDTWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
181VMMRCDECL(int) selmRCGuestTSSWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
182
183VMMRCDECL(int) selmRCShadowGDTWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
184VMMRCDECL(int) selmRCShadowLDTWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
185VMMRCDECL(int) selmRCShadowTSSWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
186
187void selmSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp);
188
189RT_C_DECLS_END
190
191/** @} */
192
193#endif
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use