VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/CPUMAllRegs-armv8.cpp@ 100108

Last change on this file since 100108 was 100108, checked in by vboxsync, 18 months ago

*: Fix build issues when setting VBOX_WITH_WARNINGS_AS_ERRORS=1 on darwin.arm64 and make it a default, bugref:10469

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 KB
Line 
1/* $Id: CPUMAllRegs-armv8.cpp 100108 2023-06-07 20:05:13Z vboxsync $ */
2/** @file
3 * CPUM - CPU Monitor(/Manager) - Getters and Setters, ARMv8 variant.
4 */
5
6/*
7 * Copyright (C) 2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#define LOG_GROUP LOG_GROUP_CPUM
33#include <VBox/vmm/cpum.h>
34#include <VBox/vmm/dbgf.h>
35#include <VBox/vmm/apic.h>
36#include <VBox/vmm/pgm.h>
37#include <VBox/vmm/mm.h>
38#include <VBox/vmm/em.h>
39#include <VBox/vmm/nem.h>
40#include <VBox/vmm/hm.h>
41#include "CPUMInternal-armv8.h"
42#include <VBox/vmm/vmcc.h>
43#include <VBox/err.h>
44#include <VBox/dis.h>
45#include <VBox/log.h>
46#include <VBox/vmm/hm.h>
47#include <VBox/vmm/tm.h>
48
49#include <iprt/armv8.h>
50#include <iprt/assert.h>
51#include <iprt/asm.h>
52#ifdef IN_RING3
53# include <iprt/thread.h>
54#endif
55
56
57/*********************************************************************************************************************************
58* Defined Constants And Macros *
59*********************************************************************************************************************************/
60/**
61 * Converts a CPUMCPU::Guest pointer into a VMCPU pointer.
62 *
63 * @returns Pointer to the Virtual CPU.
64 * @param a_pGuestCtx Pointer to the guest context.
65 */
66#define CPUM_GUEST_CTX_TO_VMCPU(a_pGuestCtx) RT_FROM_MEMBER(a_pGuestCtx, VMCPU, cpum.s.Guest)
67
68/** @def CPUM_INT_ASSERT_NOT_EXTRN
69 * Macro for asserting that @a a_fNotExtrn are present.
70 *
71 * @param a_pVCpu The cross context virtual CPU structure of the calling EMT.
72 * @param a_fNotExtrn Mask of CPUMCTX_EXTRN_XXX bits to check.
73 */
74#define CPUM_INT_ASSERT_NOT_EXTRN(a_pVCpu, a_fNotExtrn) \
75 AssertMsg(!((a_pVCpu)->cpum.s.Guest.fExtrn & (a_fNotExtrn)), \
76 ("%#RX64; a_fNotExtrn=%#RX64\n", (a_pVCpu)->cpum.s.Guest.fExtrn, (a_fNotExtrn)))
77
78
79/**
80 * Queries the pointer to the internal CPUMCTX structure.
81 *
82 * @returns The CPUMCTX pointer.
83 * @param pVCpu The cross context virtual CPU structure.
84 */
85VMMDECL(PCPUMCTX) CPUMQueryGuestCtxPtr(PVMCPU pVCpu)
86{
87 return &pVCpu->cpum.s.Guest;
88}
89
90
91VMMDECL(uint64_t) CPUMGetGuestFlatPC(PVMCPU pVCpu)
92{
93 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PC);
94 return pVCpu->cpum.s.Guest.Pc.u64;
95}
96
97
98VMMDECL(uint64_t) CPUMGetGuestFlatSP(PVMCPU pVCpu)
99{
100 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_SP);
101 AssertReleaseFailed(); /** @todo Exception level. */
102 return pVCpu->cpum.s.Guest.aSpReg[0].u64;
103}
104
105
106/**
107 * Returns whether IRQs are currently masked.
108 *
109 * @returns true if IRQs are masked as indicated by the PState value.
110 * @param pVCpu The cross context virtual CPU structure.
111 */
112VMMDECL(bool) CPUMGetGuestIrqMasked(PVMCPUCC pVCpu)
113{
114 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PSTATE);
115 return RT_BOOL(pVCpu->cpum.s.Guest.fPState & ARMV8_SPSR_EL2_AARCH64_I);
116}
117
118
119/**
120 * Returns whether FIQs are currently masked.
121 *
122 * @returns true if FIQs are masked as indicated by the PState value.
123 * @param pVCpu The cross context virtual CPU structure.
124 */
125VMMDECL(bool) CPUMGetGuestFiqMasked(PVMCPUCC pVCpu)
126{
127 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PSTATE);
128 return RT_BOOL(pVCpu->cpum.s.Guest.fPState & ARMV8_SPSR_EL2_AARCH64_F);
129}
130
131
132/**
133 * Gets the host CPU vendor.
134 *
135 * @returns CPU vendor.
136 * @param pVM The cross context VM structure.
137 */
138VMMDECL(CPUMCPUVENDOR) CPUMGetHostCpuVendor(PVM pVM)
139{
140 RT_NOREF(pVM);
141 //AssertReleaseFailed();
142 return CPUMCPUVENDOR_UNKNOWN;
143}
144
145
146/**
147 * Gets the host CPU microarchitecture.
148 *
149 * @returns CPU microarchitecture.
150 * @param pVM The cross context VM structure.
151 */
152VMMDECL(CPUMMICROARCH) CPUMGetHostMicroarch(PCVM pVM)
153{
154 RT_NOREF(pVM);
155 AssertReleaseFailed();
156 return kCpumMicroarch_Unknown;
157}
158
159
160/**
161 * Gets the guest CPU vendor.
162 *
163 * @returns CPU vendor.
164 * @param pVM The cross context VM structure.
165 */
166VMMDECL(CPUMCPUVENDOR) CPUMGetGuestCpuVendor(PVM pVM)
167{
168 RT_NOREF(pVM);
169 //AssertReleaseFailed();
170 return CPUMCPUVENDOR_UNKNOWN;
171}
172
173
174/**
175 * Gets the guest CPU microarchitecture.
176 *
177 * @returns CPU microarchitecture.
178 * @param pVM The cross context VM structure.
179 */
180VMMDECL(CPUMMICROARCH) CPUMGetGuestMicroarch(PCVM pVM)
181{
182 RT_NOREF(pVM);
183 AssertReleaseFailed();
184 return kCpumMicroarch_Unknown;
185}
186
187
188/**
189 * Gets the maximum number of physical and linear address bits supported by the
190 * guest.
191 *
192 * @param pVM The cross context VM structure.
193 * @param pcPhysAddrWidth Where to store the physical address width.
194 * @param pcLinearAddrWidth Where to store the linear address width.
195 */
196VMMDECL(void) CPUMGetGuestAddrWidths(PCVM pVM, uint8_t *pcPhysAddrWidth, uint8_t *pcLinearAddrWidth)
197{
198 AssertPtr(pVM);
199 AssertReturnVoid(pcPhysAddrWidth);
200 AssertReturnVoid(pcLinearAddrWidth);
201 AssertReleaseFailed();
202 RT_NOREF(pVM);
203}
204
205
206/**
207 * Tests if the guest has the paging enabled (PG).
208 *
209 * @returns true if in real mode, otherwise false.
210 * @param pVCpu The cross context virtual CPU structure.
211 */
212VMMDECL(bool) CPUMIsGuestPagingEnabled(PCVMCPU pVCpu)
213{
214 RT_NOREF(pVCpu);
215 AssertReleaseFailed();
216 return false;
217}
218
219
220/**
221 * Tests if the guest is running in 64 bits mode or not.
222 *
223 * @returns true if in 64 bits protected mode, otherwise false.
224 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
225 */
226VMMDECL(bool) CPUMIsGuestIn64BitCode(PVMCPU pVCpu)
227{
228 RT_NOREF(pVCpu);
229 AssertReleaseFailed();
230 return false;
231}
232
233
234/**
235 * Helper for CPUMIsGuestIn64BitCodeEx that handles lazy resolving of hidden CS
236 * registers.
237 *
238 * @returns true if in 64 bits protected mode, otherwise false.
239 * @param pCtx Pointer to the current guest CPU context.
240 */
241VMM_INT_DECL(bool) CPUMIsGuestIn64BitCodeSlow(PCPUMCTX pCtx)
242{
243 return CPUMIsGuestIn64BitCode(CPUM_GUEST_CTX_TO_VMCPU(pCtx));
244}
245
246
247/**
248 * Sets the specified changed flags (CPUM_CHANGED_*).
249 *
250 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
251 * @param fChangedAdd The changed flags to add.
252 */
253VMMDECL(void) CPUMSetChangedFlags(PVMCPU pVCpu, uint32_t fChangedAdd)
254{
255 pVCpu->cpum.s.fChanged |= fChangedAdd;
256}
257
258
259/**
260 * Checks if the guest debug state is active.
261 *
262 * @returns boolean
263 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
264 */
265VMMDECL(bool) CPUMIsGuestDebugStateActive(PVMCPU pVCpu)
266{
267 return RT_BOOL(pVCpu->cpum.s.fUseFlags & CPUM_USED_DEBUG_REGS_GUEST);
268}
269
270
271/**
272 * Checks if the hyper debug state is active.
273 *
274 * @returns boolean
275 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
276 */
277VMMDECL(bool) CPUMIsHyperDebugStateActive(PVMCPU pVCpu)
278{
279 return RT_BOOL(pVCpu->cpum.s.fUseFlags & CPUM_USED_DEBUG_REGS_HYPER);
280}
281
282
283/**
284 * Mark the guest's debug state as inactive.
285 *
286 * @returns boolean
287 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
288 * @todo This API doesn't make sense any more.
289 */
290VMMDECL(void) CPUMDeactivateGuestDebugState(PVMCPU pVCpu)
291{
292 Assert(!(pVCpu->cpum.s.fUseFlags & (CPUM_USED_DEBUG_REGS_GUEST | CPUM_USED_DEBUG_REGS_HYPER)));
293 NOREF(pVCpu);
294}
295
296
297/**
298 * Get the current exception level of the guest.
299 *
300 * @returns EL
301 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
302 */
303VMMDECL(uint32_t) CPUMGetGuestEL(PVMCPU pVCpu)
304{
305 RT_NOREF(pVCpu);
306 AssertReleaseFailed();
307 return 0;
308}
309
310
311/**
312 * Gets the current guest CPU mode.
313 *
314 * If paging mode is what you need, check out PGMGetGuestMode().
315 *
316 * @returns The CPU mode.
317 * @param pVCpu The cross context virtual CPU structure.
318 */
319VMMDECL(CPUMMODE) CPUMGetGuestMode(PVMCPU pVCpu)
320{
321 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_PSTATE);
322 AssertReleaseFailed();
323 RT_NOREF(pVCpu);
324 return CPUMMODE_REAL;
325}
326
327
328/**
329 * Figure whether the CPU is currently executing 16, 32 or 64 bit code.
330 *
331 * @returns 16, 32 or 64.
332 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
333 */
334VMMDECL(uint32_t) CPUMGetGuestCodeBits(PVMCPU pVCpu)
335{
336 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_PSTATE);
337 AssertReleaseFailed();
338 RT_NOREF(pVCpu);
339 return 16;
340}
341
342
343VMMDECL(DISCPUMODE) CPUMGetGuestDisMode(PVMCPU pVCpu)
344{
345 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_PSTATE);
346 AssertReleaseFailed();
347 RT_NOREF(pVCpu);
348 return DISCPUMODE_16BIT;
349}
350
351
352/**
353 * Used to dynamically imports state residing in NEM or HM.
354 *
355 * This is a worker for the CPUM_IMPORT_EXTRN_RET() macro and various IEM ones.
356 *
357 * @returns VBox status code.
358 * @param pVCpu The cross context virtual CPU structure of the calling thread.
359 * @param fExtrnImport The fields to import.
360 * @thread EMT(pVCpu)
361 */
362VMM_INT_DECL(int) CPUMImportGuestStateOnDemand(PVMCPUCC pVCpu, uint64_t fExtrnImport)
363{
364 VMCPU_ASSERT_EMT(pVCpu);
365 if (pVCpu->cpum.s.Guest.fExtrn & fExtrnImport)
366 {
367 switch (pVCpu->cpum.s.Guest.fExtrn & CPUMCTX_EXTRN_KEEPER_MASK)
368 {
369 case CPUMCTX_EXTRN_KEEPER_NEM:
370 {
371 int rc = NEMImportStateOnDemand(pVCpu, fExtrnImport);
372 Assert(rc == VINF_SUCCESS || RT_FAILURE_NP(rc));
373 return rc;
374 }
375
376 default:
377 AssertLogRelMsgFailedReturn(("%#RX64 vs %#RX64\n", pVCpu->cpum.s.Guest.fExtrn, fExtrnImport), VERR_CPUM_IPE_2);
378 }
379 }
380 return VINF_SUCCESS;
381}
382
383
384/**
385 * Translates a microarchitecture enum value to the corresponding string
386 * constant.
387 *
388 * @returns Read-only string constant (omits "kCpumMicroarch_" prefix). Returns
389 * NULL if the value is invalid.
390 *
391 * @param enmMicroarch The enum value to convert.
392 *
393 * @todo Doesn't really belong here but for now there is no other Armv8 CPUM source file.
394 */
395VMMDECL(const char *) CPUMMicroarchName(CPUMMICROARCH enmMicroarch)
396{
397 switch (enmMicroarch)
398 {
399#define CASE_RET_STR(enmValue) case enmValue: return #enmValue + (sizeof("kCpumMicroarch_") - 1)
400 CASE_RET_STR(kCpumMicroarch_Apple_M1);
401#undef CASE_RET_STR
402 default:
403 break;
404 }
405
406 return NULL;
407}
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