VirtualBox

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

Last change on this file since 99051 was 99051, checked in by vboxsync, 19 months ago

VMM: More ARMv8 x86/amd64 separation work, VBoxVMMArm compiles and links now, bugref:10385

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.5 KB
Line 
1/** @file
2 * CPUM - CPU Monitor(/ Manager).
3 */
4
5/*
6 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef VBOX_INCLUDED_vmm_cpum_h
37#define VBOX_INCLUDED_vmm_cpum_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#include <VBox/types.h>
43#include <VBox/vmm/cpumctx.h>
44#include <VBox/vmm/stam.h>
45#include <VBox/vmm/vmapi.h>
46#include <VBox/vmm/cpum-common.h>
47
48
49/** @defgroup grp_cpum The CPU Monitor / Manager API
50 * @ingroup grp_vmm
51 * @{
52 */
53
54/**
55 * CPU Vendor.
56 */
57typedef enum CPUMCPUVENDOR
58{
59 CPUMCPUVENDOR_INVALID = 0,
60 CPUMCPUVENDOR_INTEL,
61 CPUMCPUVENDOR_AMD,
62 CPUMCPUVENDOR_VIA,
63 CPUMCPUVENDOR_CYRIX,
64 CPUMCPUVENDOR_SHANGHAI,
65 CPUMCPUVENDOR_HYGON,
66 CPUMCPUVENDOR_APPLE, /**< ARM */
67 CPUMCPUVENDOR_UNKNOWN,
68 /** 32bit hackishness. */
69 CPUMCPUVENDOR_32BIT_HACK = 0x7fffffff
70} CPUMCPUVENDOR;
71
72
73/**
74 * CPU microarchitectures and in processor generations.
75 *
76 * @remarks The separation here is sometimes a little bit too finely grained,
77 * and the differences is more like processor generation than micro
78 * arch. This can be useful, so we'll provide functions for getting at
79 * more coarse grained info.
80 */
81typedef enum CPUMMICROARCH
82{
83 kCpumMicroarch_Invalid = 0,
84
85 /*
86 * x86 and AMD64 CPUs.
87 */
88
89 kCpumMicroarch_Intel_First,
90
91 kCpumMicroarch_Intel_8086 = kCpumMicroarch_Intel_First,
92 kCpumMicroarch_Intel_80186,
93 kCpumMicroarch_Intel_80286,
94 kCpumMicroarch_Intel_80386,
95 kCpumMicroarch_Intel_80486,
96 kCpumMicroarch_Intel_P5,
97
98 kCpumMicroarch_Intel_P6_Core_Atom_First,
99 kCpumMicroarch_Intel_P6 = kCpumMicroarch_Intel_P6_Core_Atom_First,
100 kCpumMicroarch_Intel_P6_II,
101 kCpumMicroarch_Intel_P6_III,
102
103 kCpumMicroarch_Intel_P6_M_Banias,
104 kCpumMicroarch_Intel_P6_M_Dothan,
105 kCpumMicroarch_Intel_Core_Yonah, /**< Core, also known as Enhanced Pentium M. */
106
107 kCpumMicroarch_Intel_Core2_First,
108 kCpumMicroarch_Intel_Core2_Merom = kCpumMicroarch_Intel_Core2_First, /**< 65nm, Merom/Conroe/Kentsfield/Tigerton */
109 kCpumMicroarch_Intel_Core2_Penryn, /**< 45nm, Penryn/Wolfdale/Yorkfield/Harpertown */
110 kCpumMicroarch_Intel_Core2_End,
111
112 kCpumMicroarch_Intel_Core7_First,
113 kCpumMicroarch_Intel_Core7_Nehalem = kCpumMicroarch_Intel_Core7_First,
114 kCpumMicroarch_Intel_Core7_Westmere,
115 kCpumMicroarch_Intel_Core7_SandyBridge,
116 kCpumMicroarch_Intel_Core7_IvyBridge,
117 kCpumMicroarch_Intel_Core7_Haswell,
118 kCpumMicroarch_Intel_Core7_Broadwell,
119 kCpumMicroarch_Intel_Core7_Skylake,
120 kCpumMicroarch_Intel_Core7_KabyLake,
121 kCpumMicroarch_Intel_Core7_CoffeeLake,
122 kCpumMicroarch_Intel_Core7_WhiskeyLake,
123 kCpumMicroarch_Intel_Core7_CascadeLake,
124 kCpumMicroarch_Intel_Core7_CannonLake, /**< Limited 10nm. */
125 kCpumMicroarch_Intel_Core7_CometLake, /**< 10th gen, 14nm desktop + high power mobile. */
126 kCpumMicroarch_Intel_Core7_IceLake, /**< 10th gen, 10nm mobile and some Xeons. Actually 'Sunny Cove' march. */
127 kCpumMicroarch_Intel_Core7_SunnyCove = kCpumMicroarch_Intel_Core7_IceLake,
128 kCpumMicroarch_Intel_Core7_RocketLake, /**< 11th gen, 14nm desktop + high power mobile. Aka 'Cypress Cove', backport of 'Willow Cove' to 14nm. */
129 kCpumMicroarch_Intel_Core7_CypressCove = kCpumMicroarch_Intel_Core7_RocketLake,
130 kCpumMicroarch_Intel_Core7_TigerLake, /**< 11th gen, 10nm mobile. Actually 'Willow Cove' march. */
131 kCpumMicroarch_Intel_Core7_WillowCove = kCpumMicroarch_Intel_Core7_TigerLake,
132 kCpumMicroarch_Intel_Core7_AlderLake, /**< 12th gen, 10nm all platforms(?). */
133 kCpumMicroarch_Intel_Core7_SapphireRapids, /**< 12th? gen, 10nm server? */
134 kCpumMicroarch_Intel_Core7_End,
135
136 kCpumMicroarch_Intel_Atom_First,
137 kCpumMicroarch_Intel_Atom_Bonnell = kCpumMicroarch_Intel_Atom_First,
138 kCpumMicroarch_Intel_Atom_Lincroft, /**< Second generation bonnell (44nm). */
139 kCpumMicroarch_Intel_Atom_Saltwell, /**< 32nm shrink of Bonnell. */
140 kCpumMicroarch_Intel_Atom_Silvermont, /**< 22nm */
141 kCpumMicroarch_Intel_Atom_Airmount, /**< 14nm */
142 kCpumMicroarch_Intel_Atom_Goldmont, /**< 14nm */
143 kCpumMicroarch_Intel_Atom_GoldmontPlus, /**< 14nm */
144 kCpumMicroarch_Intel_Atom_Unknown,
145 kCpumMicroarch_Intel_Atom_End,
146
147
148 kCpumMicroarch_Intel_Phi_First,
149 kCpumMicroarch_Intel_Phi_KnightsFerry = kCpumMicroarch_Intel_Phi_First,
150 kCpumMicroarch_Intel_Phi_KnightsCorner,
151 kCpumMicroarch_Intel_Phi_KnightsLanding,
152 kCpumMicroarch_Intel_Phi_KnightsHill,
153 kCpumMicroarch_Intel_Phi_KnightsMill,
154 kCpumMicroarch_Intel_Phi_End,
155
156 kCpumMicroarch_Intel_P6_Core_Atom_End,
157
158 kCpumMicroarch_Intel_NB_First,
159 kCpumMicroarch_Intel_NB_Willamette = kCpumMicroarch_Intel_NB_First, /**< 180nm */
160 kCpumMicroarch_Intel_NB_Northwood, /**< 130nm */
161 kCpumMicroarch_Intel_NB_Prescott, /**< 90nm */
162 kCpumMicroarch_Intel_NB_Prescott2M, /**< 90nm */
163 kCpumMicroarch_Intel_NB_CedarMill, /**< 65nm */
164 kCpumMicroarch_Intel_NB_Gallatin, /**< 90nm Xeon, Pentium 4 Extreme Edition ("Emergency Edition"). */
165 kCpumMicroarch_Intel_NB_Unknown,
166 kCpumMicroarch_Intel_NB_End,
167
168 kCpumMicroarch_Intel_Unknown,
169 kCpumMicroarch_Intel_End,
170
171 kCpumMicroarch_AMD_First,
172 kCpumMicroarch_AMD_Am286 = kCpumMicroarch_AMD_First,
173 kCpumMicroarch_AMD_Am386,
174 kCpumMicroarch_AMD_Am486,
175 kCpumMicroarch_AMD_Am486Enh, /**< Covers Am5x86 as well. */
176 kCpumMicroarch_AMD_K5,
177 kCpumMicroarch_AMD_K6,
178
179 kCpumMicroarch_AMD_K7_First,
180 kCpumMicroarch_AMD_K7_Palomino = kCpumMicroarch_AMD_K7_First,
181 kCpumMicroarch_AMD_K7_Spitfire,
182 kCpumMicroarch_AMD_K7_Thunderbird,
183 kCpumMicroarch_AMD_K7_Morgan,
184 kCpumMicroarch_AMD_K7_Thoroughbred,
185 kCpumMicroarch_AMD_K7_Barton,
186 kCpumMicroarch_AMD_K7_Unknown,
187 kCpumMicroarch_AMD_K7_End,
188
189 kCpumMicroarch_AMD_K8_First,
190 kCpumMicroarch_AMD_K8_130nm = kCpumMicroarch_AMD_K8_First, /**< 130nm Clawhammer, Sledgehammer, Newcastle, Paris, Odessa, Dublin */
191 kCpumMicroarch_AMD_K8_90nm, /**< 90nm shrink */
192 kCpumMicroarch_AMD_K8_90nm_DualCore, /**< 90nm with two cores. */
193 kCpumMicroarch_AMD_K8_90nm_AMDV, /**< 90nm with AMD-V (usually) and two cores (usually). */
194 kCpumMicroarch_AMD_K8_65nm, /**< 65nm shrink. */
195 kCpumMicroarch_AMD_K8_End,
196
197 kCpumMicroarch_AMD_K10,
198 kCpumMicroarch_AMD_K10_Lion,
199 kCpumMicroarch_AMD_K10_Llano,
200 kCpumMicroarch_AMD_Bobcat,
201 kCpumMicroarch_AMD_Jaguar,
202
203 kCpumMicroarch_AMD_15h_First,
204 kCpumMicroarch_AMD_15h_Bulldozer = kCpumMicroarch_AMD_15h_First,
205 kCpumMicroarch_AMD_15h_Piledriver,
206 kCpumMicroarch_AMD_15h_Steamroller, /**< Yet to be released, might have different family. */
207 kCpumMicroarch_AMD_15h_Excavator, /**< Yet to be released, might have different family. */
208 kCpumMicroarch_AMD_15h_Unknown,
209 kCpumMicroarch_AMD_15h_End,
210
211 kCpumMicroarch_AMD_16h_First,
212 kCpumMicroarch_AMD_16h_End,
213
214 kCpumMicroarch_AMD_Zen_First,
215 kCpumMicroarch_AMD_Zen_Ryzen = kCpumMicroarch_AMD_Zen_First,
216 kCpumMicroarch_AMD_Zen_End,
217
218 kCpumMicroarch_AMD_Unknown,
219 kCpumMicroarch_AMD_End,
220
221 kCpumMicroarch_Hygon_First,
222 kCpumMicroarch_Hygon_Dhyana = kCpumMicroarch_Hygon_First,
223 kCpumMicroarch_Hygon_Unknown,
224 kCpumMicroarch_Hygon_End,
225
226 kCpumMicroarch_VIA_First,
227 kCpumMicroarch_Centaur_C6 = kCpumMicroarch_VIA_First,
228 kCpumMicroarch_Centaur_C2,
229 kCpumMicroarch_Centaur_C3,
230 kCpumMicroarch_VIA_C3_M2,
231 kCpumMicroarch_VIA_C3_C5A, /**< 180nm Samuel - Cyrix III, C3, 1GigaPro. */
232 kCpumMicroarch_VIA_C3_C5B, /**< 150nm Samuel 2 - Cyrix III, C3, 1GigaPro, Eden ESP, XP 2000+. */
233 kCpumMicroarch_VIA_C3_C5C, /**< 130nm Ezra - C3, Eden ESP. */
234 kCpumMicroarch_VIA_C3_C5N, /**< 130nm Ezra-T - C3. */
235 kCpumMicroarch_VIA_C3_C5XL, /**< 130nm Nehemiah - C3, Eden ESP, Eden-N. */
236 kCpumMicroarch_VIA_C3_C5P, /**< 130nm Nehemiah+ - C3. */
237 kCpumMicroarch_VIA_C7_C5J, /**< 90nm Esther - C7, C7-D, C7-M, Eden, Eden ULV. */
238 kCpumMicroarch_VIA_Isaiah,
239 kCpumMicroarch_VIA_Unknown,
240 kCpumMicroarch_VIA_End,
241
242 kCpumMicroarch_Shanghai_First,
243 kCpumMicroarch_Shanghai_Wudaokou = kCpumMicroarch_Shanghai_First,
244 kCpumMicroarch_Shanghai_Unknown,
245 kCpumMicroarch_Shanghai_End,
246
247 kCpumMicroarch_Cyrix_First,
248 kCpumMicroarch_Cyrix_5x86 = kCpumMicroarch_Cyrix_First,
249 kCpumMicroarch_Cyrix_M1,
250 kCpumMicroarch_Cyrix_MediaGX,
251 kCpumMicroarch_Cyrix_MediaGXm,
252 kCpumMicroarch_Cyrix_M2,
253 kCpumMicroarch_Cyrix_Unknown,
254 kCpumMicroarch_Cyrix_End,
255
256 kCpumMicroarch_NEC_First,
257 kCpumMicroarch_NEC_V20 = kCpumMicroarch_NEC_First,
258 kCpumMicroarch_NEC_V30,
259 kCpumMicroarch_NEC_End,
260
261 /*
262 * ARM CPUs.
263 */
264 kCpumMicroarch_Apple_First,
265 kCpumMicroarch_Apple_M1 = kCpumMicroarch_Apple_First,
266 kCpumMicroarch_Apple_M2,
267 kCpumMicroarch_Apple_End,
268
269 /*
270 * Unknown.
271 */
272 kCpumMicroarch_Unknown,
273
274 kCpumMicroarch_32BitHack = 0x7fffffff
275} CPUMMICROARCH;
276
277
278/** Predicate macro for catching netburst CPUs. */
279#define CPUMMICROARCH_IS_INTEL_NETBURST(a_enmMicroarch) \
280 ((a_enmMicroarch) >= kCpumMicroarch_Intel_NB_First && (a_enmMicroarch) <= kCpumMicroarch_Intel_NB_End)
281
282/** Predicate macro for catching Core7 CPUs. */
283#define CPUMMICROARCH_IS_INTEL_CORE7(a_enmMicroarch) \
284 ((a_enmMicroarch) >= kCpumMicroarch_Intel_Core7_First && (a_enmMicroarch) <= kCpumMicroarch_Intel_Core7_End)
285
286/** Predicate macro for catching Core 2 CPUs. */
287#define CPUMMICROARCH_IS_INTEL_CORE2(a_enmMicroarch) \
288 ((a_enmMicroarch) >= kCpumMicroarch_Intel_Core2_First && (a_enmMicroarch) <= kCpumMicroarch_Intel_Core2_End)
289
290/** Predicate macro for catching Atom CPUs, Silvermont and upwards. */
291#define CPUMMICROARCH_IS_INTEL_SILVERMONT_PLUS(a_enmMicroarch) \
292 ((a_enmMicroarch) >= kCpumMicroarch_Intel_Atom_Silvermont && (a_enmMicroarch) <= kCpumMicroarch_Intel_Atom_End)
293
294/** Predicate macro for catching AMD Family OFh CPUs (aka K8). */
295#define CPUMMICROARCH_IS_AMD_FAM_0FH(a_enmMicroarch) \
296 ((a_enmMicroarch) >= kCpumMicroarch_AMD_K8_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_K8_End)
297
298/** Predicate macro for catching AMD Family 10H CPUs (aka K10). */
299#define CPUMMICROARCH_IS_AMD_FAM_10H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10)
300
301/** Predicate macro for catching AMD Family 11H CPUs (aka Lion). */
302#define CPUMMICROARCH_IS_AMD_FAM_11H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10_Lion)
303
304/** Predicate macro for catching AMD Family 12H CPUs (aka Llano). */
305#define CPUMMICROARCH_IS_AMD_FAM_12H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_K10_Llano)
306
307/** Predicate macro for catching AMD Family 14H CPUs (aka Bobcat). */
308#define CPUMMICROARCH_IS_AMD_FAM_14H(a_enmMicroarch) ((a_enmMicroarch) == kCpumMicroarch_AMD_Bobcat)
309
310/** Predicate macro for catching AMD Family 15H CPUs (bulldozer and it's
311 * decendants). */
312#define CPUMMICROARCH_IS_AMD_FAM_15H(a_enmMicroarch) \
313 ((a_enmMicroarch) >= kCpumMicroarch_AMD_15h_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_15h_End)
314
315/** Predicate macro for catching AMD Family 16H CPUs. */
316#define CPUMMICROARCH_IS_AMD_FAM_16H(a_enmMicroarch) \
317 ((a_enmMicroarch) >= kCpumMicroarch_AMD_16h_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_16h_End)
318
319/** Predicate macro for catching AMD Zen Family CPUs. */
320#define CPUMMICROARCH_IS_AMD_FAM_ZEN(a_enmMicroarch) \
321 ((a_enmMicroarch) >= kCpumMicroarch_AMD_Zen_First && (a_enmMicroarch) <= kCpumMicroarch_AMD_Zen_End)
322
323/** Predicate macro for catching Apple (ARM) CPUs. */
324#define CPUMMICROARCH_IS_APPLE(a_enmMicroarch) \
325 ((a_enmMicroarch) >= kCpumMicroarch_Apple_First && (a_enmMicroarch) <= kCpumMicroarch_Apple_End)
326
327
328/*
329 * Include the target specific header.
330 * This uses several of the above types, so it must be postponed till here.
331 */
332#ifndef VBOX_VMM_TARGET_ARMV8
333# include <VBox/vmm/cpum-x86-amd64.h>
334#else
335# include <VBox/vmm/cpum-armv8.h>
336#endif
337
338
339RT_C_DECLS_BEGIN
340
341#ifndef VBOX_FOR_DTRACE_LIB
342
343VMMDECL(void) CPUMSetChangedFlags(PVMCPU pVCpu, uint32_t fChangedAdd);
344VMMDECL(PCPUMCTX) CPUMQueryGuestCtxPtr(PVMCPU pVCpu);
345VMMDECL(CPUMMODE) CPUMGetGuestMode(PVMCPU pVCpu);
346VMMDECL(uint32_t) CPUMGetGuestCodeBits(PVMCPU pVCpu);
347VMMDECL(DISCPUMODE) CPUMGetGuestDisMode(PVMCPU pVCpu);
348
349/** @name Guest Register Getters.
350 * @{ */
351VMMDECL(uint64_t) CPUMGetGuestFlatPC(PVMCPU pVCpu);
352VMMDECL(uint64_t) CPUMGetGuestFlatSP(PVMCPU pVCpu);
353VMMDECL(CPUMCPUVENDOR) CPUMGetGuestCpuVendor(PVM pVM);
354VMMDECL(CPUMMICROARCH) CPUMGetGuestMicroarch(PCVM pVM);
355VMMDECL(void) CPUMGetGuestAddrWidths(PCVM pVM, uint8_t *pcPhysAddrWidth, uint8_t *pcLinearAddrWidth);
356/** @} */
357
358/** @name Misc Guest Predicate Functions.
359 * @{ */
360VMMDECL(bool) CPUMIsGuestIn64BitCode(PVMCPU pVCpu);
361/** @} */
362
363VMMDECL(CPUMCPUVENDOR) CPUMGetHostCpuVendor(PVM pVM);
364VMMDECL(CPUMMICROARCH) CPUMGetHostMicroarch(PCVM pVM);
365
366#ifdef IN_RING3
367/** @defgroup grp_cpum_r3 The CPUM ring-3 API
368 * @{
369 */
370
371VMMR3DECL(int) CPUMR3Init(PVM pVM);
372VMMR3DECL(int) CPUMR3InitCompleted(PVM pVM, VMINITCOMPLETED enmWhat);
373VMMR3DECL(void) CPUMR3LogCpuIdAndMsrFeatures(PVM pVM);
374VMMR3DECL(void) CPUMR3Relocate(PVM pVM);
375VMMR3DECL(int) CPUMR3Term(PVM pVM);
376VMMR3DECL(void) CPUMR3Reset(PVM pVM);
377VMMR3DECL(void) CPUMR3ResetCpu(PVM pVM, PVMCPU pVCpu);
378VMMDECL(bool) CPUMR3IsStateRestorePending(PVM pVM);
379VMMDECL(const char *) CPUMMicroarchName(CPUMMICROARCH enmMicroarch);
380VMMR3DECL(const char *) CPUMCpuVendorName(CPUMCPUVENDOR enmVendor);
381
382VMMR3DECL(uint32_t) CPUMR3DbGetEntries(void);
383/** Pointer to CPUMR3DbGetEntries. */
384typedef DECLCALLBACKPTR(uint32_t, PFNCPUMDBGETENTRIES, (void));
385VMMR3DECL(PCCPUMDBENTRY) CPUMR3DbGetEntryByIndex(uint32_t idxCpuDb);
386/** Pointer to CPUMR3DbGetEntryByIndex. */
387typedef DECLCALLBACKPTR(PCCPUMDBENTRY, PFNCPUMDBGETENTRYBYINDEX, (uint32_t idxCpuDb));
388VMMR3DECL(PCCPUMDBENTRY) CPUMR3DbGetEntryByName(const char *pszName);
389/** Pointer to CPUMR3DbGetEntryByName. */
390typedef DECLCALLBACKPTR(PCCPUMDBENTRY, PFNCPUMDBGETENTRYBYNAME, (const char *pszName));
391
392VMMR3_INT_DECL(void) CPUMR3NemActivateGuestDebugState(PVMCPUCC pVCpu);
393VMMR3_INT_DECL(void) CPUMR3NemActivateHyperDebugState(PVMCPUCC pVCpu);
394/** @} */
395#endif /* IN_RING3 */
396
397#endif /* !VBOX_FOR_DTRACE_LIB */
398/** @} */
399RT_C_DECLS_END
400
401
402#endif /* !VBOX_INCLUDED_vmm_cpum_h */
403
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