VirtualBox

source: vbox/trunk/src/VBox/VMM/CPUMInternal.h@ 20961

Last change on this file since 20961 was 20374, checked in by vboxsync, 15 years ago

*: s/RT_\(BEGIN|END\)_DECLS/RT_C_DECLS_\1/g

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.5 KB
Line 
1/* $Id: CPUMInternal.h 20374 2009-06-08 00:43:21Z vboxsync $ */
2/** @file
3 * CPUM - 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 ___CPUMInternal_h
23#define ___CPUMInternal_h
24
25#include <VBox/cdefs.h>
26#include <VBox/types.h>
27#include <VBox/x86.h>
28
29
30
31/** @defgroup grp_cpum_int Internals
32 * @ingroup grp_cpum
33 * @internal
34 * @{
35 */
36
37/** Flags and types for CPUM fault handlers
38 * @{ */
39/** Type: Load DS */
40#define CPUM_HANDLER_DS 1
41/** Type: Load ES */
42#define CPUM_HANDLER_ES 2
43/** Type: Load FS */
44#define CPUM_HANDLER_FS 3
45/** Type: Load GS */
46#define CPUM_HANDLER_GS 4
47/** Type: IRET */
48#define CPUM_HANDLER_IRET 5
49/** Type mask. */
50#define CPUM_HANDLER_TYPEMASK 0xff
51/** If set EBP points to the CPUMCTXCORE that's being used. */
52#define CPUM_HANDLER_CTXCORE_IN_EBP RT_BIT(31)
53/** @} */
54
55
56/** Use flags (CPUM::fUseFlags).
57 * (Don't forget to sync this with CPUMInternal.mac!)
58 * @{ */
59/** Used the FPU, SSE or such stuff. */
60#define CPUM_USED_FPU RT_BIT(0)
61/** Used the FPU, SSE or such stuff since last we were in REM.
62 * REM syncing is clearing this, lazy FPU is setting it. */
63#define CPUM_USED_FPU_SINCE_REM RT_BIT(1)
64/** Host OS is using SYSENTER and we must NULL the CS. */
65#define CPUM_USE_SYSENTER RT_BIT(2)
66/** Host OS is using SYSENTER and we must NULL the CS. */
67#define CPUM_USE_SYSCALL RT_BIT(3)
68/** Debug registers are used by host and must be disabled. */
69#define CPUM_USE_DEBUG_REGS_HOST RT_BIT(4)
70/** Enabled use of debug registers in guest context. */
71#define CPUM_USE_DEBUG_REGS RT_BIT(5)
72/** The XMM state was manually restored. (AMD only) */
73#define CPUM_MANUAL_XMM_RESTORE RT_BIT(6)
74/** Sync the FPU state on entry (32->64 switcher only). */
75#define CPUM_SYNC_FPU_STATE RT_BIT(7)
76/** Sync the debug state on entry (32->64 switcher only). */
77#define CPUM_SYNC_DEBUG_STATE RT_BIT(8)
78/** @} */
79
80/* Sanity check. */
81#if defined(VBOX_WITH_HYBRID_32BIT_KERNEL) && (HC_ARCH_BITS != 32 || R0_ARCH_BITS != 32)
82# error "VBOX_WITH_HYBRID_32BIT_KERNEL is only for 32 bit builds."
83#endif
84
85
86/**
87 * The saved host CPU state.
88 *
89 * @remark The special VBOX_WITH_HYBRID_32BIT_KERNEL checks here are for the 10.4.x series
90 * of Mac OS X where the OS is essentially 32-bit but the cpu mode can be 64-bit.
91 */
92typedef struct CPUMHOSTCTX
93{
94 /** FPU state. (16-byte alignment)
95 * @remark On x86, the format isn't necessarily X86FXSTATE (not important). */
96 X86FXSTATE fpu;
97
98 /** General purpose register, selectors, flags and more
99 * @{ */
100#if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
101 /** General purpose register ++
102 * { */
103 //uint64_t rax; - scratch
104 uint64_t rbx;
105 //uint64_t rcx; - scratch
106 //uint64_t rdx; - scratch
107 uint64_t rdi;
108 uint64_t rsi;
109 uint64_t rbp;
110 uint64_t rsp;
111 //uint64_t r8; - scratch
112 //uint64_t r9; - scratch
113 uint64_t r10;
114 uint64_t r11;
115 uint64_t r12;
116 uint64_t r13;
117 uint64_t r14;
118 uint64_t r15;
119 //uint64_t rip; - scratch
120 uint64_t rflags;
121#endif
122
123#if HC_ARCH_BITS == 32
124 //uint32_t eax; - scratch
125 uint32_t ebx;
126 //uint32_t ecx; - scratch
127 //uint32_t edx; - scratch
128 uint32_t edi;
129 uint32_t esi;
130 uint32_t ebp;
131 X86EFLAGS eflags;
132 //uint32_t eip; - scratch
133 /* lss pair! */
134 uint32_t esp;
135#endif
136 /** @} */
137
138 /** Selector registers
139 * @{ */
140 RTSEL ss;
141 RTSEL ssPadding;
142 RTSEL gs;
143 RTSEL gsPadding;
144 RTSEL fs;
145 RTSEL fsPadding;
146 RTSEL es;
147 RTSEL esPadding;
148 RTSEL ds;
149 RTSEL dsPadding;
150 RTSEL cs;
151 RTSEL csPadding;
152 /** @} */
153
154#if HC_ARCH_BITS == 32 && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
155 /** Control registers.
156 * @{ */
157 uint32_t cr0;
158 //uint32_t cr2; - scratch
159 uint32_t cr3;
160 uint32_t cr4;
161 /** @} */
162
163 /** Debug registers.
164 * @{ */
165 uint32_t dr0;
166 uint32_t dr1;
167 uint32_t dr2;
168 uint32_t dr3;
169 uint32_t dr6;
170 uint32_t dr7;
171 /** @} */
172
173 /** Global Descriptor Table register. */
174 X86XDTR32 gdtr;
175 uint16_t gdtrPadding;
176 /** Interrupt Descriptor Table register. */
177 X86XDTR32 idtr;
178 uint16_t idtrPadding;
179 /** The task register. */
180 RTSEL ldtr;
181 RTSEL ldtrPadding;
182 /** The task register. */
183 RTSEL tr;
184 RTSEL trPadding;
185 uint32_t SysEnterPadding;
186
187 /** The sysenter msr registers.
188 * This member is not used by the hypervisor context. */
189 CPUMSYSENTER SysEnter;
190
191 /** MSRs
192 * @{ */
193 uint64_t efer;
194 /** @} */
195
196 /* padding to get 64byte aligned size */
197 uint8_t auPadding[16+32];
198
199#elif HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
200
201 /** Control registers.
202 * @{ */
203 uint64_t cr0;
204 //uint64_t cr2; - scratch
205 uint64_t cr3;
206 uint64_t cr4;
207 uint64_t cr8;
208 /** @} */
209
210 /** Debug registers.
211 * @{ */
212 uint64_t dr0;
213 uint64_t dr1;
214 uint64_t dr2;
215 uint64_t dr3;
216 uint64_t dr6;
217 uint64_t dr7;
218 /** @} */
219
220 /** Global Descriptor Table register. */
221 X86XDTR64 gdtr;
222 uint16_t gdtrPadding;
223 /** Interrupt Descriptor Table register. */
224 X86XDTR64 idtr;
225 uint16_t idtrPadding;
226 /** The task register. */
227 RTSEL ldtr;
228 RTSEL ldtrPadding;
229 /** The task register. */
230 RTSEL tr;
231 RTSEL trPadding;
232
233 /** MSRs
234 * @{ */
235 CPUMSYSENTER SysEnter;
236 uint64_t FSbase;
237 uint64_t GSbase;
238 uint64_t efer;
239 /** @} */
240
241 /* padding to get 32byte aligned size */
242# ifdef VBOX_WITH_HYBRID_32BIT_KERNEL
243 uint8_t auPadding[16];
244# else
245 uint8_t auPadding[8+32];
246# endif
247
248#else
249# error HC_ARCH_BITS not defined
250#endif
251} CPUMHOSTCTX;
252/** Pointer to the saved host CPU state. */
253typedef CPUMHOSTCTX *PCPUMHOSTCTX;
254
255
256/**
257 * CPUM Data (part of VM)
258 */
259typedef struct CPUM
260{
261 /* Offset from CPUM to CPUMCPU for the first CPU. */
262 uint32_t ulOffCPUMCPU;
263
264 /** Use flags.
265 * These flags indicates which CPU features the host uses.
266 */
267 uint32_t fHostUseFlags;
268
269 /** Host CPU Features - ECX */
270 struct
271 {
272 /** edx part */
273 X86CPUIDFEATEDX edx;
274 /** ecx part */
275 X86CPUIDFEATECX ecx;
276 } CPUFeatures;
277 /** Host extended CPU features. */
278 struct
279 {
280 /** edx part */
281 uint32_t edx;
282 /** ecx part */
283 uint32_t ecx;
284 } CPUFeaturesExt;
285
286 /* CPU manufacturer. */
287 CPUMCPUVENDOR enmCPUVendor;
288
289 /** CR4 mask */
290 struct
291 {
292 uint32_t AndMask;
293 uint32_t OrMask;
294 } CR4;
295
296 /** Have we entered rawmode? */
297 bool fRawEntered;
298 uint8_t abPadding[3 + (HC_ARCH_BITS == 64) * 4];
299
300 /** The standard set of CpuId leafs. */
301 CPUMCPUID aGuestCpuIdStd[6];
302 /** The extended set of CpuId leafs. */
303 CPUMCPUID aGuestCpuIdExt[10];
304 /** The centaur set of CpuId leafs. */
305 CPUMCPUID aGuestCpuIdCentaur[4];
306 /** The default set of CpuId leafs. */
307 CPUMCPUID GuestCpuIdDef;
308
309 /** Align the next member, and thereby the structure, on a 64-byte boundrary. */
310 uint8_t abPadding2[HC_ARCH_BITS == 32 ? 8 : 4];
311
312 /**
313 * Guest context on raw mode entry.
314 * This a debug feature, see CPUMR3SaveEntryCtx.
315 */
316 CPUMCTX GuestEntry;
317} CPUM;
318/** Pointer to the CPUM instance data residing in the shared VM structure. */
319typedef CPUM *PCPUM;
320
321/**
322 * CPUM Data (part of VMCPU)
323 */
324typedef struct CPUMCPU
325{
326 /**
327 * Hypervisor context.
328 * Aligned on a 64-byte boundrary.
329 */
330 CPUMCTX Hyper;
331
332 /**
333 * Saved host context. Only valid while inside GC.
334 * Aligned on a 64-byte boundrary.
335 */
336 CPUMHOSTCTX Host;
337
338#ifdef VBOX_WITH_CRASHDUMP_MAGIC
339 uint8_t aMagic[56];
340 uint64_t uMagic;
341#endif
342
343 /**
344 * Guest context.
345 * Aligned on a 64-byte boundrary.
346 */
347 CPUMCTX Guest;
348
349 /**
350 * Guest context - misc MSRs
351 * Aligned on a 64-byte boundrary.
352 */
353 CPUMCTXMSR GuestMsr;
354
355 /** Pointer to the current hypervisor core context - R3Ptr. */
356 R3PTRTYPE(PCPUMCTXCORE) pHyperCoreR3;
357 /** Pointer to the current hypervisor core context - R0Ptr. */
358 R0PTRTYPE(PCPUMCTXCORE) pHyperCoreR0;
359 /** Pointer to the current hypervisor core context - RCPtr. */
360 RCPTRTYPE(PCPUMCTXCORE) pHyperCoreRC;
361
362 /** Use flags.
363 * These flags indicates both what is to be used and what has been used.
364 */
365 uint32_t fUseFlags;
366
367 /** Changed flags.
368 * These flags indicates to REM (and others) which important guest
369 * registers which has been changed since last time the flags were cleared.
370 * See the CPUM_CHANGED_* defines for what we keep track of.
371 */
372 uint32_t fChanged;
373
374 /* Offset to CPUM. (subtract from the pointer to get to CPUM) */
375 uint32_t ulOffCPUM;
376
377 /* Temporary storage for the return code of the function called in the 32-64 switcher. */
378 uint32_t u32RetCode;
379
380 /** Align the next member, and thereby the structure, on a 64-byte boundrary. */
381 uint8_t abPadding2[HC_ARCH_BITS == 32 ? 36 : 28];
382} CPUMCPU, *PCPUMCPU;
383/** Pointer to the CPUMCPU instance data residing in the shared VMCPU structure. */
384typedef CPUMCPU *PCPUMCPU;
385
386RT_C_DECLS_BEGIN
387
388DECLASM(int) cpumHandleLazyFPUAsm(PCPUMCPU pCPUM);
389
390#ifdef IN_RING0
391DECLASM(int) cpumR0SaveHostRestoreGuestFPUState(PCPUMCPU pCPUM);
392DECLASM(int) cpumR0SaveGuestRestoreHostFPUState(PCPUMCPU pCPUM);
393DECLASM(int) cpumR0SaveHostFPUState(PCPUMCPU pCPUM);
394DECLASM(int) cpumR0RestoreHostFPUState(PCPUMCPU pCPUM);
395DECLASM(void) cpumR0LoadFPU(PCPUMCTX pCtx);
396DECLASM(void) cpumR0SaveFPU(PCPUMCTX pCtx);
397DECLASM(void) cpumR0LoadXMM(PCPUMCTX pCtx);
398DECLASM(void) cpumR0SaveXMM(PCPUMCTX pCtx);
399DECLASM(void) cpumR0SetFCW(uint16_t u16FCW);
400DECLASM(uint16_t) cpumR0GetFCW(void);
401DECLASM(void) cpumR0SetMXCSR(uint32_t u32MXCSR);
402DECLASM(uint32_t) cpumR0GetMXCSR(void);
403DECLASM(void) cpumR0LoadDRx(uint64_t const *pa4Regs);
404DECLASM(void) cpumR0SaveDRx(uint64_t *pa4Regs);
405#endif
406
407RT_C_DECLS_END
408
409/** @} */
410
411#endif
412
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