VirtualBox

source: vbox/trunk/include/VBox/vmm/gvm.h@ 104840

Last change on this file since 104840 was 104840, checked in by vboxsync, 9 months ago

VMM/PGM: Refactored RAM ranges, MMIO2 ranges and ROM ranges and added MMIO ranges (to PGM) so we can safely access RAM ranges at runtime w/o fear of them ever being freed up. It is now only possible to create these during VM creation and loading, and they will live till VM destruction (except for MMIO2 which could be destroyed during loading (PCNet fun)). The lookup handling is by table instead of pointer tree. No more ring-0 pointers in shared data. bugref:10687 bugref:10093

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 10.0 KB
Line 
1/* $Id: gvm.h 104840 2024-06-05 00:59:51Z vboxsync $ */
2/** @file
3 * GVM - The Global VM Data.
4 */
5
6/*
7 * Copyright (C) 2007-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 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37#ifndef VBOX_INCLUDED_vmm_gvm_h
38#define VBOX_INCLUDED_vmm_gvm_h
39#ifndef RT_WITHOUT_PRAGMA_ONCE
40# pragma once
41#endif
42
43#ifndef USING_VMM_COMMON_DEFS
44# error "Compile job does not include VMM_COMMON_DEFS from src/VBox/Config.kmk - make sure you really need to include this file!"
45#endif
46#include <VBox/types.h>
47#include <VBox/vmm/vm.h>
48#include <VBox/param.h>
49#include <iprt/thread.h>
50#include <iprt/assertcompile.h>
51
52
53/** @defgroup grp_gvmcpu GVMCPU - The Global VMCPU Data
54 * @ingroup grp_vmm
55 * @{
56 */
57
58#if defined(__cplusplus) && !defined(GVM_C_STYLE_STRUCTURES)
59typedef struct GVMCPU : public VMCPU
60#else
61typedef struct GVMCPU
62#endif
63{
64#if !defined(__cplusplus) || defined(GVM_C_STYLE_STRUCTURES)
65 VMCPU s;
66#endif
67
68 /** VCPU id (0 - (pVM->cCpus - 1). */
69 VMCPUID idCpu;
70 /** Padding. */
71 uint32_t uPadding0;
72
73 /** Handle to the EMT thread. */
74 RTNATIVETHREAD hEMT;
75
76 /** Pointer to the global (ring-0) VM structure this CPU belongs to. */
77 R0PTRTYPE(PGVM) pGVM;
78 /** Pointer to the GVM structure, for CTX_SUFF use in VMMAll code. */
79 PGVM pVMR0;
80 /** The ring-3 address of this structure (only VMCPU part). */
81 PVMCPUR3 pVCpuR3;
82
83 /** Padding so the noisy stuff on a 64 byte boundrary.
84 * @note Keeping this working for 32-bit header syntax checking. */
85 uint8_t abPadding1[HC_ARCH_BITS == 32 ? 40 : 24];
86
87 /** Which host CPU ID is this EMT running on.
88 * Only valid when in RC or HMR0 with scheduling disabled. */
89 RTCPUID volatile idHostCpu;
90 /** The CPU set index corresponding to idHostCpu, UINT32_MAX if not valid.
91 * @remarks Best to make sure iHostCpuSet shares cache line with idHostCpu! */
92 uint32_t volatile iHostCpuSet;
93
94 /** Padding so gvmm starts on a 64 byte boundrary.
95 * @note Keeping this working for 32-bit header syntax checking. */
96 uint8_t abPadding2[56];
97
98 /** The GVMM per vcpu data. */
99 union
100 {
101#ifdef VMM_INCLUDED_SRC_VMMR0_GVMMR0Internal_h
102 struct GVMMPERVCPU s;
103#endif
104 uint8_t padding[256];
105 } gvmm;
106
107 /** The HM per vcpu data. */
108 union
109 {
110#if defined(VMM_INCLUDED_SRC_include_HMInternal_h) && defined(IN_RING0)
111 struct HMR0PERVCPU s;
112#endif
113 uint8_t padding[1024];
114 } hmr0;
115
116#ifdef VBOX_WITH_NEM_R0
117 /** The NEM per vcpu data. */
118 union
119 {
120# if defined(VMM_INCLUDED_SRC_include_NEMInternal_h) && defined(IN_RING0)
121 struct NEMR0PERVCPU s;
122# endif
123 uint8_t padding[64];
124 } nemr0;
125#endif
126
127 union
128 {
129#if defined(VMM_INCLUDED_SRC_include_VMMInternal_h) && defined(IN_RING0)
130 struct VMMR0PERVCPU s;
131#endif
132 uint8_t padding[896];
133 } vmmr0;
134
135 union
136 {
137#if defined(VMM_INCLUDED_SRC_include_PGMInternal_h) && defined(IN_RING0)
138 struct PGMR0PERVCPU s;
139#endif
140 uint8_t padding[64];
141 } pgmr0;
142
143 /** Padding the structure size to page boundrary. */
144#ifdef VBOX_WITH_NEM_R0
145 uint8_t abPadding3[16384 - 64*2 - 256 - 1024 - 64 - 896 - 64];
146#else
147 uint8_t abPadding3[16384 - 64*2 - 256 - 1024 - 896 - 64];
148#endif
149} GVMCPU;
150#if RT_GNUC_PREREQ(4, 6) && defined(__cplusplus)
151# pragma GCC diagnostic push
152#endif
153#if RT_GNUC_PREREQ(4, 3) && defined(__cplusplus)
154# pragma GCC diagnostic ignored "-Winvalid-offsetof"
155#endif
156AssertCompileMemberAlignment(GVMCPU, idCpu, 16384);
157AssertCompileMemberAlignment(GVMCPU, gvmm, 64);
158#ifdef VBOX_WITH_NEM_R0
159AssertCompileMemberAlignment(GVMCPU, nemr0, 64);
160#endif
161AssertCompileSizeAlignment(GVMCPU, 16384);
162#if RT_GNUC_PREREQ(4, 6) && defined(__cplusplus)
163# pragma GCC diagnostic pop
164#endif
165
166/** @} */
167
168/** @defgroup grp_gvm GVM - The Global VM Data
169 * @ingroup grp_vmm
170 * @{
171 */
172
173/**
174 * The Global VM Data.
175 *
176 * This is a ring-0 only structure where we put items we don't need to
177 * share with ring-3 or GC, like for instance various RTR0MEMOBJ handles.
178 *
179 * Unlike VM, there are no special alignment restrictions here. The
180 * paddings are checked by compile time assertions.
181 */
182#if defined(__cplusplus) && !defined(GVM_C_STYLE_STRUCTURES)
183typedef struct GVM : public VM
184#else
185typedef struct GVM
186#endif
187{
188#if !defined(__cplusplus) || defined(GVM_C_STYLE_STRUCTURES)
189 VM s;
190#endif
191 /** Magic / eye-catcher (GVM_MAGIC). */
192 uint32_t u32Magic;
193 /** The global VM handle for this VM. */
194 uint32_t hSelf;
195 /** Pointer to this structure (for validation purposes). */
196 PGVM pSelf;
197 /** The ring-3 mapping of the VM structure. */
198 PVMR3 pVMR3;
199 /** The support driver session the VM is associated with. */
200 PSUPDRVSESSION pSession;
201 /** Number of Virtual CPUs, i.e. how many entries there are in aCpus.
202 * Same same as VM::cCpus. */
203 uint32_t cCpus;
204 /** Padding so gvmm starts on a 64 byte boundrary. */
205 uint8_t abPadding[HC_ARCH_BITS == 32 ? 12 + 28 : 28];
206
207 /** The GVMM per vm data. */
208 union
209 {
210#ifdef VMM_INCLUDED_SRC_VMMR0_GVMMR0Internal_h
211 struct GVMMPERVM s;
212#endif
213 uint8_t padding[4352];
214 } gvmm;
215
216 /** The GMM per vm data. */
217 union
218 {
219#ifdef VMM_INCLUDED_SRC_VMMR0_GMMR0Internal_h
220 struct GMMPERVM s;
221#endif
222 uint8_t padding[1024];
223 } gmm;
224
225 /** The HM per vm data. */
226 union
227 {
228#if defined(VMM_INCLUDED_SRC_include_HMInternal_h) && defined(IN_RING0)
229 struct HMR0PERVM s;
230#endif
231 uint8_t padding[256];
232 } hmr0;
233
234#ifdef VBOX_WITH_NEM_R0
235 /** The NEM per vcpu data. */
236 union
237 {
238# if defined(VMM_INCLUDED_SRC_include_NEMInternal_h) && defined(IN_RING0)
239 struct NEMR0PERVM s;
240# endif
241 uint8_t padding[256];
242 } nemr0;
243#endif
244
245 /** The RAWPCIVM per vm data. */
246 union
247 {
248#ifdef VBOX_INCLUDED_rawpci_h
249 struct RAWPCIPERVM s;
250#endif
251 uint8_t padding[64];
252 } rawpci;
253
254 union
255 {
256#if defined(VMM_INCLUDED_SRC_include_PDMInternal_h) && defined(IN_RING0)
257 struct PDMR0PERVM s;
258#endif
259 uint8_t padding[3008];
260 } pdmr0;
261
262 union
263 {
264#if defined(VMM_INCLUDED_SRC_include_PGMInternal_h) && defined(IN_RING0)
265 struct PGMR0PERVM s;
266#endif
267 uint8_t padding[89600];
268 } pgmr0;
269
270 union
271 {
272#if defined(VMM_INCLUDED_SRC_include_IOMInternal_h) && defined(IN_RING0)
273 struct IOMR0PERVM s;
274#endif
275 uint8_t padding[512];
276 } iomr0;
277
278 union
279 {
280#if defined(VMM_INCLUDED_SRC_include_APICInternal_h) && defined(IN_RING0)
281 struct APICR0PERVM s;
282#endif
283 uint8_t padding[64];
284 } apicr0;
285
286 union
287 {
288#if defined(VMM_INCLUDED_SRC_include_DBGFInternal_h) && defined(IN_RING0)
289 struct DBGFR0PERVM s;
290#endif
291 uint8_t padding[1024];
292 } dbgfr0;
293
294 union
295 {
296#if defined(VMM_INCLUDED_SRC_include_TMInternal_h) && defined(IN_RING0)
297 TMR0PERVM s;
298#endif
299 uint8_t padding[192];
300 } tmr0;
301
302 union
303 {
304#if defined(VMM_INCLUDED_SRC_include_VMMInternal_h) && defined(IN_RING0)
305 VMMR0PERVM s;
306#endif
307 uint8_t padding[704];
308 } vmmr0;
309
310 /** Padding so aCpus starts on a page boundrary. */
311#ifdef VBOX_WITH_NEM_R0
312 uint8_t abPadding2[16384*7 - 64 - 4352 - 1024 - 256 - 256 - 64 - 3008 - 89600 - 512 - 64 - 1024 - 192 - 704 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
313#else
314 uint8_t abPadding2[16384*7 - 64 - 4352 - 1024 - 256 - 64 - 3008 - 89600 - 512 - 64 - 1024 - 192 - 704 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
315#endif
316
317 /** For simplifying CPU enumeration in VMMAll code. */
318 PGVMCPU apCpusR0[VMM_MAX_CPU_COUNT];
319
320 /** GVMCPU array for the configured number of virtual CPUs. */
321 GVMCPU aCpus[1];
322} GVM;
323#if 0
324#if RT_GNUC_PREREQ(4, 6) && defined(__cplusplus)
325# pragma GCC diagnostic push
326#endif
327#if RT_GNUC_PREREQ(4, 3) && defined(__cplusplus)
328# pragma GCC diagnostic ignored "-Winvalid-offsetof"
329#endif
330AssertCompileMemberAlignment(GVM, u32Magic, 64);
331AssertCompileMemberAlignment(GVM, gvmm, 64);
332AssertCompileMemberAlignment(GVM, gmm, 64);
333#ifdef VBOX_WITH_NEM_R0
334AssertCompileMemberAlignment(GVM, nemr0, 64);
335#endif
336AssertCompileMemberAlignment(GVM, rawpci, 64);
337AssertCompileMemberAlignment(GVM, pdmr0, 64);
338AssertCompileMemberAlignment(GVM, aCpus, 16384);
339AssertCompileSizeAlignment(GVM, 16384);
340#if RT_GNUC_PREREQ(4, 6) && defined(__cplusplus)
341# pragma GCC diagnostic pop
342#endif
343#endif
344
345/** The GVM::u32Magic value (Wayne Shorter). */
346#define GVM_MAGIC 0x19330825
347
348/** @} */
349
350#endif /* !VBOX_INCLUDED_vmm_gvm_h */
351
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