VirtualBox

source: vbox/trunk/include/VBox/vmm/cpum.h@ 49852

Last change on this file since 49852 was 49849, checked in by vboxsync, 11 years ago

VMM: Use EFER.LMA in PAE-paging mode check rather than EFER.LME.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.1 KB
Line 
1/** @file
2 * CPUM - CPU Monitor(/ Manager).
3 */
4
5/*
6 * Copyright (C) 2006-2012 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_vmm_cpum_h
27#define ___VBox_vmm_cpum_h
28
29#include <iprt/x86.h>
30#include <VBox/types.h>
31#include <VBox/vmm/cpumctx.h>
32
33RT_C_DECLS_BEGIN
34
35/** @defgroup grp_cpum The CPU Monitor / Manager API
36 * @{
37 */
38
39/**
40 * CPUID feature to set or clear.
41 */
42typedef enum CPUMCPUIDFEATURE
43{
44 CPUMCPUIDFEATURE_INVALID = 0,
45 /** The APIC feature bit. (Std+Ext) */
46 CPUMCPUIDFEATURE_APIC,
47 /** The sysenter/sysexit feature bit. (Std) */
48 CPUMCPUIDFEATURE_SEP,
49 /** The SYSCALL/SYSEXIT feature bit (64 bits mode only for Intel CPUs). (Ext) */
50 CPUMCPUIDFEATURE_SYSCALL,
51 /** The PAE feature bit. (Std+Ext) */
52 CPUMCPUIDFEATURE_PAE,
53 /** The NX feature bit. (Ext) */
54 CPUMCPUIDFEATURE_NX,
55 /** The LAHF/SAHF feature bit (64 bits mode only). (Ext) */
56 CPUMCPUIDFEATURE_LAHF,
57 /** The LONG MODE feature bit. (Ext) */
58 CPUMCPUIDFEATURE_LONG_MODE,
59 /** The PAT feature bit. (Std+Ext) */
60 CPUMCPUIDFEATURE_PAT,
61 /** The x2APIC feature bit. (Std) */
62 CPUMCPUIDFEATURE_X2APIC,
63 /** The RDTSCP feature bit. (Ext) */
64 CPUMCPUIDFEATURE_RDTSCP,
65 /** The Hypervisor Present bit. (Std) */
66 CPUMCPUIDFEATURE_HVP,
67 /** 32bit hackishness. */
68 CPUMCPUIDFEATURE_32BIT_HACK = 0x7fffffff
69} CPUMCPUIDFEATURE;
70
71/**
72 * CPU Vendor.
73 */
74typedef enum CPUMCPUVENDOR
75{
76 CPUMCPUVENDOR_INVALID = 0,
77 CPUMCPUVENDOR_INTEL,
78 CPUMCPUVENDOR_AMD,
79 CPUMCPUVENDOR_VIA,
80 CPUMCPUVENDOR_UNKNOWN,
81 CPUMCPUVENDOR_SYNTHETIC,
82 /** 32bit hackishness. */
83 CPUMCPUVENDOR_32BIT_HACK = 0x7fffffff
84} CPUMCPUVENDOR;
85
86
87/** @name Guest Register Getters.
88 * @{ */
89VMMDECL(void) CPUMGetGuestGDTR(PVMCPU pVCpu, PVBOXGDTR pGDTR);
90VMMDECL(RTGCPTR) CPUMGetGuestIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
91VMMDECL(RTSEL) CPUMGetGuestTR(PVMCPU pVCpu, PCPUMSELREGHID pHidden);
92VMMDECL(RTSEL) CPUMGetGuestLDTR(PVMCPU pVCpu);
93VMMDECL(RTSEL) CPUMGetGuestLdtrEx(PVMCPU pVCpu, uint64_t *pGCPtrBase, uint32_t *pcbLimit);
94VMMDECL(uint64_t) CPUMGetGuestCR0(PVMCPU pVCpu);
95VMMDECL(uint64_t) CPUMGetGuestCR2(PVMCPU pVCpu);
96VMMDECL(uint64_t) CPUMGetGuestCR3(PVMCPU pVCpu);
97VMMDECL(uint64_t) CPUMGetGuestCR4(PVMCPU pVCpu);
98VMMDECL(uint64_t) CPUMGetGuestCR8(PVMCPU pVCpu);
99VMMDECL(int) CPUMGetGuestCRx(PVMCPU pVCpu, unsigned iReg, uint64_t *pValue);
100VMMDECL(uint32_t) CPUMGetGuestEFlags(PVMCPU pVCpu);
101VMMDECL(uint32_t) CPUMGetGuestEIP(PVMCPU pVCpu);
102VMMDECL(uint64_t) CPUMGetGuestRIP(PVMCPU pVCpu);
103VMMDECL(uint32_t) CPUMGetGuestEAX(PVMCPU pVCpu);
104VMMDECL(uint32_t) CPUMGetGuestEBX(PVMCPU pVCpu);
105VMMDECL(uint32_t) CPUMGetGuestECX(PVMCPU pVCpu);
106VMMDECL(uint32_t) CPUMGetGuestEDX(PVMCPU pVCpu);
107VMMDECL(uint32_t) CPUMGetGuestESI(PVMCPU pVCpu);
108VMMDECL(uint32_t) CPUMGetGuestEDI(PVMCPU pVCpu);
109VMMDECL(uint32_t) CPUMGetGuestESP(PVMCPU pVCpu);
110VMMDECL(uint32_t) CPUMGetGuestEBP(PVMCPU pVCpu);
111VMMDECL(RTSEL) CPUMGetGuestCS(PVMCPU pVCpu);
112VMMDECL(RTSEL) CPUMGetGuestDS(PVMCPU pVCpu);
113VMMDECL(RTSEL) CPUMGetGuestES(PVMCPU pVCpu);
114VMMDECL(RTSEL) CPUMGetGuestFS(PVMCPU pVCpu);
115VMMDECL(RTSEL) CPUMGetGuestGS(PVMCPU pVCpu);
116VMMDECL(RTSEL) CPUMGetGuestSS(PVMCPU pVCpu);
117VMMDECL(uint64_t) CPUMGetGuestDR0(PVMCPU pVCpu);
118VMMDECL(uint64_t) CPUMGetGuestDR1(PVMCPU pVCpu);
119VMMDECL(uint64_t) CPUMGetGuestDR2(PVMCPU pVCpu);
120VMMDECL(uint64_t) CPUMGetGuestDR3(PVMCPU pVCpu);
121VMMDECL(uint64_t) CPUMGetGuestDR6(PVMCPU pVCpu);
122VMMDECL(uint64_t) CPUMGetGuestDR7(PVMCPU pVCpu);
123VMMDECL(int) CPUMGetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t *pValue);
124VMMDECL(void) CPUMGetGuestCpuId(PVMCPU pVCpu, uint32_t iLeaf, uint32_t *pEax, uint32_t *pEbx, uint32_t *pEcx, uint32_t *pEdx);
125VMMDECL(uint32_t) CPUMGetGuestCpuIdStdMax(PVM pVM);
126VMMDECL(uint32_t) CPUMGetGuestCpuIdExtMax(PVM pVM);
127VMMDECL(uint32_t) CPUMGetGuestCpuIdCentaurMax(PVM pVM);
128VMMDECL(uint64_t) CPUMGetGuestEFER(PVMCPU pVCpu);
129VMMDECL(int) CPUMQueryGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue);
130VMMDECL(int) CPUMSetGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t uValue);
131VMMDECL(CPUMCPUVENDOR) CPUMGetGuestCpuVendor(PVM pVM);
132VMMDECL(CPUMCPUVENDOR) CPUMGetHostCpuVendor(PVM pVM);
133/** @} */
134
135/** @name Guest Register Setters.
136 * @{ */
137VMMDECL(int) CPUMSetGuestGDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
138VMMDECL(int) CPUMSetGuestIDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
139VMMDECL(int) CPUMSetGuestTR(PVMCPU pVCpu, uint16_t tr);
140VMMDECL(int) CPUMSetGuestLDTR(PVMCPU pVCpu, uint16_t ldtr);
141VMMDECL(int) CPUMSetGuestCR0(PVMCPU pVCpu, uint64_t cr0);
142VMMDECL(int) CPUMSetGuestCR2(PVMCPU pVCpu, uint64_t cr2);
143VMMDECL(int) CPUMSetGuestCR3(PVMCPU pVCpu, uint64_t cr3);
144VMMDECL(int) CPUMSetGuestCR4(PVMCPU pVCpu, uint64_t cr4);
145VMMDECL(int) CPUMSetGuestDR0(PVMCPU pVCpu, uint64_t uDr0);
146VMMDECL(int) CPUMSetGuestDR1(PVMCPU pVCpu, uint64_t uDr1);
147VMMDECL(int) CPUMSetGuestDR2(PVMCPU pVCpu, uint64_t uDr2);
148VMMDECL(int) CPUMSetGuestDR3(PVMCPU pVCpu, uint64_t uDr3);
149VMMDECL(int) CPUMSetGuestDR6(PVMCPU pVCpu, uint64_t uDr6);
150VMMDECL(int) CPUMSetGuestDR7(PVMCPU pVCpu, uint64_t uDr7);
151VMMDECL(int) CPUMSetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t Value);
152VMMDECL(int) CPUMSetGuestEFlags(PVMCPU pVCpu, uint32_t eflags);
153VMMDECL(int) CPUMSetGuestEIP(PVMCPU pVCpu, uint32_t eip);
154VMMDECL(int) CPUMSetGuestEAX(PVMCPU pVCpu, uint32_t eax);
155VMMDECL(int) CPUMSetGuestEBX(PVMCPU pVCpu, uint32_t ebx);
156VMMDECL(int) CPUMSetGuestECX(PVMCPU pVCpu, uint32_t ecx);
157VMMDECL(int) CPUMSetGuestEDX(PVMCPU pVCpu, uint32_t edx);
158VMMDECL(int) CPUMSetGuestESI(PVMCPU pVCpu, uint32_t esi);
159VMMDECL(int) CPUMSetGuestEDI(PVMCPU pVCpu, uint32_t edi);
160VMMDECL(int) CPUMSetGuestESP(PVMCPU pVCpu, uint32_t esp);
161VMMDECL(int) CPUMSetGuestEBP(PVMCPU pVCpu, uint32_t ebp);
162VMMDECL(int) CPUMSetGuestCS(PVMCPU pVCpu, uint16_t cs);
163VMMDECL(int) CPUMSetGuestDS(PVMCPU pVCpu, uint16_t ds);
164VMMDECL(int) CPUMSetGuestES(PVMCPU pVCpu, uint16_t es);
165VMMDECL(int) CPUMSetGuestFS(PVMCPU pVCpu, uint16_t fs);
166VMMDECL(int) CPUMSetGuestGS(PVMCPU pVCpu, uint16_t gs);
167VMMDECL(int) CPUMSetGuestSS(PVMCPU pVCpu, uint16_t ss);
168VMMDECL(void) CPUMSetGuestEFER(PVMCPU pVCpu, uint64_t val);
169VMMDECL(void) CPUMSetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
170VMMDECL(void) CPUMClearGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
171VMMDECL(bool) CPUMGetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
172VMMDECL(void) CPUMSetGuestCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
173VMM_INT_DECL(void) CPUMGuestLazyLoadHiddenCsAndSs(PVMCPU pVCpu);
174VMM_INT_DECL(void) CPUMGuestLazyLoadHiddenSelectorReg(PVMCPU pVCpu, PCPUMSELREG pSReg);
175/** @} */
176
177
178/** @name Misc Guest Predicate Functions.
179 * @{ */
180
181VMMDECL(bool) CPUMIsGuestIn16BitCode(PVMCPU pVCpu);
182VMMDECL(bool) CPUMIsGuestIn32BitCode(PVMCPU pVCpu);
183VMMDECL(bool) CPUMIsGuestIn64BitCode(PVMCPU pVCpu);
184VMMDECL(bool) CPUMIsGuestNXEnabled(PVMCPU pVCpu);
185VMMDECL(bool) CPUMIsGuestPageSizeExtEnabled(PVMCPU pVCpu);
186VMMDECL(bool) CPUMIsGuestPagingEnabled(PVMCPU pVCpu);
187VMMDECL(bool) CPUMIsGuestR0WriteProtEnabled(PVMCPU pVCpu);
188VMMDECL(bool) CPUMIsGuestInRealMode(PVMCPU pVCpu);
189VMMDECL(bool) CPUMIsGuestInRealOrV86Mode(PVMCPU pVCpu);
190VMMDECL(bool) CPUMIsGuestInProtectedMode(PVMCPU pVCpu);
191VMMDECL(bool) CPUMIsGuestInPagedProtectedMode(PVMCPU pVCpu);
192VMMDECL(bool) CPUMIsGuestInLongMode(PVMCPU pVCpu);
193VMMDECL(bool) CPUMIsGuestInPAEMode(PVMCPU pVCpu);
194VMM_INT_DECL(bool) CPUMIsGuestInRawMode(PVMCPU pVCpu);
195
196#ifndef VBOX_WITHOUT_UNNAMED_UNIONS
197
198/**
199 * Tests if the guest is running in real mode or not.
200 *
201 * @returns true if in real mode, otherwise false.
202 * @param pCtx Current CPU context
203 */
204DECLINLINE(bool) CPUMIsGuestInRealModeEx(PCPUMCTX pCtx)
205{
206 return !(pCtx->cr0 & X86_CR0_PE);
207}
208
209/**
210 * Tests if the guest is running in real or virtual 8086 mode.
211 *
212 * @returns @c true if it is, @c false if not.
213 * @param pCtx Current CPU context
214 */
215DECLINLINE(bool) CPUMIsGuestInRealOrV86ModeEx(PCPUMCTX pCtx)
216{
217 return !(pCtx->cr0 & X86_CR0_PE)
218 || pCtx->eflags.Bits.u1VM; /* Cannot be set in long mode. Intel spec 2.3.1 "System Flags and Fields in IA-32e Mode". */
219}
220
221/**
222 * Tests if the guest is running in virtual 8086 mode.
223 *
224 * @returns @c true if it is, @c false if not.
225 * @param pCtx Current CPU context
226 */
227DECLINLINE(bool) CPUMIsGuestInV86ModeEx(PCPUMCTX pCtx)
228{
229 return (pCtx->eflags.Bits.u1VM == 1);
230}
231
232/**
233 * Tests if the guest is running in paged protected or not.
234 *
235 * @returns true if in paged protected mode, otherwise false.
236 * @param pVM The VM handle.
237 */
238DECLINLINE(bool) CPUMIsGuestInPagedProtectedModeEx(PCPUMCTX pCtx)
239{
240 return (pCtx->cr0 & (X86_CR0_PE | X86_CR0_PG)) == (X86_CR0_PE | X86_CR0_PG);
241}
242
243/**
244 * Tests if the guest is running in long mode or not.
245 *
246 * @returns true if in long mode, otherwise false.
247 * @param pCtx Current CPU context
248 */
249DECLINLINE(bool) CPUMIsGuestInLongModeEx(PCPUMCTX pCtx)
250{
251 return (pCtx->msrEFER & MSR_K6_EFER_LMA) == MSR_K6_EFER_LMA;
252}
253
254VMM_INT_DECL(bool) CPUMIsGuestIn64BitCodeSlow(PCPUMCTX pCtx);
255
256/**
257 * Tests if the guest is running in 64 bits mode or not.
258 *
259 * @returns true if in 64 bits protected mode, otherwise false.
260 * @param pVCpu The current virtual CPU.
261 * @param pCtx Current CPU context
262 */
263DECLINLINE(bool) CPUMIsGuestIn64BitCodeEx(PCPUMCTX pCtx)
264{
265 if (!(pCtx->msrEFER & MSR_K6_EFER_LMA))
266 return false;
267 if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(NULL, &pCtx->cs))
268 return CPUMIsGuestIn64BitCodeSlow(pCtx);
269 return pCtx->cs.Attr.n.u1Long;
270}
271
272/**
273 * Tests if the guest has paging enabled or not.
274 *
275 * @returns true if paging is enabled, otherwise false.
276 * @param pCtx Current CPU context
277 */
278DECLINLINE(bool) CPUMIsGuestPagingEnabledEx(PCPUMCTX pCtx)
279{
280 return !!(pCtx->cr0 & X86_CR0_PG);
281}
282
283/**
284 * Tests if the guest is running in PAE mode or not.
285 *
286 * @returns true if in PAE mode, otherwise false.
287 * @param pCtx Current CPU context
288 */
289DECLINLINE(bool) CPUMIsGuestInPAEModeEx(PCPUMCTX pCtx)
290{
291 /* Intel mentions EFER.LMA and EFER.LME in different parts of their spec. We shall use EFER.LMA rather
292 than EFER.LME as it reflects if the CPU has entered paging with EFER.LME set. */
293 return ( (pCtx->cr4 & X86_CR4_PAE)
294 && CPUMIsGuestPagingEnabledEx(pCtx)
295 && !(pCtx->msrEFER & MSR_K6_EFER_LMA));
296}
297
298#endif /* VBOX_WITHOUT_UNNAMED_UNIONS */
299
300/** @} */
301
302
303/** @name Hypervisor Register Getters.
304 * @{ */
305VMMDECL(RTSEL) CPUMGetHyperCS(PVMCPU pVCpu);
306VMMDECL(RTSEL) CPUMGetHyperDS(PVMCPU pVCpu);
307VMMDECL(RTSEL) CPUMGetHyperES(PVMCPU pVCpu);
308VMMDECL(RTSEL) CPUMGetHyperFS(PVMCPU pVCpu);
309VMMDECL(RTSEL) CPUMGetHyperGS(PVMCPU pVCpu);
310VMMDECL(RTSEL) CPUMGetHyperSS(PVMCPU pVCpu);
311#if 0 /* these are not correct. */
312VMMDECL(uint32_t) CPUMGetHyperCR0(PVMCPU pVCpu);
313VMMDECL(uint32_t) CPUMGetHyperCR2(PVMCPU pVCpu);
314VMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
315VMMDECL(uint32_t) CPUMGetHyperCR4(PVMCPU pVCpu);
316#endif
317/** This register is only saved on fatal traps. */
318VMMDECL(uint32_t) CPUMGetHyperEAX(PVMCPU pVCpu);
319VMMDECL(uint32_t) CPUMGetHyperEBX(PVMCPU pVCpu);
320/** This register is only saved on fatal traps. */
321VMMDECL(uint32_t) CPUMGetHyperECX(PVMCPU pVCpu);
322/** This register is only saved on fatal traps. */
323VMMDECL(uint32_t) CPUMGetHyperEDX(PVMCPU pVCpu);
324VMMDECL(uint32_t) CPUMGetHyperESI(PVMCPU pVCpu);
325VMMDECL(uint32_t) CPUMGetHyperEDI(PVMCPU pVCpu);
326VMMDECL(uint32_t) CPUMGetHyperEBP(PVMCPU pVCpu);
327VMMDECL(uint32_t) CPUMGetHyperESP(PVMCPU pVCpu);
328VMMDECL(uint32_t) CPUMGetHyperEFlags(PVMCPU pVCpu);
329VMMDECL(uint32_t) CPUMGetHyperEIP(PVMCPU pVCpu);
330VMMDECL(uint64_t) CPUMGetHyperRIP(PVMCPU pVCpu);
331VMMDECL(uint32_t) CPUMGetHyperIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
332VMMDECL(uint32_t) CPUMGetHyperGDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
333VMMDECL(RTSEL) CPUMGetHyperLDTR(PVMCPU pVCpu);
334VMMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVMCPU pVCpu);
335VMMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVMCPU pVCpu);
336VMMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVMCPU pVCpu);
337VMMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVMCPU pVCpu);
338VMMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVMCPU pVCpu);
339VMMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVMCPU pVCpu);
340VMMDECL(void) CPUMGetHyperCtx(PVMCPU pVCpu, PCPUMCTX pCtx);
341VMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
342/** @} */
343
344/** @name Hypervisor Register Setters.
345 * @{ */
346VMMDECL(void) CPUMSetHyperGDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
347VMMDECL(void) CPUMSetHyperLDTR(PVMCPU pVCpu, RTSEL SelLDTR);
348VMMDECL(void) CPUMSetHyperIDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
349VMMDECL(void) CPUMSetHyperCR3(PVMCPU pVCpu, uint32_t cr3);
350VMMDECL(void) CPUMSetHyperTR(PVMCPU pVCpu, RTSEL SelTR);
351VMMDECL(void) CPUMSetHyperCS(PVMCPU pVCpu, RTSEL SelCS);
352VMMDECL(void) CPUMSetHyperDS(PVMCPU pVCpu, RTSEL SelDS);
353VMMDECL(void) CPUMSetHyperES(PVMCPU pVCpu, RTSEL SelDS);
354VMMDECL(void) CPUMSetHyperFS(PVMCPU pVCpu, RTSEL SelDS);
355VMMDECL(void) CPUMSetHyperGS(PVMCPU pVCpu, RTSEL SelDS);
356VMMDECL(void) CPUMSetHyperSS(PVMCPU pVCpu, RTSEL SelSS);
357VMMDECL(void) CPUMSetHyperESP(PVMCPU pVCpu, uint32_t u32ESP);
358VMMDECL(int) CPUMSetHyperEFlags(PVMCPU pVCpu, uint32_t Efl);
359VMMDECL(void) CPUMSetHyperEIP(PVMCPU pVCpu, uint32_t u32EIP);
360VMM_INT_DECL(void) CPUMSetHyperState(PVMCPU pVCpu, uint32_t u32EIP, uint32_t u32ESP, uint32_t u32EAX, uint32_t u32EDX);
361VMMDECL(void) CPUMSetHyperDR0(PVMCPU pVCpu, RTGCUINTREG uDr0);
362VMMDECL(void) CPUMSetHyperDR1(PVMCPU pVCpu, RTGCUINTREG uDr1);
363VMMDECL(void) CPUMSetHyperDR2(PVMCPU pVCpu, RTGCUINTREG uDr2);
364VMMDECL(void) CPUMSetHyperDR3(PVMCPU pVCpu, RTGCUINTREG uDr3);
365VMMDECL(void) CPUMSetHyperDR6(PVMCPU pVCpu, RTGCUINTREG uDr6);
366VMMDECL(void) CPUMSetHyperDR7(PVMCPU pVCpu, RTGCUINTREG uDr7);
367VMMDECL(void) CPUMSetHyperCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
368VMMDECL(int) CPUMRecalcHyperDRx(PVMCPU pVCpu, uint8_t iGstReg, bool fForceHyper);
369/** @} */
370
371VMMDECL(void) CPUMPushHyper(PVMCPU pVCpu, uint32_t u32);
372VMMDECL(int) CPUMQueryHyperCtxPtr(PVMCPU pVCpu, PCPUMCTX *ppCtx);
373VMMDECL(PCPUMCTX) CPUMGetHyperCtxPtr(PVMCPU pVCpu);
374VMMDECL(PCCPUMCTXCORE) CPUMGetHyperCtxCore(PVMCPU pVCpu);
375VMMDECL(PCPUMCTX) CPUMQueryGuestCtxPtr(PVMCPU pVCpu);
376VMMDECL(PCCPUMCTXCORE) CPUMGetGuestCtxCore(PVMCPU pVCpu);
377VMM_INT_DECL(int) CPUMRawEnter(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
378VMM_INT_DECL(int) CPUMRawLeave(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, int rc);
379VMMDECL(uint32_t) CPUMRawGetEFlags(PVMCPU pVCpu);
380VMMDECL(void) CPUMRawSetEFlags(PVMCPU pVCpu, uint32_t fEfl);
381
382/** @name Changed flags.
383 * These flags are used to keep track of which important register that
384 * have been changed since last they were reset. The only one allowed
385 * to clear them is REM!
386 * @{
387 */
388#define CPUM_CHANGED_FPU_REM RT_BIT(0)
389#define CPUM_CHANGED_CR0 RT_BIT(1)
390#define CPUM_CHANGED_CR4 RT_BIT(2)
391#define CPUM_CHANGED_GLOBAL_TLB_FLUSH RT_BIT(3)
392#define CPUM_CHANGED_CR3 RT_BIT(4)
393#define CPUM_CHANGED_GDTR RT_BIT(5)
394#define CPUM_CHANGED_IDTR RT_BIT(6)
395#define CPUM_CHANGED_LDTR RT_BIT(7)
396#define CPUM_CHANGED_TR RT_BIT(8) /**@< Currently unused. */
397#define CPUM_CHANGED_SYSENTER_MSR RT_BIT(9)
398#define CPUM_CHANGED_HIDDEN_SEL_REGS RT_BIT(10) /**@< Currently unused. */
399#define CPUM_CHANGED_CPUID RT_BIT(11)
400#define CPUM_CHANGED_ALL ( CPUM_CHANGED_FPU_REM \
401 | CPUM_CHANGED_CR0 \
402 | CPUM_CHANGED_CR4 \
403 | CPUM_CHANGED_GLOBAL_TLB_FLUSH \
404 | CPUM_CHANGED_CR3 \
405 | CPUM_CHANGED_GDTR \
406 | CPUM_CHANGED_IDTR \
407 | CPUM_CHANGED_LDTR \
408 | CPUM_CHANGED_TR \
409 | CPUM_CHANGED_SYSENTER_MSR \
410 | CPUM_CHANGED_HIDDEN_SEL_REGS \
411 | CPUM_CHANGED_CPUID )
412/** @} */
413
414VMMDECL(void) CPUMSetChangedFlags(PVMCPU pVCpu, uint32_t fChangedFlags);
415VMMR3DECL(uint32_t) CPUMR3RemEnter(PVMCPU pVCpu, uint32_t *puCpl);
416VMMR3DECL(void) CPUMR3RemLeave(PVMCPU pVCpu, bool fNoOutOfSyncSels);
417VMMDECL(bool) CPUMSupportsFXSR(PVM pVM);
418VMMDECL(bool) CPUMIsHostUsingSysEnter(PVM pVM);
419VMMDECL(bool) CPUMIsHostUsingSysCall(PVM pVM);
420VMMDECL(bool) CPUMIsGuestFPUStateActive(PVMCPU pVCpu);
421VMMDECL(void) CPUMDeactivateGuestFPUState(PVMCPU pVCpu);
422VMMDECL(bool) CPUMIsGuestDebugStateActive(PVMCPU pVCpu);
423VMMDECL(bool) CPUMIsGuestDebugStateActivePending(PVMCPU pVCpu);
424VMMDECL(void) CPUMDeactivateGuestDebugState(PVMCPU pVCpu);
425VMMDECL(bool) CPUMIsHyperDebugStateActive(PVMCPU pVCpu);
426VMMDECL(bool) CPUMIsHyperDebugStateActivePending(PVMCPU pVCpu);
427VMMDECL(uint32_t) CPUMGetGuestCPL(PVMCPU pVCpu);
428VMMDECL(CPUMMODE) CPUMGetGuestMode(PVMCPU pVCpu);
429VMMDECL(uint32_t) CPUMGetGuestCodeBits(PVMCPU pVCpu);
430VMMDECL(DISCPUMODE) CPUMGetGuestDisMode(PVMCPU pVCpu);
431
432
433#ifdef IN_RING3
434/** @defgroup grp_cpum_r3 The CPU Monitor(/Manager) API
435 * @ingroup grp_cpum
436 * @{
437 */
438
439VMMR3DECL(int) CPUMR3Init(PVM pVM);
440VMMR3DECL(int) CPUMR3InitCompleted(PVM pVM);
441VMMR3DECL(void) CPUMR3LogCpuIds(PVM pVM);
442VMMR3DECL(void) CPUMR3Relocate(PVM pVM);
443VMMR3DECL(int) CPUMR3Term(PVM pVM);
444VMMR3DECL(void) CPUMR3Reset(PVM pVM);
445VMMR3DECL(void) CPUMR3ResetCpu(PVMCPU pVCpu);
446VMMDECL(bool) CPUMR3IsStateRestorePending(PVM pVM);
447VMMR3DECL(void) CPUMR3SetHWVirtEx(PVM pVM, bool fHWVirtExEnabled);
448VMMR3DECL(int) CPUMR3SetCR4Feature(PVM pVM, RTHCUINTREG fOr, RTHCUINTREG fAnd);
449VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdStdRCPtr(PVM pVM);
450VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdExtRCPtr(PVM pVM);
451VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdCentaurRCPtr(PVM pVM);
452VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdDefRCPtr(PVM pVM);
453
454/** @} */
455#endif /* IN_RING3 */
456
457#ifdef IN_RC
458/** @defgroup grp_cpum_gc The CPU Monitor(/Manager) API
459 * @ingroup grp_cpum
460 * @{
461 */
462
463/**
464 * Calls a guest trap/interrupt handler directly
465 *
466 * Assumes a trap stack frame has already been setup on the guest's stack!
467 * This function does not return!
468 *
469 * @param pRegFrame Original trap/interrupt context
470 * @param selCS Code selector of handler
471 * @param pHandler GC virtual address of handler
472 * @param eflags Callee's EFLAGS
473 * @param selSS Stack selector for handler
474 * @param pEsp Stack address for handler
475 */
476DECLASM(void) CPUMGCCallGuestTrapHandler(PCPUMCTXCORE pRegFrame, uint32_t selCS, RTRCPTR pHandler,
477 uint32_t eflags, uint32_t selSS, RTRCPTR pEsp);
478
479/**
480 * Call guest V86 code directly.
481 *
482 * This function does not return!
483 *
484 * @param pRegFrame Original trap/interrupt context
485 */
486DECLASM(void) CPUMGCCallV86Code(PCPUMCTXCORE pRegFrame);
487
488VMMDECL(int) CPUMHandleLazyFPU(PVMCPU pVCpu);
489VMMDECL(uint32_t) CPUMRCGetGuestCPL(PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
490#ifdef VBOX_WITH_RAW_RING1
491VMMDECL(void) CPUMRCRecheckRawState(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
492#endif
493
494/** @} */
495#endif /* IN_RC */
496
497#ifdef IN_RING0
498/** @defgroup grp_cpum_r0 The CPU Monitor(/Manager) API
499 * @ingroup grp_cpum
500 * @{
501 */
502VMMR0_INT_DECL(int) CPUMR0ModuleInit(void);
503VMMR0_INT_DECL(int) CPUMR0ModuleTerm(void);
504VMMR0_INT_DECL(int) CPUMR0InitVM(PVM pVM);
505VMMR0_INT_DECL(int) CPUMR0Trap07Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
506VMMR0_INT_DECL(int) CPUMR0LoadGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
507VMMR0_INT_DECL(int) CPUMR0SaveGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
508VMMR0_INT_DECL(int) CPUMR0SaveHostDebugState(PVM pVM, PVMCPU pVCpu);
509VMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(PVMCPU pVCpu, bool fDr6);
510VMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuest(PVMCPU pVCpu, bool fDr6);
511
512VMMR0_INT_DECL(void) CPUMR0LoadGuestDebugState(PVMCPU pVCpu, bool fDr6);
513VMMR0_INT_DECL(void) CPUMR0LoadHyperDebugState(PVMCPU pVCpu, bool fDr6);
514#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
515VMMR0_INT_DECL(void) CPUMR0SetLApic(PVMCPU pVCpu, RTCPUID idHostCpu);
516#endif
517
518/** @} */
519#endif /* IN_RING0 */
520
521/** @} */
522RT_C_DECLS_END
523
524
525#endif
526
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