VirtualBox

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

Last change on this file since 51508 was 51333, checked in by vboxsync, 11 years ago

VMM/GIM: Hyper-V provider, work-in-progress.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 55.9 KB
Line 
1/** @file
2 * CPUM - CPU Monitor(/ Manager).
3 */
4
5/*
6 * Copyright (C) 2006-2013 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#include <VBox/vmm/stam.h>
33
34RT_C_DECLS_BEGIN
35
36/** @defgroup grp_cpum The CPU Monitor / Manager API
37 * @{
38 */
39
40/**
41 * CPUID feature to set or clear.
42 */
43typedef enum CPUMCPUIDFEATURE
44{
45 CPUMCPUIDFEATURE_INVALID = 0,
46 /** The APIC feature bit. (Std+Ext) */
47 CPUMCPUIDFEATURE_APIC,
48 /** The sysenter/sysexit feature bit. (Std) */
49 CPUMCPUIDFEATURE_SEP,
50 /** The SYSCALL/SYSEXIT feature bit (64 bits mode only for Intel CPUs). (Ext) */
51 CPUMCPUIDFEATURE_SYSCALL,
52 /** The PAE feature bit. (Std+Ext) */
53 CPUMCPUIDFEATURE_PAE,
54 /** The NX feature bit. (Ext) */
55 CPUMCPUIDFEATURE_NX,
56 /** The LAHF/SAHF feature bit (64 bits mode only). (Ext) */
57 CPUMCPUIDFEATURE_LAHF,
58 /** The LONG MODE feature bit. (Ext) */
59 CPUMCPUIDFEATURE_LONG_MODE,
60 /** The PAT feature bit. (Std+Ext) */
61 CPUMCPUIDFEATURE_PAT,
62 /** The x2APIC feature bit. (Std) */
63 CPUMCPUIDFEATURE_X2APIC,
64 /** The RDTSCP feature bit. (Ext) */
65 CPUMCPUIDFEATURE_RDTSCP,
66 /** The Hypervisor Present bit. (Std) */
67 CPUMCPUIDFEATURE_HVP,
68 /** 32bit hackishness. */
69 CPUMCPUIDFEATURE_32BIT_HACK = 0x7fffffff
70} CPUMCPUIDFEATURE;
71
72/**
73 * CPU Vendor.
74 */
75typedef enum CPUMCPUVENDOR
76{
77 CPUMCPUVENDOR_INVALID = 0,
78 CPUMCPUVENDOR_INTEL,
79 CPUMCPUVENDOR_AMD,
80 CPUMCPUVENDOR_VIA,
81 CPUMCPUVENDOR_CYRIX,
82 CPUMCPUVENDOR_UNKNOWN,
83 /** 32bit hackishness. */
84 CPUMCPUVENDOR_32BIT_HACK = 0x7fffffff
85} CPUMCPUVENDOR;
86
87
88/**
89 * X86 and AMD64 CPU microarchitectures and in processor generations.
90 *
91 * @remarks The separation here is sometimes a little bit too finely grained,
92 * and the differences is more like processor generation than micro
93 * arch. This can be useful, so we'll provide functions for getting at
94 * more coarse grained info.
95 */
96typedef enum CPUMMICROARCH
97{
98 kCpumMicroarch_Invalid = 0,
99
100 kCpumMicroarch_Intel_First,
101
102 kCpumMicroarch_Intel_8086 = kCpumMicroarch_Intel_First,
103 kCpumMicroarch_Intel_80186,
104 kCpumMicroarch_Intel_80286,
105 kCpumMicroarch_Intel_80386,
106 kCpumMicroarch_Intel_80486,
107 kCpumMicroarch_Intel_P5,
108
109 kCpumMicroarch_Intel_P6_Core_Atom_First,
110 kCpumMicroarch_Intel_P6 = kCpumMicroarch_Intel_P6_Core_Atom_First,
111 kCpumMicroarch_Intel_P6_II,
112 kCpumMicroarch_Intel_P6_III,
113
114 kCpumMicroarch_Intel_P6_M_Banias,
115 kCpumMicroarch_Intel_P6_M_Dothan,
116 kCpumMicroarch_Intel_Core_Yonah, /**< Core, also known as Enhanced Pentium M. */
117
118 kCpumMicroarch_Intel_Core2_First,
119 kCpumMicroarch_Intel_Core2_Merom = kCpumMicroarch_Intel_Core2_First,
120 kCpumMicroarch_Intel_Core2_Penryn,
121
122 kCpumMicroarch_Intel_Core7_First,
123 kCpumMicroarch_Intel_Core7_Nehalem = kCpumMicroarch_Intel_Core7_First,
124 kCpumMicroarch_Intel_Core7_Westmere,
125 kCpumMicroarch_Intel_Core7_SandyBridge,
126 kCpumMicroarch_Intel_Core7_IvyBridge,
127 kCpumMicroarch_Intel_Core7_Haswell,
128 kCpumMicroarch_Intel_Core7_Broadwell,
129 kCpumMicroarch_Intel_Core7_Skylake,
130 kCpumMicroarch_Intel_Core7_Cannonlake,
131 kCpumMicroarch_Intel_Core7_End,
132
133 kCpumMicroarch_Intel_Atom_First,
134 kCpumMicroarch_Intel_Atom_Bonnell = kCpumMicroarch_Intel_Atom_First,
135 kCpumMicroarch_Intel_Atom_Lincroft, /**< Second generation bonnell (44nm). */
136 kCpumMicroarch_Intel_Atom_Saltwell, /**< 32nm shrink of Bonnell. */
137 kCpumMicroarch_Intel_Atom_Silvermont, /**< 22nm */
138 kCpumMicroarch_Intel_Atom_Airmount, /**< 14nm */
139 kCpumMicroarch_Intel_Atom_Goldmont, /**< 14nm */
140 kCpumMicroarch_Intel_Atom_Unknown,
141 kCpumMicroarch_Intel_Atom_End,
142
143 kCpumMicroarch_Intel_P6_Core_Atom_End,
144
145 kCpumMicroarch_Intel_NB_First,
146 kCpumMicroarch_Intel_NB_Willamette = kCpumMicroarch_Intel_NB_First, /**< 180nm */
147 kCpumMicroarch_Intel_NB_Northwood, /**< 130nm */
148 kCpumMicroarch_Intel_NB_Prescott, /**< 90nm */
149 kCpumMicroarch_Intel_NB_Prescott2M, /**< 90nm */
150 kCpumMicroarch_Intel_NB_CedarMill, /**< 65nm */
151 kCpumMicroarch_Intel_NB_Gallatin, /**< 90nm Xeon, Pentium 4 Extreme Edition ("Emergency Edition"). */
152 kCpumMicroarch_Intel_NB_Unknown,
153 kCpumMicroarch_Intel_NB_End,
154
155 kCpumMicroarch_Intel_Unknown,
156 kCpumMicroarch_Intel_End,
157
158 kCpumMicroarch_AMD_First,
159 kCpumMicroarch_AMD_Am286 = kCpumMicroarch_AMD_First,
160 kCpumMicroarch_AMD_Am386,
161 kCpumMicroarch_AMD_Am486,
162 kCpumMicroarch_AMD_Am486Enh, /**< Covers Am5x86 as well. */
163 kCpumMicroarch_AMD_K5,
164 kCpumMicroarch_AMD_K6,
165
166 kCpumMicroarch_AMD_K7_First,
167 kCpumMicroarch_AMD_K7_Palomino = kCpumMicroarch_AMD_K7_First,
168 kCpumMicroarch_AMD_K7_Spitfire,
169 kCpumMicroarch_AMD_K7_Thunderbird,
170 kCpumMicroarch_AMD_K7_Morgan,
171 kCpumMicroarch_AMD_K7_Thoroughbred,
172 kCpumMicroarch_AMD_K7_Barton,
173 kCpumMicroarch_AMD_K7_Unknown,
174 kCpumMicroarch_AMD_K7_End,
175
176 kCpumMicroarch_AMD_K8_First,
177 kCpumMicroarch_AMD_K8_130nm = kCpumMicroarch_AMD_K8_First, /**< 130nm Clawhammer, Sledgehammer, Newcastle, Paris, Odessa, Dublin */
178 kCpumMicroarch_AMD_K8_90nm, /**< 90nm shrink */
179 kCpumMicroarch_AMD_K8_90nm_DualCore, /**< 90nm with two cores. */
180 kCpumMicroarch_AMD_K8_90nm_AMDV, /**< 90nm with AMD-V (usually) and two cores (usually). */
181 kCpumMicroarch_AMD_K8_65nm, /**< 65nm shrink. */
182 kCpumMicroarch_AMD_K8_End,
183
184 kCpumMicroarch_AMD_K10,
185 kCpumMicroarch_AMD_K10_Lion,
186 kCpumMicroarch_AMD_K10_Llano,
187 kCpumMicroarch_AMD_Bobcat,
188 kCpumMicroarch_AMD_Jaguar,
189
190 kCpumMicroarch_AMD_15h_First,
191 kCpumMicroarch_AMD_15h_Bulldozer = kCpumMicroarch_AMD_15h_First,
192 kCpumMicroarch_AMD_15h_Piledriver,
193 kCpumMicroarch_AMD_15h_Steamroller, /**< Yet to be released, might have different family. */
194 kCpumMicroarch_AMD_15h_Excavator, /**< Yet to be released, might have different family. */
195 kCpumMicroarch_AMD_15h_Unknown,
196 kCpumMicroarch_AMD_15h_End,
197
198 kCpumMicroarch_AMD_16h_First,
199 kCpumMicroarch_AMD_16h_End,
200
201 kCpumMicroarch_AMD_Unknown,
202 kCpumMicroarch_AMD_End,
203
204 kCpumMicroarch_VIA_First,
205 kCpumMicroarch_Centaur_C6 = kCpumMicroarch_VIA_First,
206 kCpumMicroarch_Centaur_C2,
207 kCpumMicroarch_Centaur_C3,
208 kCpumMicroarch_VIA_C3_M2,
209 kCpumMicroarch_VIA_C3_C5A, /**< 180nm Samuel - Cyrix III, C3, 1GigaPro. */
210 kCpumMicroarch_VIA_C3_C5B, /**< 150nm Samuel 2 - Cyrix III, C3, 1GigaPro, Eden ESP, XP 2000+. */
211 kCpumMicroarch_VIA_C3_C5C, /**< 130nm Ezra - C3, Eden ESP. */
212 kCpumMicroarch_VIA_C3_C5N, /**< 130nm Ezra-T - C3. */
213 kCpumMicroarch_VIA_C3_C5XL, /**< 130nm Nehemiah - C3, Eden ESP, Eden-N. */
214 kCpumMicroarch_VIA_C3_C5P, /**< 130nm Nehemiah+ - C3. */
215 kCpumMicroarch_VIA_C7_C5J, /**< 90nm Esther - C7, C7-D, C7-M, Eden, Eden ULV. */
216 kCpumMicroarch_VIA_Isaiah,
217 kCpumMicroarch_VIA_Unknown,
218 kCpumMicroarch_VIA_End,
219
220 kCpumMicroarch_Cyrix_First,
221 kCpumMicroarch_Cyrix_5x86 = kCpumMicroarch_Cyrix_First,
222 kCpumMicroarch_Cyrix_M1,
223 kCpumMicroarch_Cyrix_MediaGX,
224 kCpumMicroarch_Cyrix_MediaGXm,
225 kCpumMicroarch_Cyrix_M2,
226 kCpumMicroarch_Cyrix_Unknown,
227 kCpumMicroarch_Cyrix_End,
228
229 kCpumMicroarch_Unknown,
230
231 kCpumMicroarch_32BitHack = 0x7fffffff
232} CPUMMICROARCH;
233
234
235/** Predicate macro for catching netburst CPUs. */
236#define CPUMMICROARCH_IS_INTEL_NETBURST(a_enmMicroarch) \
237 ((a_enmMicroarch) >= kCpumMicroarch_Intel_NB_First && (a_enmMicroarch) <= kCpumMicroarch_Intel_NB_End)
238
239/** Predicate macro for catching Core7 CPUs. */
240#define CPUMMICROARCH_IS_INTEL_CORE7(a_enmMicroarch) \
241 ((a_enmMicroarch) >= kCpumMicroarch_Intel_Core7_First && (a_enmMicroarch) <= kCpumMicroarch_Intel_Core7_End)
242
243/** Predicate macro for catching AMD Family OFh CPUs (aka K8). */
244#define CPUMMICROARCH_IS_AMD_FAM_0FH(a_enmMicroarch) \
245 ((a_enmMicroarch) >= kCpumMicroarch_AMD_K8_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_K8_End)
246
247/** Predicate macro for catching AMD Family 10H CPUs (aka K10). */
248#define CPUMMICROARCH_IS_AMD_FAM_10H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10)
249
250/** Predicate macro for catching AMD Family 11H CPUs (aka Lion). */
251#define CPUMMICROARCH_IS_AMD_FAM_11H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10_Lion)
252
253/** Predicate macro for catching AMD Family 12H CPUs (aka Llano). */
254#define CPUMMICROARCH_IS_AMD_FAM_12H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10_Llano)
255
256/** Predicate macro for catching AMD Family 14H CPUs (aka Bobcat). */
257#define CPUMMICROARCH_IS_AMD_FAM_14H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_Bobcat)
258
259/** Predicate macro for catching AMD Family 15H CPUs (bulldozer and it's
260 * decendants). */
261#define CPUMMICROARCH_IS_AMD_FAM_15H(a_enmMicroarch) \
262 ((a_enmMicroarch) >= kCpumMicroarch_AMD_15h_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_15h_End)
263
264/** Predicate macro for catching AMD Family 16H CPUs. */
265#define CPUMMICROARCH_IS_AMD_FAM_16H(a_enmMicroarch) \
266 ((a_enmMicroarch) >= kCpumMicroarch_AMD_16h_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_16h_End)
267
268
269
270/**
271 * CPUID leaf.
272 */
273typedef struct CPUMCPUIDLEAF
274{
275 /** The leaf number. */
276 uint32_t uLeaf;
277 /** The sub-leaf number. */
278 uint32_t uSubLeaf;
279 /** Sub-leaf mask. This is 0 when sub-leaves aren't used. */
280 uint32_t fSubLeafMask;
281
282 /** The EAX value. */
283 uint32_t uEax;
284 /** The EBX value. */
285 uint32_t uEbx;
286 /** The ECX value. */
287 uint32_t uEcx;
288 /** The EDX value. */
289 uint32_t uEdx;
290
291 /** Flags. */
292 uint32_t fFlags;
293} CPUMCPUIDLEAF;
294/** Pointer to a CPUID leaf. */
295typedef CPUMCPUIDLEAF *PCPUMCPUIDLEAF;
296/** Pointer to a const CPUID leaf. */
297typedef CPUMCPUIDLEAF const *PCCPUMCPUIDLEAF;
298
299/** @name CPUMCPUIDLEAF::fFlags
300 * @{ */
301/** Indicates that ECX (the sub-leaf indicator) doesn't change when
302 * requesting the final leaf and all undefined leaves that follows it.
303 * Observed for 0x0000000b on Intel. */
304#define CPUMCPUIDLEAF_F_SUBLEAVES_ECX_UNCHANGED RT_BIT_32(0)
305/** @} */
306
307/**
308 * Method used to deal with unknown CPUID leafs.
309 */
310typedef enum CPUMUKNOWNCPUID
311{
312 /** Invalid zero value. */
313 CPUMUKNOWNCPUID_INVALID = 0,
314 /** Use given default values (DefCpuId). */
315 CPUMUKNOWNCPUID_DEFAULTS,
316 /** Return the last standard leaf.
317 * Intel Sandy Bridge has been observed doing this. */
318 CPUMUKNOWNCPUID_LAST_STD_LEAF,
319 /** Return the last standard leaf, with ecx observed.
320 * Intel Sandy Bridge has been observed doing this. */
321 CPUMUKNOWNCPUID_LAST_STD_LEAF_WITH_ECX,
322 /** The register values are passed thru unmodified. */
323 CPUMUKNOWNCPUID_PASSTHRU,
324 /** End of valid value. */
325 CPUMUKNOWNCPUID_END,
326 /** Ensure 32-bit type. */
327 CPUMUKNOWNCPUID_32BIT_HACK = 0x7fffffff
328} CPUMUKNOWNCPUID;
329/** Pointer to unknown CPUID leaf method. */
330typedef CPUMUKNOWNCPUID *PCPUMUKNOWNCPUID;
331
332
333/**
334 * MSR read functions.
335 */
336typedef enum CPUMMSRRDFN
337{
338 /** Invalid zero value. */
339 kCpumMsrRdFn_Invalid = 0,
340 /** Return the CPUMMSRRANGE::uValue. */
341 kCpumMsrRdFn_FixedValue,
342 /** Alias to the MSR range starting at the MSR given by
343 * CPUMMSRRANGE::uValue. Must be used in pair with
344 * kCpumMsrWrFn_MsrAlias. */
345 kCpumMsrRdFn_MsrAlias,
346 /** Write only register, GP all read attempts. */
347 kCpumMsrRdFn_WriteOnly,
348
349 kCpumMsrRdFn_Ia32P5McAddr,
350 kCpumMsrRdFn_Ia32P5McType,
351 kCpumMsrRdFn_Ia32TimestampCounter,
352 kCpumMsrRdFn_Ia32PlatformId, /**< Takes real CPU value for reference. */
353 kCpumMsrRdFn_Ia32ApicBase,
354 kCpumMsrRdFn_Ia32FeatureControl,
355 kCpumMsrRdFn_Ia32BiosSignId, /**< Range value returned. */
356 kCpumMsrRdFn_Ia32SmmMonitorCtl,
357 kCpumMsrRdFn_Ia32PmcN,
358 kCpumMsrRdFn_Ia32MonitorFilterLineSize,
359 kCpumMsrRdFn_Ia32MPerf,
360 kCpumMsrRdFn_Ia32APerf,
361 kCpumMsrRdFn_Ia32MtrrCap, /**< Takes real CPU value for reference. */
362 kCpumMsrRdFn_Ia32MtrrPhysBaseN, /**< Takes register number. */
363 kCpumMsrRdFn_Ia32MtrrPhysMaskN, /**< Takes register number. */
364 kCpumMsrRdFn_Ia32MtrrFixed, /**< Takes CPUMCPU offset. */
365 kCpumMsrRdFn_Ia32MtrrDefType,
366 kCpumMsrRdFn_Ia32Pat,
367 kCpumMsrRdFn_Ia32SysEnterCs,
368 kCpumMsrRdFn_Ia32SysEnterEsp,
369 kCpumMsrRdFn_Ia32SysEnterEip,
370 kCpumMsrRdFn_Ia32McgCap,
371 kCpumMsrRdFn_Ia32McgStatus,
372 kCpumMsrRdFn_Ia32McgCtl,
373 kCpumMsrRdFn_Ia32DebugCtl,
374 kCpumMsrRdFn_Ia32SmrrPhysBase,
375 kCpumMsrRdFn_Ia32SmrrPhysMask,
376 kCpumMsrRdFn_Ia32PlatformDcaCap,
377 kCpumMsrRdFn_Ia32CpuDcaCap,
378 kCpumMsrRdFn_Ia32Dca0Cap,
379 kCpumMsrRdFn_Ia32PerfEvtSelN, /**< Range value indicates the register number. */
380 kCpumMsrRdFn_Ia32PerfStatus, /**< Range value returned. */
381 kCpumMsrRdFn_Ia32PerfCtl, /**< Range value returned. */
382 kCpumMsrRdFn_Ia32FixedCtrN, /**< Takes register number of start of range. */
383 kCpumMsrRdFn_Ia32PerfCapabilities, /**< Takes reference value. */
384 kCpumMsrRdFn_Ia32FixedCtrCtrl,
385 kCpumMsrRdFn_Ia32PerfGlobalStatus, /**< Takes reference value. */
386 kCpumMsrRdFn_Ia32PerfGlobalCtrl,
387 kCpumMsrRdFn_Ia32PerfGlobalOvfCtrl,
388 kCpumMsrRdFn_Ia32PebsEnable,
389 kCpumMsrRdFn_Ia32ClockModulation, /**< Range value returned. */
390 kCpumMsrRdFn_Ia32ThermInterrupt, /**< Range value returned. */
391 kCpumMsrRdFn_Ia32ThermStatus, /**< Range value returned. */
392 kCpumMsrRdFn_Ia32Therm2Ctl, /**< Range value returned. */
393 kCpumMsrRdFn_Ia32MiscEnable, /**< Range value returned. */
394 kCpumMsrRdFn_Ia32McCtlStatusAddrMiscN, /**< Takes bank number. */
395 kCpumMsrRdFn_Ia32McNCtl2, /**< Takes register number of start of range. */
396 kCpumMsrRdFn_Ia32DsArea,
397 kCpumMsrRdFn_Ia32TscDeadline,
398 kCpumMsrRdFn_Ia32X2ApicN,
399 kCpumMsrRdFn_Ia32DebugInterface,
400 kCpumMsrRdFn_Ia32VmxBase, /**< Takes real value as reference. */
401 kCpumMsrRdFn_Ia32VmxPinbasedCtls, /**< Takes real value as reference. */
402 kCpumMsrRdFn_Ia32VmxProcbasedCtls, /**< Takes real value as reference. */
403 kCpumMsrRdFn_Ia32VmxExitCtls, /**< Takes real value as reference. */
404 kCpumMsrRdFn_Ia32VmxEntryCtls, /**< Takes real value as reference. */
405 kCpumMsrRdFn_Ia32VmxMisc, /**< Takes real value as reference. */
406 kCpumMsrRdFn_Ia32VmxCr0Fixed0, /**< Takes real value as reference. */
407 kCpumMsrRdFn_Ia32VmxCr0Fixed1, /**< Takes real value as reference. */
408 kCpumMsrRdFn_Ia32VmxCr4Fixed0, /**< Takes real value as reference. */
409 kCpumMsrRdFn_Ia32VmxCr4Fixed1, /**< Takes real value as reference. */
410 kCpumMsrRdFn_Ia32VmxVmcsEnum, /**< Takes real value as reference. */
411 kCpumMsrRdFn_Ia32VmxProcBasedCtls2, /**< Takes real value as reference. */
412 kCpumMsrRdFn_Ia32VmxEptVpidCap, /**< Takes real value as reference. */
413 kCpumMsrRdFn_Ia32VmxTruePinbasedCtls, /**< Takes real value as reference. */
414 kCpumMsrRdFn_Ia32VmxTrueProcbasedCtls, /**< Takes real value as reference. */
415 kCpumMsrRdFn_Ia32VmxTrueExitCtls, /**< Takes real value as reference. */
416 kCpumMsrRdFn_Ia32VmxTrueEntryCtls, /**< Takes real value as reference. */
417
418 kCpumMsrRdFn_Amd64Efer,
419 kCpumMsrRdFn_Amd64SyscallTarget,
420 kCpumMsrRdFn_Amd64LongSyscallTarget,
421 kCpumMsrRdFn_Amd64CompSyscallTarget,
422 kCpumMsrRdFn_Amd64SyscallFlagMask,
423 kCpumMsrRdFn_Amd64FsBase,
424 kCpumMsrRdFn_Amd64GsBase,
425 kCpumMsrRdFn_Amd64KernelGsBase,
426 kCpumMsrRdFn_Amd64TscAux,
427
428 kCpumMsrRdFn_IntelEblCrPowerOn,
429 kCpumMsrRdFn_IntelI7CoreThreadCount,
430 kCpumMsrRdFn_IntelP4EbcHardPowerOn,
431 kCpumMsrRdFn_IntelP4EbcSoftPowerOn,
432 kCpumMsrRdFn_IntelP4EbcFrequencyId,
433 kCpumMsrRdFn_IntelP6FsbFrequency, /**< Takes real value as reference. */
434 kCpumMsrRdFn_IntelPlatformInfo,
435 kCpumMsrRdFn_IntelFlexRatio, /**< Takes real value as reference. */
436 kCpumMsrRdFn_IntelPkgCStConfigControl,
437 kCpumMsrRdFn_IntelPmgIoCaptureBase,
438 kCpumMsrRdFn_IntelLastBranchFromToN,
439 kCpumMsrRdFn_IntelLastBranchFromN,
440 kCpumMsrRdFn_IntelLastBranchToN,
441 kCpumMsrRdFn_IntelLastBranchTos,
442 kCpumMsrRdFn_IntelBblCrCtl,
443 kCpumMsrRdFn_IntelBblCrCtl3,
444 kCpumMsrRdFn_IntelI7TemperatureTarget, /**< Range value returned. */
445 kCpumMsrRdFn_IntelI7MsrOffCoreResponseN,/**< Takes register number. */
446 kCpumMsrRdFn_IntelI7MiscPwrMgmt,
447 kCpumMsrRdFn_IntelP6CrN,
448 kCpumMsrRdFn_IntelCpuId1FeatureMaskEcdx,
449 kCpumMsrRdFn_IntelCpuId1FeatureMaskEax,
450 kCpumMsrRdFn_IntelCpuId80000001FeatureMaskEcdx,
451 kCpumMsrRdFn_IntelI7SandyAesNiCtl,
452 kCpumMsrRdFn_IntelI7TurboRatioLimit, /**< Returns range value. */
453 kCpumMsrRdFn_IntelI7LbrSelect,
454 kCpumMsrRdFn_IntelI7SandyErrorControl,
455 kCpumMsrRdFn_IntelI7VirtualLegacyWireCap,/**< Returns range value. */
456 kCpumMsrRdFn_IntelI7PowerCtl,
457 kCpumMsrRdFn_IntelI7SandyPebsNumAlt,
458 kCpumMsrRdFn_IntelI7PebsLdLat,
459 kCpumMsrRdFn_IntelI7PkgCnResidencyN, /**< Takes C-state number. */
460 kCpumMsrRdFn_IntelI7CoreCnResidencyN, /**< Takes C-state number. */
461 kCpumMsrRdFn_IntelI7SandyVrCurrentConfig,/**< Takes real value as reference. */
462 kCpumMsrRdFn_IntelI7SandyVrMiscConfig, /**< Takes real value as reference. */
463 kCpumMsrRdFn_IntelI7SandyRaplPowerUnit, /**< Takes real value as reference. */
464 kCpumMsrRdFn_IntelI7SandyPkgCnIrtlN, /**< Takes real value as reference. */
465 kCpumMsrRdFn_IntelI7SandyPkgC2Residency, /**< Takes real value as reference. */
466 kCpumMsrRdFn_IntelI7RaplPkgPowerLimit, /**< Takes real value as reference. */
467 kCpumMsrRdFn_IntelI7RaplPkgEnergyStatus, /**< Takes real value as reference. */
468 kCpumMsrRdFn_IntelI7RaplPkgPerfStatus, /**< Takes real value as reference. */
469 kCpumMsrRdFn_IntelI7RaplPkgPowerInfo, /**< Takes real value as reference. */
470 kCpumMsrRdFn_IntelI7RaplDramPowerLimit, /**< Takes real value as reference. */
471 kCpumMsrRdFn_IntelI7RaplDramEnergyStatus,/**< Takes real value as reference. */
472 kCpumMsrRdFn_IntelI7RaplDramPerfStatus, /**< Takes real value as reference. */
473 kCpumMsrRdFn_IntelI7RaplDramPowerInfo, /**< Takes real value as reference. */
474 kCpumMsrRdFn_IntelI7RaplPp0PowerLimit, /**< Takes real value as reference. */
475 kCpumMsrRdFn_IntelI7RaplPp0EnergyStatus, /**< Takes real value as reference. */
476 kCpumMsrRdFn_IntelI7RaplPp0Policy, /**< Takes real value as reference. */
477 kCpumMsrRdFn_IntelI7RaplPp0PerfStatus, /**< Takes real value as reference. */
478 kCpumMsrRdFn_IntelI7RaplPp1PowerLimit, /**< Takes real value as reference. */
479 kCpumMsrRdFn_IntelI7RaplPp1EnergyStatus, /**< Takes real value as reference. */
480 kCpumMsrRdFn_IntelI7RaplPp1Policy, /**< Takes real value as reference. */
481 kCpumMsrRdFn_IntelI7IvyConfigTdpNominal, /**< Takes real value as reference. */
482 kCpumMsrRdFn_IntelI7IvyConfigTdpLevel1, /**< Takes real value as reference. */
483 kCpumMsrRdFn_IntelI7IvyConfigTdpLevel2, /**< Takes real value as reference. */
484 kCpumMsrRdFn_IntelI7IvyConfigTdpControl,
485 kCpumMsrRdFn_IntelI7IvyTurboActivationRatio,
486 kCpumMsrRdFn_IntelI7UncPerfGlobalCtrl,
487 kCpumMsrRdFn_IntelI7UncPerfGlobalStatus,
488 kCpumMsrRdFn_IntelI7UncPerfGlobalOvfCtrl,
489 kCpumMsrRdFn_IntelI7UncPerfFixedCtrCtrl,
490 kCpumMsrRdFn_IntelI7UncPerfFixedCtr,
491 kCpumMsrRdFn_IntelI7UncCBoxConfig,
492 kCpumMsrRdFn_IntelI7UncArbPerfCtrN,
493 kCpumMsrRdFn_IntelI7UncArbPerfEvtSelN,
494 kCpumMsrRdFn_IntelCore2EmttmCrTablesN, /**< Range value returned. */
495 kCpumMsrRdFn_IntelCore2SmmCStMiscInfo,
496 kCpumMsrRdFn_IntelCore1ExtConfig,
497 kCpumMsrRdFn_IntelCore1DtsCalControl,
498 kCpumMsrRdFn_IntelCore2PeciControl,
499
500 kCpumMsrRdFn_P6LastBranchFromIp,
501 kCpumMsrRdFn_P6LastBranchToIp,
502 kCpumMsrRdFn_P6LastIntFromIp,
503 kCpumMsrRdFn_P6LastIntToIp,
504
505 kCpumMsrRdFn_AmdFam15hTscRate,
506 kCpumMsrRdFn_AmdFam15hLwpCfg,
507 kCpumMsrRdFn_AmdFam15hLwpCbAddr,
508 kCpumMsrRdFn_AmdFam10hMc4MiscN,
509 kCpumMsrRdFn_AmdK8PerfCtlN,
510 kCpumMsrRdFn_AmdK8PerfCtrN,
511 kCpumMsrRdFn_AmdK8SysCfg, /**< Range value returned. */
512 kCpumMsrRdFn_AmdK8HwCr,
513 kCpumMsrRdFn_AmdK8IorrBaseN,
514 kCpumMsrRdFn_AmdK8IorrMaskN,
515 kCpumMsrRdFn_AmdK8TopOfMemN,
516 kCpumMsrRdFn_AmdK8NbCfg1,
517 kCpumMsrRdFn_AmdK8McXcptRedir,
518 kCpumMsrRdFn_AmdK8CpuNameN,
519 kCpumMsrRdFn_AmdK8HwThermalCtrl, /**< Range value returned. */
520 kCpumMsrRdFn_AmdK8SwThermalCtrl,
521 kCpumMsrRdFn_AmdK8FidVidControl, /**< Range value returned. */
522 kCpumMsrRdFn_AmdK8FidVidStatus, /**< Range value returned. */
523 kCpumMsrRdFn_AmdK8McCtlMaskN,
524 kCpumMsrRdFn_AmdK8SmiOnIoTrapN,
525 kCpumMsrRdFn_AmdK8SmiOnIoTrapCtlSts,
526 kCpumMsrRdFn_AmdK8IntPendingMessage,
527 kCpumMsrRdFn_AmdK8SmiTriggerIoCycle,
528 kCpumMsrRdFn_AmdFam10hMmioCfgBaseAddr,
529 kCpumMsrRdFn_AmdFam10hTrapCtlMaybe,
530 kCpumMsrRdFn_AmdFam10hPStateCurLimit, /**< Returns range value. */
531 kCpumMsrRdFn_AmdFam10hPStateControl, /**< Returns range value. */
532 kCpumMsrRdFn_AmdFam10hPStateStatus, /**< Returns range value. */
533 kCpumMsrRdFn_AmdFam10hPStateN, /**< Returns range value. This isn't an register index! */
534 kCpumMsrRdFn_AmdFam10hCofVidControl, /**< Returns range value. */
535 kCpumMsrRdFn_AmdFam10hCofVidStatus, /**< Returns range value. */
536 kCpumMsrRdFn_AmdFam10hCStateIoBaseAddr,
537 kCpumMsrRdFn_AmdFam10hCpuWatchdogTimer,
538 kCpumMsrRdFn_AmdK8SmmBase,
539 kCpumMsrRdFn_AmdK8SmmAddr,
540 kCpumMsrRdFn_AmdK8SmmMask,
541 kCpumMsrRdFn_AmdK8VmCr,
542 kCpumMsrRdFn_AmdK8IgnNe,
543 kCpumMsrRdFn_AmdK8SmmCtl,
544 kCpumMsrRdFn_AmdK8VmHSavePa,
545 kCpumMsrRdFn_AmdFam10hVmLockKey,
546 kCpumMsrRdFn_AmdFam10hSmmLockKey,
547 kCpumMsrRdFn_AmdFam10hLocalSmiStatus,
548 kCpumMsrRdFn_AmdFam10hOsVisWrkIdLength,
549 kCpumMsrRdFn_AmdFam10hOsVisWrkStatus,
550 kCpumMsrRdFn_AmdFam16hL2IPerfCtlN,
551 kCpumMsrRdFn_AmdFam16hL2IPerfCtrN,
552 kCpumMsrRdFn_AmdFam15hNorthbridgePerfCtlN,
553 kCpumMsrRdFn_AmdFam15hNorthbridgePerfCtrN,
554 kCpumMsrRdFn_AmdK7MicrocodeCtl, /**< Returns range value. */
555 kCpumMsrRdFn_AmdK7ClusterIdMaybe, /**< Returns range value. */
556 kCpumMsrRdFn_AmdK8CpuIdCtlStd07hEbax,
557 kCpumMsrRdFn_AmdK8CpuIdCtlStd06hEcx,
558 kCpumMsrRdFn_AmdK8CpuIdCtlStd01hEdcx,
559 kCpumMsrRdFn_AmdK8CpuIdCtlExt01hEdcx,
560 kCpumMsrRdFn_AmdK8PatchLevel, /**< Returns range value. */
561 kCpumMsrRdFn_AmdK7DebugStatusMaybe,
562 kCpumMsrRdFn_AmdK7BHTraceBaseMaybe,
563 kCpumMsrRdFn_AmdK7BHTracePtrMaybe,
564 kCpumMsrRdFn_AmdK7BHTraceLimitMaybe,
565 kCpumMsrRdFn_AmdK7HardwareDebugToolCfgMaybe,
566 kCpumMsrRdFn_AmdK7FastFlushCountMaybe,
567 kCpumMsrRdFn_AmdK7NodeId,
568 kCpumMsrRdFn_AmdK7DrXAddrMaskN, /**< Takes register index. */
569 kCpumMsrRdFn_AmdK7Dr0DataMatchMaybe,
570 kCpumMsrRdFn_AmdK7Dr0DataMaskMaybe,
571 kCpumMsrRdFn_AmdK7LoadStoreCfg,
572 kCpumMsrRdFn_AmdK7InstrCacheCfg,
573 kCpumMsrRdFn_AmdK7DataCacheCfg,
574 kCpumMsrRdFn_AmdK7BusUnitCfg,
575 kCpumMsrRdFn_AmdK7DebugCtl2Maybe,
576 kCpumMsrRdFn_AmdFam15hFpuCfg,
577 kCpumMsrRdFn_AmdFam15hDecoderCfg,
578 kCpumMsrRdFn_AmdFam10hBusUnitCfg2,
579 kCpumMsrRdFn_AmdFam15hCombUnitCfg,
580 kCpumMsrRdFn_AmdFam15hCombUnitCfg2,
581 kCpumMsrRdFn_AmdFam15hCombUnitCfg3,
582 kCpumMsrRdFn_AmdFam15hExecUnitCfg,
583 kCpumMsrRdFn_AmdFam15hLoadStoreCfg2,
584 kCpumMsrRdFn_AmdFam10hIbsFetchCtl,
585 kCpumMsrRdFn_AmdFam10hIbsFetchLinAddr,
586 kCpumMsrRdFn_AmdFam10hIbsFetchPhysAddr,
587 kCpumMsrRdFn_AmdFam10hIbsOpExecCtl,
588 kCpumMsrRdFn_AmdFam10hIbsOpRip,
589 kCpumMsrRdFn_AmdFam10hIbsOpData,
590 kCpumMsrRdFn_AmdFam10hIbsOpData2,
591 kCpumMsrRdFn_AmdFam10hIbsOpData3,
592 kCpumMsrRdFn_AmdFam10hIbsDcLinAddr,
593 kCpumMsrRdFn_AmdFam10hIbsDcPhysAddr,
594 kCpumMsrRdFn_AmdFam10hIbsCtl,
595 kCpumMsrRdFn_AmdFam14hIbsBrTarget,
596
597 kCpumMsrRdFn_Gim,
598
599 /** End of valid MSR read function indexes. */
600 kCpumMsrRdFn_End
601} CPUMMSRRDFN;
602
603/**
604 * MSR write functions.
605 */
606typedef enum CPUMMSRWRFN
607{
608 /** Invalid zero value. */
609 kCpumMsrWrFn_Invalid = 0,
610 /** Writes are ignored, the fWrGpMask is observed though. */
611 kCpumMsrWrFn_IgnoreWrite,
612 /** Writes cause GP(0) to be raised, the fWrGpMask should be UINT64_MAX. */
613 kCpumMsrWrFn_ReadOnly,
614 /** Alias to the MSR range starting at the MSR given by
615 * CPUMMSRRANGE::uValue. Must be used in pair with
616 * kCpumMsrRdFn_MsrAlias. */
617 kCpumMsrWrFn_MsrAlias,
618
619 kCpumMsrWrFn_Ia32P5McAddr,
620 kCpumMsrWrFn_Ia32P5McType,
621 kCpumMsrWrFn_Ia32TimestampCounter,
622 kCpumMsrWrFn_Ia32ApicBase,
623 kCpumMsrWrFn_Ia32FeatureControl,
624 kCpumMsrWrFn_Ia32BiosSignId,
625 kCpumMsrWrFn_Ia32BiosUpdateTrigger,
626 kCpumMsrWrFn_Ia32SmmMonitorCtl,
627 kCpumMsrWrFn_Ia32PmcN,
628 kCpumMsrWrFn_Ia32MonitorFilterLineSize,
629 kCpumMsrWrFn_Ia32MPerf,
630 kCpumMsrWrFn_Ia32APerf,
631 kCpumMsrWrFn_Ia32MtrrPhysBaseN, /**< Takes register number. */
632 kCpumMsrWrFn_Ia32MtrrPhysMaskN, /**< Takes register number. */
633 kCpumMsrWrFn_Ia32MtrrFixed, /**< Takes CPUMCPU offset. */
634 kCpumMsrWrFn_Ia32MtrrDefType,
635 kCpumMsrWrFn_Ia32Pat,
636 kCpumMsrWrFn_Ia32SysEnterCs,
637 kCpumMsrWrFn_Ia32SysEnterEsp,
638 kCpumMsrWrFn_Ia32SysEnterEip,
639 kCpumMsrWrFn_Ia32McgStatus,
640 kCpumMsrWrFn_Ia32McgCtl,
641 kCpumMsrWrFn_Ia32DebugCtl,
642 kCpumMsrWrFn_Ia32SmrrPhysBase,
643 kCpumMsrWrFn_Ia32SmrrPhysMask,
644 kCpumMsrWrFn_Ia32PlatformDcaCap,
645 kCpumMsrWrFn_Ia32Dca0Cap,
646 kCpumMsrWrFn_Ia32PerfEvtSelN, /**< Range value indicates the register number. */
647 kCpumMsrWrFn_Ia32PerfStatus,
648 kCpumMsrWrFn_Ia32PerfCtl,
649 kCpumMsrWrFn_Ia32FixedCtrN, /**< Takes register number of start of range. */
650 kCpumMsrWrFn_Ia32PerfCapabilities,
651 kCpumMsrWrFn_Ia32FixedCtrCtrl,
652 kCpumMsrWrFn_Ia32PerfGlobalStatus,
653 kCpumMsrWrFn_Ia32PerfGlobalCtrl,
654 kCpumMsrWrFn_Ia32PerfGlobalOvfCtrl,
655 kCpumMsrWrFn_Ia32PebsEnable,
656 kCpumMsrWrFn_Ia32ClockModulation,
657 kCpumMsrWrFn_Ia32ThermInterrupt,
658 kCpumMsrWrFn_Ia32ThermStatus,
659 kCpumMsrWrFn_Ia32Therm2Ctl,
660 kCpumMsrWrFn_Ia32MiscEnable,
661 kCpumMsrWrFn_Ia32McCtlStatusAddrMiscN, /**< Takes bank number. */
662 kCpumMsrWrFn_Ia32McNCtl2, /**< Takes register number of start of range. */
663 kCpumMsrWrFn_Ia32DsArea,
664 kCpumMsrWrFn_Ia32TscDeadline,
665 kCpumMsrWrFn_Ia32X2ApicN,
666 kCpumMsrWrFn_Ia32DebugInterface,
667
668 kCpumMsrWrFn_Amd64Efer,
669 kCpumMsrWrFn_Amd64SyscallTarget,
670 kCpumMsrWrFn_Amd64LongSyscallTarget,
671 kCpumMsrWrFn_Amd64CompSyscallTarget,
672 kCpumMsrWrFn_Amd64SyscallFlagMask,
673 kCpumMsrWrFn_Amd64FsBase,
674 kCpumMsrWrFn_Amd64GsBase,
675 kCpumMsrWrFn_Amd64KernelGsBase,
676 kCpumMsrWrFn_Amd64TscAux,
677 kCpumMsrWrFn_IntelEblCrPowerOn,
678 kCpumMsrWrFn_IntelP4EbcHardPowerOn,
679 kCpumMsrWrFn_IntelP4EbcSoftPowerOn,
680 kCpumMsrWrFn_IntelP4EbcFrequencyId,
681 kCpumMsrWrFn_IntelFlexRatio,
682 kCpumMsrWrFn_IntelPkgCStConfigControl,
683 kCpumMsrWrFn_IntelPmgIoCaptureBase,
684 kCpumMsrWrFn_IntelLastBranchFromToN,
685 kCpumMsrWrFn_IntelLastBranchFromN,
686 kCpumMsrWrFn_IntelLastBranchToN,
687 kCpumMsrWrFn_IntelLastBranchTos,
688 kCpumMsrWrFn_IntelBblCrCtl,
689 kCpumMsrWrFn_IntelBblCrCtl3,
690 kCpumMsrWrFn_IntelI7TemperatureTarget,
691 kCpumMsrWrFn_IntelI7MsrOffCoreResponseN, /**< Takes register number. */
692 kCpumMsrWrFn_IntelI7MiscPwrMgmt,
693 kCpumMsrWrFn_IntelP6CrN,
694 kCpumMsrWrFn_IntelCpuId1FeatureMaskEcdx,
695 kCpumMsrWrFn_IntelCpuId1FeatureMaskEax,
696 kCpumMsrWrFn_IntelCpuId80000001FeatureMaskEcdx,
697 kCpumMsrWrFn_IntelI7SandyAesNiCtl,
698 kCpumMsrWrFn_IntelI7TurboRatioLimit,
699 kCpumMsrWrFn_IntelI7LbrSelect,
700 kCpumMsrWrFn_IntelI7SandyErrorControl,
701 kCpumMsrWrFn_IntelI7PowerCtl,
702 kCpumMsrWrFn_IntelI7SandyPebsNumAlt,
703 kCpumMsrWrFn_IntelI7PebsLdLat,
704 kCpumMsrWrFn_IntelI7SandyVrCurrentConfig,
705 kCpumMsrWrFn_IntelI7SandyVrMiscConfig,
706 kCpumMsrWrFn_IntelI7SandyPkgCnIrtlN,
707 kCpumMsrWrFn_IntelI7RaplPkgPowerLimit,
708 kCpumMsrWrFn_IntelI7RaplDramPowerLimit,
709 kCpumMsrWrFn_IntelI7RaplPp0PowerLimit,
710 kCpumMsrWrFn_IntelI7RaplPp0Policy,
711 kCpumMsrWrFn_IntelI7RaplPp1PowerLimit,
712 kCpumMsrWrFn_IntelI7RaplPp1Policy,
713 kCpumMsrWrFn_IntelI7IvyConfigTdpControl,
714 kCpumMsrWrFn_IntelI7IvyTurboActivationRatio,
715 kCpumMsrWrFn_IntelI7UncPerfGlobalCtrl,
716 kCpumMsrWrFn_IntelI7UncPerfGlobalStatus,
717 kCpumMsrWrFn_IntelI7UncPerfGlobalOvfCtrl,
718 kCpumMsrWrFn_IntelI7UncPerfFixedCtrCtrl,
719 kCpumMsrWrFn_IntelI7UncPerfFixedCtr,
720 kCpumMsrWrFn_IntelI7UncArbPerfCtrN,
721 kCpumMsrWrFn_IntelI7UncArbPerfEvtSelN,
722 kCpumMsrWrFn_IntelCore2EmttmCrTablesN,
723 kCpumMsrWrFn_IntelCore2SmmCStMiscInfo,
724 kCpumMsrWrFn_IntelCore1ExtConfig,
725 kCpumMsrWrFn_IntelCore1DtsCalControl,
726 kCpumMsrWrFn_IntelCore2PeciControl,
727
728 kCpumMsrWrFn_P6LastIntFromIp,
729 kCpumMsrWrFn_P6LastIntToIp,
730
731 kCpumMsrWrFn_AmdFam15hTscRate,
732 kCpumMsrWrFn_AmdFam15hLwpCfg,
733 kCpumMsrWrFn_AmdFam15hLwpCbAddr,
734 kCpumMsrWrFn_AmdFam10hMc4MiscN,
735 kCpumMsrWrFn_AmdK8PerfCtlN,
736 kCpumMsrWrFn_AmdK8PerfCtrN,
737 kCpumMsrWrFn_AmdK8SysCfg,
738 kCpumMsrWrFn_AmdK8HwCr,
739 kCpumMsrWrFn_AmdK8IorrBaseN,
740 kCpumMsrWrFn_AmdK8IorrMaskN,
741 kCpumMsrWrFn_AmdK8TopOfMemN,
742 kCpumMsrWrFn_AmdK8NbCfg1,
743 kCpumMsrWrFn_AmdK8McXcptRedir,
744 kCpumMsrWrFn_AmdK8CpuNameN,
745 kCpumMsrWrFn_AmdK8HwThermalCtrl,
746 kCpumMsrWrFn_AmdK8SwThermalCtrl,
747 kCpumMsrWrFn_AmdK8FidVidControl,
748 kCpumMsrWrFn_AmdK8McCtlMaskN,
749 kCpumMsrWrFn_AmdK8SmiOnIoTrapN,
750 kCpumMsrWrFn_AmdK8SmiOnIoTrapCtlSts,
751 kCpumMsrWrFn_AmdK8IntPendingMessage,
752 kCpumMsrWrFn_AmdK8SmiTriggerIoCycle,
753 kCpumMsrWrFn_AmdFam10hMmioCfgBaseAddr,
754 kCpumMsrWrFn_AmdFam10hTrapCtlMaybe,
755 kCpumMsrWrFn_AmdFam10hPStateControl,
756 kCpumMsrWrFn_AmdFam10hPStateStatus,
757 kCpumMsrWrFn_AmdFam10hPStateN,
758 kCpumMsrWrFn_AmdFam10hCofVidControl,
759 kCpumMsrWrFn_AmdFam10hCofVidStatus,
760 kCpumMsrWrFn_AmdFam10hCStateIoBaseAddr,
761 kCpumMsrWrFn_AmdFam10hCpuWatchdogTimer,
762 kCpumMsrWrFn_AmdK8SmmBase,
763 kCpumMsrWrFn_AmdK8SmmAddr,
764 kCpumMsrWrFn_AmdK8SmmMask,
765 kCpumMsrWrFn_AmdK8VmCr,
766 kCpumMsrWrFn_AmdK8IgnNe,
767 kCpumMsrWrFn_AmdK8SmmCtl,
768 kCpumMsrWrFn_AmdK8VmHSavePa,
769 kCpumMsrWrFn_AmdFam10hVmLockKey,
770 kCpumMsrWrFn_AmdFam10hSmmLockKey,
771 kCpumMsrWrFn_AmdFam10hLocalSmiStatus,
772 kCpumMsrWrFn_AmdFam10hOsVisWrkIdLength,
773 kCpumMsrWrFn_AmdFam10hOsVisWrkStatus,
774 kCpumMsrWrFn_AmdFam16hL2IPerfCtlN,
775 kCpumMsrWrFn_AmdFam16hL2IPerfCtrN,
776 kCpumMsrWrFn_AmdFam15hNorthbridgePerfCtlN,
777 kCpumMsrWrFn_AmdFam15hNorthbridgePerfCtrN,
778 kCpumMsrWrFn_AmdK7MicrocodeCtl,
779 kCpumMsrWrFn_AmdK7ClusterIdMaybe,
780 kCpumMsrWrFn_AmdK8CpuIdCtlStd07hEbax,
781 kCpumMsrWrFn_AmdK8CpuIdCtlStd06hEcx,
782 kCpumMsrWrFn_AmdK8CpuIdCtlStd01hEdcx,
783 kCpumMsrWrFn_AmdK8CpuIdCtlExt01hEdcx,
784 kCpumMsrWrFn_AmdK8PatchLoader,
785 kCpumMsrWrFn_AmdK7DebugStatusMaybe,
786 kCpumMsrWrFn_AmdK7BHTraceBaseMaybe,
787 kCpumMsrWrFn_AmdK7BHTracePtrMaybe,
788 kCpumMsrWrFn_AmdK7BHTraceLimitMaybe,
789 kCpumMsrWrFn_AmdK7HardwareDebugToolCfgMaybe,
790 kCpumMsrWrFn_AmdK7FastFlushCountMaybe,
791 kCpumMsrWrFn_AmdK7NodeId,
792 kCpumMsrWrFn_AmdK7DrXAddrMaskN, /**< Takes register index. */
793 kCpumMsrWrFn_AmdK7Dr0DataMatchMaybe,
794 kCpumMsrWrFn_AmdK7Dr0DataMaskMaybe,
795 kCpumMsrWrFn_AmdK7LoadStoreCfg,
796 kCpumMsrWrFn_AmdK7InstrCacheCfg,
797 kCpumMsrWrFn_AmdK7DataCacheCfg,
798 kCpumMsrWrFn_AmdK7BusUnitCfg,
799 kCpumMsrWrFn_AmdK7DebugCtl2Maybe,
800 kCpumMsrWrFn_AmdFam15hFpuCfg,
801 kCpumMsrWrFn_AmdFam15hDecoderCfg,
802 kCpumMsrWrFn_AmdFam10hBusUnitCfg2,
803 kCpumMsrWrFn_AmdFam15hCombUnitCfg,
804 kCpumMsrWrFn_AmdFam15hCombUnitCfg2,
805 kCpumMsrWrFn_AmdFam15hCombUnitCfg3,
806 kCpumMsrWrFn_AmdFam15hExecUnitCfg,
807 kCpumMsrWrFn_AmdFam15hLoadStoreCfg2,
808 kCpumMsrWrFn_AmdFam10hIbsFetchCtl,
809 kCpumMsrWrFn_AmdFam10hIbsFetchLinAddr,
810 kCpumMsrWrFn_AmdFam10hIbsFetchPhysAddr,
811 kCpumMsrWrFn_AmdFam10hIbsOpExecCtl,
812 kCpumMsrWrFn_AmdFam10hIbsOpRip,
813 kCpumMsrWrFn_AmdFam10hIbsOpData,
814 kCpumMsrWrFn_AmdFam10hIbsOpData2,
815 kCpumMsrWrFn_AmdFam10hIbsOpData3,
816 kCpumMsrWrFn_AmdFam10hIbsDcLinAddr,
817 kCpumMsrWrFn_AmdFam10hIbsDcPhysAddr,
818 kCpumMsrWrFn_AmdFam10hIbsCtl,
819 kCpumMsrWrFn_AmdFam14hIbsBrTarget,
820
821 kCpumMsrWrFn_Gim,
822
823 /** End of valid MSR write function indexes. */
824 kCpumMsrWrFn_End
825} CPUMMSRWRFN;
826
827/**
828 * MSR range.
829 */
830typedef struct CPUMMSRRANGE
831{
832 /** The first MSR. [0] */
833 uint32_t uFirst;
834 /** The last MSR. [4] */
835 uint32_t uLast;
836 /** The read function (CPUMMSRRDFN). [8] */
837 uint16_t enmRdFn;
838 /** The write function (CPUMMSRWRFN). [10] */
839 uint16_t enmWrFn;
840 /** The offset of the 64-bit MSR value relative to the start of CPUMCPU.
841 * UINT16_MAX if not used by the read and write functions. [12] */
842 uint16_t offCpumCpu;
843 /** Reserved for future hacks. [14] */
844 uint16_t fReserved;
845 /** The init/read value. [16]
846 * When enmRdFn is kCpumMsrRdFn_INIT_VALUE, this is the value returned on RDMSR.
847 * offCpumCpu must be UINT16_MAX in that case, otherwise it must be a valid
848 * offset into CPUM. */
849 uint64_t uValue;
850 /** The bits to ignore when writing. [24] */
851 uint64_t fWrIgnMask;
852 /** The bits that will cause a GP(0) when writing. [32]
853 * This is always checked prior to calling the write function. Using
854 * UINT64_MAX effectively marks the MSR as read-only. */
855 uint64_t fWrGpMask;
856 /** The register name, if applicable. [40] */
857 char szName[56];
858
859#ifdef VBOX_WITH_STATISTICS
860 /** The number of reads. */
861 STAMCOUNTER cReads;
862 /** The number of writes. */
863 STAMCOUNTER cWrites;
864 /** The number of times ignored bits were written. */
865 STAMCOUNTER cIgnoredBits;
866 /** The number of GPs generated. */
867 STAMCOUNTER cGps;
868#endif
869} CPUMMSRRANGE;
870#ifdef VBOX_WITH_STATISTICS
871AssertCompileSize(CPUMMSRRANGE, 128);
872#else
873AssertCompileSize(CPUMMSRRANGE, 96);
874#endif
875/** Pointer to an MSR range. */
876typedef CPUMMSRRANGE *PCPUMMSRRANGE;
877/** Pointer to a const MSR range. */
878typedef CPUMMSRRANGE const *PCCPUMMSRRANGE;
879
880
881/** @name Guest Register Getters.
882 * @{ */
883VMMDECL(void) CPUMGetGuestGDTR(PVMCPU pVCpu, PVBOXGDTR pGDTR);
884VMMDECL(RTGCPTR) CPUMGetGuestIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
885VMMDECL(RTSEL) CPUMGetGuestTR(PVMCPU pVCpu, PCPUMSELREGHID pHidden);
886VMMDECL(RTSEL) CPUMGetGuestLDTR(PVMCPU pVCpu);
887VMMDECL(RTSEL) CPUMGetGuestLdtrEx(PVMCPU pVCpu, uint64_t *pGCPtrBase, uint32_t *pcbLimit);
888VMMDECL(uint64_t) CPUMGetGuestCR0(PVMCPU pVCpu);
889VMMDECL(uint64_t) CPUMGetGuestCR2(PVMCPU pVCpu);
890VMMDECL(uint64_t) CPUMGetGuestCR3(PVMCPU pVCpu);
891VMMDECL(uint64_t) CPUMGetGuestCR4(PVMCPU pVCpu);
892VMMDECL(uint64_t) CPUMGetGuestCR8(PVMCPU pVCpu);
893VMMDECL(int) CPUMGetGuestCRx(PVMCPU pVCpu, unsigned iReg, uint64_t *pValue);
894VMMDECL(uint32_t) CPUMGetGuestEFlags(PVMCPU pVCpu);
895VMMDECL(uint32_t) CPUMGetGuestEIP(PVMCPU pVCpu);
896VMMDECL(uint64_t) CPUMGetGuestRIP(PVMCPU pVCpu);
897VMMDECL(uint32_t) CPUMGetGuestEAX(PVMCPU pVCpu);
898VMMDECL(uint32_t) CPUMGetGuestEBX(PVMCPU pVCpu);
899VMMDECL(uint32_t) CPUMGetGuestECX(PVMCPU pVCpu);
900VMMDECL(uint32_t) CPUMGetGuestEDX(PVMCPU pVCpu);
901VMMDECL(uint32_t) CPUMGetGuestESI(PVMCPU pVCpu);
902VMMDECL(uint32_t) CPUMGetGuestEDI(PVMCPU pVCpu);
903VMMDECL(uint32_t) CPUMGetGuestESP(PVMCPU pVCpu);
904VMMDECL(uint32_t) CPUMGetGuestEBP(PVMCPU pVCpu);
905VMMDECL(RTSEL) CPUMGetGuestCS(PVMCPU pVCpu);
906VMMDECL(RTSEL) CPUMGetGuestDS(PVMCPU pVCpu);
907VMMDECL(RTSEL) CPUMGetGuestES(PVMCPU pVCpu);
908VMMDECL(RTSEL) CPUMGetGuestFS(PVMCPU pVCpu);
909VMMDECL(RTSEL) CPUMGetGuestGS(PVMCPU pVCpu);
910VMMDECL(RTSEL) CPUMGetGuestSS(PVMCPU pVCpu);
911VMMDECL(uint64_t) CPUMGetGuestDR0(PVMCPU pVCpu);
912VMMDECL(uint64_t) CPUMGetGuestDR1(PVMCPU pVCpu);
913VMMDECL(uint64_t) CPUMGetGuestDR2(PVMCPU pVCpu);
914VMMDECL(uint64_t) CPUMGetGuestDR3(PVMCPU pVCpu);
915VMMDECL(uint64_t) CPUMGetGuestDR6(PVMCPU pVCpu);
916VMMDECL(uint64_t) CPUMGetGuestDR7(PVMCPU pVCpu);
917VMMDECL(int) CPUMGetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t *pValue);
918VMMDECL(void) CPUMGetGuestCpuId(PVMCPU pVCpu, uint32_t iLeaf, uint32_t *pEax, uint32_t *pEbx, uint32_t *pEcx, uint32_t *pEdx);
919VMMDECL(uint32_t) CPUMGetGuestCpuIdStdMax(PVM pVM);
920VMMDECL(uint32_t) CPUMGetGuestCpuIdExtMax(PVM pVM);
921VMMDECL(uint32_t) CPUMGetGuestCpuIdCentaurMax(PVM pVM);
922VMMDECL(uint64_t) CPUMGetGuestEFER(PVMCPU pVCpu);
923VMMDECL(int) CPUMQueryGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue);
924VMMDECL(int) CPUMSetGuestMsr(PVMCPU pVCpu, uint32_t idMsr, uint64_t uValue);
925VMMDECL(CPUMCPUVENDOR) CPUMGetGuestCpuVendor(PVM pVM);
926VMMDECL(CPUMCPUVENDOR) CPUMGetHostCpuVendor(PVM pVM);
927/** @} */
928
929/** @name Guest Register Setters.
930 * @{ */
931VMMDECL(int) CPUMSetGuestGDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
932VMMDECL(int) CPUMSetGuestIDTR(PVMCPU pVCpu, uint64_t GCPtrBase, uint16_t cbLimit);
933VMMDECL(int) CPUMSetGuestTR(PVMCPU pVCpu, uint16_t tr);
934VMMDECL(int) CPUMSetGuestLDTR(PVMCPU pVCpu, uint16_t ldtr);
935VMMDECL(int) CPUMSetGuestCR0(PVMCPU pVCpu, uint64_t cr0);
936VMMDECL(int) CPUMSetGuestCR2(PVMCPU pVCpu, uint64_t cr2);
937VMMDECL(int) CPUMSetGuestCR3(PVMCPU pVCpu, uint64_t cr3);
938VMMDECL(int) CPUMSetGuestCR4(PVMCPU pVCpu, uint64_t cr4);
939VMMDECL(int) CPUMSetGuestDR0(PVMCPU pVCpu, uint64_t uDr0);
940VMMDECL(int) CPUMSetGuestDR1(PVMCPU pVCpu, uint64_t uDr1);
941VMMDECL(int) CPUMSetGuestDR2(PVMCPU pVCpu, uint64_t uDr2);
942VMMDECL(int) CPUMSetGuestDR3(PVMCPU pVCpu, uint64_t uDr3);
943VMMDECL(int) CPUMSetGuestDR6(PVMCPU pVCpu, uint64_t uDr6);
944VMMDECL(int) CPUMSetGuestDR7(PVMCPU pVCpu, uint64_t uDr7);
945VMMDECL(int) CPUMSetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t Value);
946VMMDECL(int) CPUMSetGuestEFlags(PVMCPU pVCpu, uint32_t eflags);
947VMMDECL(int) CPUMSetGuestEIP(PVMCPU pVCpu, uint32_t eip);
948VMMDECL(int) CPUMSetGuestEAX(PVMCPU pVCpu, uint32_t eax);
949VMMDECL(int) CPUMSetGuestEBX(PVMCPU pVCpu, uint32_t ebx);
950VMMDECL(int) CPUMSetGuestECX(PVMCPU pVCpu, uint32_t ecx);
951VMMDECL(int) CPUMSetGuestEDX(PVMCPU pVCpu, uint32_t edx);
952VMMDECL(int) CPUMSetGuestESI(PVMCPU pVCpu, uint32_t esi);
953VMMDECL(int) CPUMSetGuestEDI(PVMCPU pVCpu, uint32_t edi);
954VMMDECL(int) CPUMSetGuestESP(PVMCPU pVCpu, uint32_t esp);
955VMMDECL(int) CPUMSetGuestEBP(PVMCPU pVCpu, uint32_t ebp);
956VMMDECL(int) CPUMSetGuestCS(PVMCPU pVCpu, uint16_t cs);
957VMMDECL(int) CPUMSetGuestDS(PVMCPU pVCpu, uint16_t ds);
958VMMDECL(int) CPUMSetGuestES(PVMCPU pVCpu, uint16_t es);
959VMMDECL(int) CPUMSetGuestFS(PVMCPU pVCpu, uint16_t fs);
960VMMDECL(int) CPUMSetGuestGS(PVMCPU pVCpu, uint16_t gs);
961VMMDECL(int) CPUMSetGuestSS(PVMCPU pVCpu, uint16_t ss);
962VMMDECL(void) CPUMSetGuestEFER(PVMCPU pVCpu, uint64_t val);
963VMMDECL(void) CPUMSetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
964VMMDECL(void) CPUMClearGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
965VMMDECL(bool) CPUMGetGuestCpuIdFeature(PVM pVM, CPUMCPUIDFEATURE enmFeature);
966VMMDECL(void) CPUMSetGuestCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
967VMM_INT_DECL(void) CPUMGuestLazyLoadHiddenCsAndSs(PVMCPU pVCpu);
968VMM_INT_DECL(void) CPUMGuestLazyLoadHiddenSelectorReg(PVMCPU pVCpu, PCPUMSELREG pSReg);
969VMMR0_INT_DECL(void) CPUMR0SetGuestTscAux(PVMCPU pVCpu, uint64_t uValue);
970VMMR0_INT_DECL(uint64_t) CPUMR0GetGuestTscAux(PVMCPU pVCpu);
971/** @} */
972
973
974/** @name Misc Guest Predicate Functions.
975 * @{ */
976
977VMMDECL(bool) CPUMIsGuestIn16BitCode(PVMCPU pVCpu);
978VMMDECL(bool) CPUMIsGuestIn32BitCode(PVMCPU pVCpu);
979VMMDECL(bool) CPUMIsGuestIn64BitCode(PVMCPU pVCpu);
980VMMDECL(bool) CPUMIsGuestNXEnabled(PVMCPU pVCpu);
981VMMDECL(bool) CPUMIsGuestPageSizeExtEnabled(PVMCPU pVCpu);
982VMMDECL(bool) CPUMIsGuestPagingEnabled(PVMCPU pVCpu);
983VMMDECL(bool) CPUMIsGuestR0WriteProtEnabled(PVMCPU pVCpu);
984VMMDECL(bool) CPUMIsGuestInRealMode(PVMCPU pVCpu);
985VMMDECL(bool) CPUMIsGuestInRealOrV86Mode(PVMCPU pVCpu);
986VMMDECL(bool) CPUMIsGuestInProtectedMode(PVMCPU pVCpu);
987VMMDECL(bool) CPUMIsGuestInPagedProtectedMode(PVMCPU pVCpu);
988VMMDECL(bool) CPUMIsGuestInLongMode(PVMCPU pVCpu);
989VMMDECL(bool) CPUMIsGuestInPAEMode(PVMCPU pVCpu);
990VMM_INT_DECL(bool) CPUMIsGuestInRawMode(PVMCPU pVCpu);
991
992#ifndef VBOX_WITHOUT_UNNAMED_UNIONS
993
994/**
995 * Tests if the guest is running in real mode or not.
996 *
997 * @returns true if in real mode, otherwise false.
998 * @param pCtx Current CPU context
999 */
1000DECLINLINE(bool) CPUMIsGuestInRealModeEx(PCPUMCTX pCtx)
1001{
1002 return !(pCtx->cr0 & X86_CR0_PE);
1003}
1004
1005/**
1006 * Tests if the guest is running in real or virtual 8086 mode.
1007 *
1008 * @returns @c true if it is, @c false if not.
1009 * @param pCtx Current CPU context
1010 */
1011DECLINLINE(bool) CPUMIsGuestInRealOrV86ModeEx(PCPUMCTX pCtx)
1012{
1013 return !(pCtx->cr0 & X86_CR0_PE)
1014 || pCtx->eflags.Bits.u1VM; /* Cannot be set in long mode. Intel spec 2.3.1 "System Flags and Fields in IA-32e Mode". */
1015}
1016
1017/**
1018 * Tests if the guest is running in virtual 8086 mode.
1019 *
1020 * @returns @c true if it is, @c false if not.
1021 * @param pCtx Current CPU context
1022 */
1023DECLINLINE(bool) CPUMIsGuestInV86ModeEx(PCPUMCTX pCtx)
1024{
1025 return (pCtx->eflags.Bits.u1VM == 1);
1026}
1027
1028/**
1029 * Tests if the guest is running in paged protected or not.
1030 *
1031 * @returns true if in paged protected mode, otherwise false.
1032 * @param pVM The VM handle.
1033 */
1034DECLINLINE(bool) CPUMIsGuestInPagedProtectedModeEx(PCPUMCTX pCtx)
1035{
1036 return (pCtx->cr0 & (X86_CR0_PE | X86_CR0_PG)) == (X86_CR0_PE | X86_CR0_PG);
1037}
1038
1039/**
1040 * Tests if the guest is running in long mode or not.
1041 *
1042 * @returns true if in long mode, otherwise false.
1043 * @param pCtx Current CPU context
1044 */
1045DECLINLINE(bool) CPUMIsGuestInLongModeEx(PCPUMCTX pCtx)
1046{
1047 return (pCtx->msrEFER & MSR_K6_EFER_LMA) == MSR_K6_EFER_LMA;
1048}
1049
1050VMM_INT_DECL(bool) CPUMIsGuestIn64BitCodeSlow(PCPUMCTX pCtx);
1051
1052/**
1053 * Tests if the guest is running in 64 bits mode or not.
1054 *
1055 * @returns true if in 64 bits protected mode, otherwise false.
1056 * @param pVCpu The current virtual CPU.
1057 * @param pCtx Current CPU context
1058 */
1059DECLINLINE(bool) CPUMIsGuestIn64BitCodeEx(PCPUMCTX pCtx)
1060{
1061 if (!(pCtx->msrEFER & MSR_K6_EFER_LMA))
1062 return false;
1063 if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(NULL, &pCtx->cs))
1064 return CPUMIsGuestIn64BitCodeSlow(pCtx);
1065 return pCtx->cs.Attr.n.u1Long;
1066}
1067
1068/**
1069 * Tests if the guest has paging enabled or not.
1070 *
1071 * @returns true if paging is enabled, otherwise false.
1072 * @param pCtx Current CPU context
1073 */
1074DECLINLINE(bool) CPUMIsGuestPagingEnabledEx(PCPUMCTX pCtx)
1075{
1076 return !!(pCtx->cr0 & X86_CR0_PG);
1077}
1078
1079/**
1080 * Tests if the guest is running in PAE mode or not.
1081 *
1082 * @returns true if in PAE mode, otherwise false.
1083 * @param pCtx Current CPU context
1084 */
1085DECLINLINE(bool) CPUMIsGuestInPAEModeEx(PCPUMCTX pCtx)
1086{
1087 /* Intel mentions EFER.LMA and EFER.LME in different parts of their spec. We shall use EFER.LMA rather
1088 than EFER.LME as it reflects if the CPU has entered paging with EFER.LME set. */
1089 return ( (pCtx->cr4 & X86_CR4_PAE)
1090 && CPUMIsGuestPagingEnabledEx(pCtx)
1091 && !(pCtx->msrEFER & MSR_K6_EFER_LMA));
1092}
1093
1094#endif /* VBOX_WITHOUT_UNNAMED_UNIONS */
1095
1096/** @} */
1097
1098
1099/** @name Hypervisor Register Getters.
1100 * @{ */
1101VMMDECL(RTSEL) CPUMGetHyperCS(PVMCPU pVCpu);
1102VMMDECL(RTSEL) CPUMGetHyperDS(PVMCPU pVCpu);
1103VMMDECL(RTSEL) CPUMGetHyperES(PVMCPU pVCpu);
1104VMMDECL(RTSEL) CPUMGetHyperFS(PVMCPU pVCpu);
1105VMMDECL(RTSEL) CPUMGetHyperGS(PVMCPU pVCpu);
1106VMMDECL(RTSEL) CPUMGetHyperSS(PVMCPU pVCpu);
1107#if 0 /* these are not correct. */
1108VMMDECL(uint32_t) CPUMGetHyperCR0(PVMCPU pVCpu);
1109VMMDECL(uint32_t) CPUMGetHyperCR2(PVMCPU pVCpu);
1110VMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
1111VMMDECL(uint32_t) CPUMGetHyperCR4(PVMCPU pVCpu);
1112#endif
1113/** This register is only saved on fatal traps. */
1114VMMDECL(uint32_t) CPUMGetHyperEAX(PVMCPU pVCpu);
1115VMMDECL(uint32_t) CPUMGetHyperEBX(PVMCPU pVCpu);
1116/** This register is only saved on fatal traps. */
1117VMMDECL(uint32_t) CPUMGetHyperECX(PVMCPU pVCpu);
1118/** This register is only saved on fatal traps. */
1119VMMDECL(uint32_t) CPUMGetHyperEDX(PVMCPU pVCpu);
1120VMMDECL(uint32_t) CPUMGetHyperESI(PVMCPU pVCpu);
1121VMMDECL(uint32_t) CPUMGetHyperEDI(PVMCPU pVCpu);
1122VMMDECL(uint32_t) CPUMGetHyperEBP(PVMCPU pVCpu);
1123VMMDECL(uint32_t) CPUMGetHyperESP(PVMCPU pVCpu);
1124VMMDECL(uint32_t) CPUMGetHyperEFlags(PVMCPU pVCpu);
1125VMMDECL(uint32_t) CPUMGetHyperEIP(PVMCPU pVCpu);
1126VMMDECL(uint64_t) CPUMGetHyperRIP(PVMCPU pVCpu);
1127VMMDECL(uint32_t) CPUMGetHyperIDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
1128VMMDECL(uint32_t) CPUMGetHyperGDTR(PVMCPU pVCpu, uint16_t *pcbLimit);
1129VMMDECL(RTSEL) CPUMGetHyperLDTR(PVMCPU pVCpu);
1130VMMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVMCPU pVCpu);
1131VMMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVMCPU pVCpu);
1132VMMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVMCPU pVCpu);
1133VMMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVMCPU pVCpu);
1134VMMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVMCPU pVCpu);
1135VMMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVMCPU pVCpu);
1136VMMDECL(void) CPUMGetHyperCtx(PVMCPU pVCpu, PCPUMCTX pCtx);
1137VMMDECL(uint32_t) CPUMGetHyperCR3(PVMCPU pVCpu);
1138/** @} */
1139
1140/** @name Hypervisor Register Setters.
1141 * @{ */
1142VMMDECL(void) CPUMSetHyperGDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
1143VMMDECL(void) CPUMSetHyperLDTR(PVMCPU pVCpu, RTSEL SelLDTR);
1144VMMDECL(void) CPUMSetHyperIDTR(PVMCPU pVCpu, uint32_t addr, uint16_t limit);
1145VMMDECL(void) CPUMSetHyperCR3(PVMCPU pVCpu, uint32_t cr3);
1146VMMDECL(void) CPUMSetHyperTR(PVMCPU pVCpu, RTSEL SelTR);
1147VMMDECL(void) CPUMSetHyperCS(PVMCPU pVCpu, RTSEL SelCS);
1148VMMDECL(void) CPUMSetHyperDS(PVMCPU pVCpu, RTSEL SelDS);
1149VMMDECL(void) CPUMSetHyperES(PVMCPU pVCpu, RTSEL SelDS);
1150VMMDECL(void) CPUMSetHyperFS(PVMCPU pVCpu, RTSEL SelDS);
1151VMMDECL(void) CPUMSetHyperGS(PVMCPU pVCpu, RTSEL SelDS);
1152VMMDECL(void) CPUMSetHyperSS(PVMCPU pVCpu, RTSEL SelSS);
1153VMMDECL(void) CPUMSetHyperESP(PVMCPU pVCpu, uint32_t u32ESP);
1154VMMDECL(int) CPUMSetHyperEFlags(PVMCPU pVCpu, uint32_t Efl);
1155VMMDECL(void) CPUMSetHyperEIP(PVMCPU pVCpu, uint32_t u32EIP);
1156VMM_INT_DECL(void) CPUMSetHyperState(PVMCPU pVCpu, uint32_t u32EIP, uint32_t u32ESP, uint32_t u32EAX, uint32_t u32EDX);
1157VMMDECL(void) CPUMSetHyperDR0(PVMCPU pVCpu, RTGCUINTREG uDr0);
1158VMMDECL(void) CPUMSetHyperDR1(PVMCPU pVCpu, RTGCUINTREG uDr1);
1159VMMDECL(void) CPUMSetHyperDR2(PVMCPU pVCpu, RTGCUINTREG uDr2);
1160VMMDECL(void) CPUMSetHyperDR3(PVMCPU pVCpu, RTGCUINTREG uDr3);
1161VMMDECL(void) CPUMSetHyperDR6(PVMCPU pVCpu, RTGCUINTREG uDr6);
1162VMMDECL(void) CPUMSetHyperDR7(PVMCPU pVCpu, RTGCUINTREG uDr7);
1163VMMDECL(void) CPUMSetHyperCtx(PVMCPU pVCpu, const PCPUMCTX pCtx);
1164VMMDECL(int) CPUMRecalcHyperDRx(PVMCPU pVCpu, uint8_t iGstReg, bool fForceHyper);
1165/** @} */
1166
1167VMMDECL(void) CPUMPushHyper(PVMCPU pVCpu, uint32_t u32);
1168VMMDECL(int) CPUMQueryHyperCtxPtr(PVMCPU pVCpu, PCPUMCTX *ppCtx);
1169VMMDECL(PCPUMCTX) CPUMGetHyperCtxPtr(PVMCPU pVCpu);
1170VMMDECL(PCCPUMCTXCORE) CPUMGetHyperCtxCore(PVMCPU pVCpu);
1171VMMDECL(PCPUMCTX) CPUMQueryGuestCtxPtr(PVMCPU pVCpu);
1172VMMDECL(PCCPUMCTXCORE) CPUMGetGuestCtxCore(PVMCPU pVCpu);
1173VMM_INT_DECL(int) CPUMRawEnter(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
1174VMM_INT_DECL(int) CPUMRawLeave(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, int rc);
1175VMMDECL(uint32_t) CPUMRawGetEFlags(PVMCPU pVCpu);
1176VMMDECL(void) CPUMRawSetEFlags(PVMCPU pVCpu, uint32_t fEfl);
1177
1178/** @name Changed flags.
1179 * These flags are used to keep track of which important register that
1180 * have been changed since last they were reset. The only one allowed
1181 * to clear them is REM!
1182 * @{
1183 */
1184#define CPUM_CHANGED_FPU_REM RT_BIT(0)
1185#define CPUM_CHANGED_CR0 RT_BIT(1)
1186#define CPUM_CHANGED_CR4 RT_BIT(2)
1187#define CPUM_CHANGED_GLOBAL_TLB_FLUSH RT_BIT(3)
1188#define CPUM_CHANGED_CR3 RT_BIT(4)
1189#define CPUM_CHANGED_GDTR RT_BIT(5)
1190#define CPUM_CHANGED_IDTR RT_BIT(6)
1191#define CPUM_CHANGED_LDTR RT_BIT(7)
1192#define CPUM_CHANGED_TR RT_BIT(8) /**@< Currently unused. */
1193#define CPUM_CHANGED_SYSENTER_MSR RT_BIT(9)
1194#define CPUM_CHANGED_HIDDEN_SEL_REGS RT_BIT(10) /**@< Currently unused. */
1195#define CPUM_CHANGED_CPUID RT_BIT(11)
1196#define CPUM_CHANGED_ALL ( CPUM_CHANGED_FPU_REM \
1197 | CPUM_CHANGED_CR0 \
1198 | CPUM_CHANGED_CR4 \
1199 | CPUM_CHANGED_GLOBAL_TLB_FLUSH \
1200 | CPUM_CHANGED_CR3 \
1201 | CPUM_CHANGED_GDTR \
1202 | CPUM_CHANGED_IDTR \
1203 | CPUM_CHANGED_LDTR \
1204 | CPUM_CHANGED_TR \
1205 | CPUM_CHANGED_SYSENTER_MSR \
1206 | CPUM_CHANGED_HIDDEN_SEL_REGS \
1207 | CPUM_CHANGED_CPUID )
1208/** @} */
1209
1210VMMDECL(void) CPUMSetChangedFlags(PVMCPU pVCpu, uint32_t fChangedFlags);
1211VMMR3DECL(uint32_t) CPUMR3RemEnter(PVMCPU pVCpu, uint32_t *puCpl);
1212VMMR3DECL(void) CPUMR3RemLeave(PVMCPU pVCpu, bool fNoOutOfSyncSels);
1213VMMDECL(bool) CPUMSupportsFXSR(PVM pVM);
1214VMMDECL(bool) CPUMIsHostUsingSysEnter(PVM pVM);
1215VMMDECL(bool) CPUMIsHostUsingSysCall(PVM pVM);
1216VMMDECL(bool) CPUMIsGuestFPUStateActive(PVMCPU pVCpu);
1217VMMDECL(void) CPUMDeactivateGuestFPUState(PVMCPU pVCpu);
1218VMMDECL(bool) CPUMIsGuestDebugStateActive(PVMCPU pVCpu);
1219VMMDECL(bool) CPUMIsGuestDebugStateActivePending(PVMCPU pVCpu);
1220VMMDECL(void) CPUMDeactivateGuestDebugState(PVMCPU pVCpu);
1221VMMDECL(bool) CPUMIsHyperDebugStateActive(PVMCPU pVCpu);
1222VMMDECL(bool) CPUMIsHyperDebugStateActivePending(PVMCPU pVCpu);
1223VMMDECL(uint32_t) CPUMGetGuestCPL(PVMCPU pVCpu);
1224VMMDECL(CPUMMODE) CPUMGetGuestMode(PVMCPU pVCpu);
1225VMMDECL(uint32_t) CPUMGetGuestCodeBits(PVMCPU pVCpu);
1226VMMDECL(DISCPUMODE) CPUMGetGuestDisMode(PVMCPU pVCpu);
1227VMMDECL(uint64_t) CPUMGetGuestScalableBusFrequency(PVM pVM);
1228
1229/** @name Typical scalable bus frequency values.
1230 * @{ */
1231/** Special internal value indicating that we don't know the frequency.
1232 * @internal */
1233#define CPUM_SBUSFREQ_UNKNOWN UINT64_C(1)
1234#define CPUM_SBUSFREQ_100MHZ UINT64_C(100000000)
1235#define CPUM_SBUSFREQ_133MHZ UINT64_C(133333333)
1236#define CPUM_SBUSFREQ_167MHZ UINT64_C(166666666)
1237#define CPUM_SBUSFREQ_200MHZ UINT64_C(200000000)
1238#define CPUM_SBUSFREQ_267MHZ UINT64_C(266666666)
1239#define CPUM_SBUSFREQ_333MHZ UINT64_C(333333333)
1240#define CPUM_SBUSFREQ_400MHZ UINT64_C(400000000)
1241/** @} */
1242
1243
1244#ifdef IN_RING3
1245/** @defgroup grp_cpum_r3 The CPU Monitor(/Manager) API
1246 * @ingroup grp_cpum
1247 * @{
1248 */
1249
1250VMMR3DECL(int) CPUMR3Init(PVM pVM);
1251VMMR3DECL(int) CPUMR3InitCompleted(PVM pVM);
1252VMMR3DECL(void) CPUMR3LogCpuIds(PVM pVM);
1253VMMR3DECL(void) CPUMR3Relocate(PVM pVM);
1254VMMR3DECL(int) CPUMR3Term(PVM pVM);
1255VMMR3DECL(void) CPUMR3Reset(PVM pVM);
1256VMMR3DECL(void) CPUMR3ResetCpu(PVM pVM, PVMCPU pVCpu);
1257VMMDECL(bool) CPUMR3IsStateRestorePending(PVM pVM);
1258VMMR3DECL(void) CPUMR3SetHWVirtEx(PVM pVM, bool fHWVirtExEnabled);
1259VMMR3DECL(int) CPUMR3SetCR4Feature(PVM pVM, RTHCUINTREG fOr, RTHCUINTREG fAnd);
1260VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdStdRCPtr(PVM pVM);
1261VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdExtRCPtr(PVM pVM);
1262VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdCentaurRCPtr(PVM pVM);
1263VMMR3DECL(RCPTRTYPE(PCCPUMCPUID)) CPUMR3GetGuestCpuIdDefRCPtr(PVM pVM);
1264
1265VMMR3DECL(int) CPUMR3CpuIdInsert(PVM pVM, PCPUMCPUIDLEAF pNewLeaf);
1266VMMR3DECL(CPUMMICROARCH) CPUMR3CpuIdDetermineMicroarchEx(CPUMCPUVENDOR enmVendor, uint8_t bFamily,
1267 uint8_t bModel, uint8_t bStepping);
1268VMMR3DECL(const char *) CPUMR3MicroarchName(CPUMMICROARCH enmMicroarch);
1269VMMR3DECL(int) CPUMR3CpuIdCollectLeaves(PCPUMCPUIDLEAF *ppaLeaves, uint32_t *pcLeaves);
1270VMMR3DECL(int) CPUMR3CpuIdDetectUnknownLeafMethod(PCPUMUKNOWNCPUID penmUnknownMethod, PCPUMCPUID pDefUnknown);
1271VMMR3DECL(const char *) CPUMR3CpuIdUnknownLeafMethodName(CPUMUKNOWNCPUID enmUnknownMethod);
1272VMMR3DECL(CPUMCPUVENDOR) CPUMR3CpuIdDetectVendorEx(uint32_t uEAX, uint32_t uEBX, uint32_t uECX, uint32_t uEDX);
1273VMMR3DECL(const char *) CPUMR3CpuVendorName(CPUMCPUVENDOR enmVendor);
1274
1275VMMR3DECL(int) CPUMR3MsrRangesInsert(PVM pVM, PCCPUMMSRRANGE pNewRange);
1276
1277/** @} */
1278#endif /* IN_RING3 */
1279
1280#ifdef IN_RC
1281/** @defgroup grp_cpum_gc The CPU Monitor(/Manager) API
1282 * @ingroup grp_cpum
1283 * @{
1284 */
1285
1286/**
1287 * Calls a guest trap/interrupt handler directly
1288 *
1289 * Assumes a trap stack frame has already been setup on the guest's stack!
1290 * This function does not return!
1291 *
1292 * @param pRegFrame Original trap/interrupt context
1293 * @param selCS Code selector of handler
1294 * @param pHandler GC virtual address of handler
1295 * @param eflags Callee's EFLAGS
1296 * @param selSS Stack selector for handler
1297 * @param pEsp Stack address for handler
1298 */
1299DECLASM(void) CPUMGCCallGuestTrapHandler(PCPUMCTXCORE pRegFrame, uint32_t selCS, RTRCPTR pHandler,
1300 uint32_t eflags, uint32_t selSS, RTRCPTR pEsp);
1301
1302/**
1303 * Call guest V86 code directly.
1304 *
1305 * This function does not return!
1306 *
1307 * @param pRegFrame Original trap/interrupt context
1308 */
1309DECLASM(void) CPUMGCCallV86Code(PCPUMCTXCORE pRegFrame);
1310
1311VMMDECL(int) CPUMHandleLazyFPU(PVMCPU pVCpu);
1312VMMDECL(uint32_t) CPUMRCGetGuestCPL(PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
1313#ifdef VBOX_WITH_RAW_RING1
1314VMMDECL(void) CPUMRCRecheckRawState(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore);
1315#endif
1316
1317/** @} */
1318#endif /* IN_RC */
1319
1320#ifdef IN_RING0
1321/** @defgroup grp_cpum_r0 The CPU Monitor(/Manager) API
1322 * @ingroup grp_cpum
1323 * @{
1324 */
1325VMMR0_INT_DECL(int) CPUMR0ModuleInit(void);
1326VMMR0_INT_DECL(int) CPUMR0ModuleTerm(void);
1327VMMR0_INT_DECL(int) CPUMR0InitVM(PVM pVM);
1328VMMR0_INT_DECL(int) CPUMR0Trap07Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
1329VMMR0_INT_DECL(int) CPUMR0LoadGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
1330VMMR0_INT_DECL(int) CPUMR0SaveGuestFPU(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
1331VMMR0_INT_DECL(int) CPUMR0SaveHostDebugState(PVM pVM, PVMCPU pVCpu);
1332VMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(PVMCPU pVCpu, bool fDr6);
1333VMMR0_INT_DECL(bool) CPUMR0DebugStateMaybeSaveGuest(PVMCPU pVCpu, bool fDr6);
1334
1335VMMR0_INT_DECL(void) CPUMR0LoadGuestDebugState(PVMCPU pVCpu, bool fDr6);
1336VMMR0_INT_DECL(void) CPUMR0LoadHyperDebugState(PVMCPU pVCpu, bool fDr6);
1337#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
1338VMMR0_INT_DECL(void) CPUMR0SetLApic(PVMCPU pVCpu, RTCPUID idHostCpu);
1339#endif
1340
1341/** @} */
1342#endif /* IN_RING0 */
1343
1344/** @} */
1345RT_C_DECLS_END
1346
1347
1348#endif
1349
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette