VirtualBox

source: vbox/trunk/include/VBox/vmm/gmm.h

Last change on this file was 98103, checked in by vboxsync, 17 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 30.7 KB
Line 
1/** @file
2 * GMM - The Global Memory Manager.
3 */
4
5/*
6 * Copyright (C) 2007-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_gmm_h
37#define VBOX_INCLUDED_vmm_gmm_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#include <VBox/vmm/gvmm.h>
43#include <VBox/sup.h>
44#include <VBox/param.h>
45#include <VBox/ostypes.h>
46#include <iprt/avl.h>
47
48
49RT_C_DECLS_BEGIN
50
51/** @defgroup grp_gmm GMM - The Global Memory Manager
52 * @ingroup grp_vmm
53 * @{
54 */
55
56/** @def IN_GMM_R0
57 * Used to indicate whether we're inside the same link module as the ring 0
58 * part of the Global Memory Manager or not.
59 */
60#ifdef DOXYGEN_RUNNING
61# define IN_GMM_R0
62#endif
63/** @def GMMR0DECL
64 * Ring 0 GMM export or import declaration.
65 * @param type The return type of the function declaration.
66 */
67#ifdef IN_GMM_R0
68# define GMMR0DECL(type) DECLEXPORT(type) VBOXCALL
69#else
70# define GMMR0DECL(type) DECLIMPORT(type) VBOXCALL
71#endif
72
73/** @def IN_GMM_R3
74 * Used to indicate whether we're inside the same link module as the ring 3
75 * part of the Global Memory Manager or not.
76 */
77#ifdef DOXYGEN_RUNNING
78# define IN_GMM_R3
79#endif
80/** @def GMMR3DECL
81 * Ring 3 GMM export or import declaration.
82 * @param type The return type of the function declaration.
83 */
84#ifdef IN_GMM_R3
85# define GMMR3DECL(type) DECLEXPORT(type) VBOXCALL
86#else
87# define GMMR3DECL(type) DECLIMPORT(type) VBOXCALL
88#endif
89
90
91/** The chunk shift. (2^21 = 2 MB) */
92#define GMM_CHUNK_SHIFT 21
93/** The allocation chunk size. */
94#define GMM_CHUNK_SIZE (1U << GMM_CHUNK_SHIFT)
95/** The allocation chunk size in (guest) pages. */
96#define GMM_CHUNK_NUM_PAGES (1U << (GMM_CHUNK_SHIFT - GUEST_PAGE_SHIFT))
97/** The shift factor for converting a page id into a chunk id. */
98#define GMM_CHUNKID_SHIFT (GMM_CHUNK_SHIFT - GUEST_PAGE_SHIFT)
99/** The last valid Chunk ID value. */
100#define GMM_CHUNKID_LAST (GMM_PAGEID_LAST >> GMM_CHUNKID_SHIFT)
101/** The last valid Page ID value. */
102#define GMM_PAGEID_LAST UINT32_C(0xfffffff0)
103/** Mask out the page index from the Page ID. */
104#define GMM_PAGEID_IDX_MASK ((1U << GMM_CHUNKID_SHIFT) - 1)
105/** The NIL Chunk ID value. */
106#define NIL_GMM_CHUNKID 0
107/** The NIL Page ID value. */
108#define NIL_GMM_PAGEID 0
109
110#if 0 /* wrong - these are guest page pfns and not page ids! */
111/** Special Page ID used by unassigned pages. */
112#define GMM_PAGEID_UNASSIGNED 0x0fffffffU
113/** Special Page ID used by unsharable pages.
114 * Like MMIO2, shadow and heap. This is for later, obviously. */
115#define GMM_PAGEID_UNSHARABLE 0x0ffffffeU
116/** The end of the valid Page IDs. This is the first special one. */
117#define GMM_PAGEID_END 0x0ffffff0U
118#endif
119
120
121/** @def GMM_GCPHYS_LAST
122 * The last of the valid guest physical address as it applies to GMM pages.
123 *
124 * This must reflect the constraints imposed by the RTGCPHYS type and
125 * the guest page frame number used internally in GMMPAGE.
126 *
127 * @note Note this corresponds to GMM_PAGE_PFN_LAST. */
128#if HC_ARCH_BITS == 64
129# define GMM_GCPHYS_LAST UINT64_C(0x00000fffffff0000) /* 2^44 (16TB) - 0x10000 */
130#else
131# define GMM_GCPHYS_LAST UINT64_C(0x0000000fffff0000) /* 2^36 (64GB) - 0x10000 */
132#endif
133
134/**
135 * Over-commitment policy.
136 */
137typedef enum GMMOCPOLICY
138{
139 /** The usual invalid 0 value. */
140 GMMOCPOLICY_INVALID = 0,
141 /** No over-commitment, fully backed.
142 * The GMM guarantees that it will be able to allocate all of the
143 * guest RAM for a VM with OC policy. */
144 GMMOCPOLICY_NO_OC,
145 /** to-be-determined. */
146 GMMOCPOLICY_TBD,
147 /** The end of the valid policy range. */
148 GMMOCPOLICY_END,
149 /** The usual 32-bit hack. */
150 GMMOCPOLICY_32BIT_HACK = 0x7fffffff
151} GMMOCPOLICY;
152
153/**
154 * VM / Memory priority.
155 */
156typedef enum GMMPRIORITY
157{
158 /** The usual invalid 0 value. */
159 GMMPRIORITY_INVALID = 0,
160 /** High.
161 * When ballooning, ask these VMs last.
162 * When running out of memory, try not to interrupt these VMs. */
163 GMMPRIORITY_HIGH,
164 /** Normal.
165 * When ballooning, don't wait to ask these.
166 * When running out of memory, pause, save and/or kill these VMs. */
167 GMMPRIORITY_NORMAL,
168 /** Low.
169 * When ballooning, maximize these first.
170 * When running out of memory, save or kill these VMs. */
171 GMMPRIORITY_LOW,
172 /** The end of the valid priority range. */
173 GMMPRIORITY_END,
174 /** The custom 32-bit type blowup. */
175 GMMPRIORITY_32BIT_HACK = 0x7fffffff
176} GMMPRIORITY;
177
178
179/**
180 * GMM Memory Accounts.
181 */
182typedef enum GMMACCOUNT
183{
184 /** The customary invalid zero entry. */
185 GMMACCOUNT_INVALID = 0,
186 /** Account with the base allocations. */
187 GMMACCOUNT_BASE,
188 /** Account with the shadow allocations. */
189 GMMACCOUNT_SHADOW,
190 /** Account with the fixed allocations. */
191 GMMACCOUNT_FIXED,
192 /** The end of the valid values. */
193 GMMACCOUNT_END,
194 /** The usual 32-bit value to finish it off. */
195 GMMACCOUNT_32BIT_HACK = 0x7fffffff
196} GMMACCOUNT;
197
198
199/**
200 * Balloon actions.
201 */
202typedef enum
203{
204 /** Invalid zero entry. */
205 GMMBALLOONACTION_INVALID = 0,
206 /** Inflate the balloon. */
207 GMMBALLOONACTION_INFLATE,
208 /** Deflate the balloon. */
209 GMMBALLOONACTION_DEFLATE,
210 /** Puncture the balloon because of VM reset. */
211 GMMBALLOONACTION_RESET,
212 /** End of the valid actions. */
213 GMMBALLOONACTION_END,
214 /** hack forcing the size of the enum to 32-bits. */
215 GMMBALLOONACTION_MAKE_32BIT_HACK = 0x7fffffff
216} GMMBALLOONACTION;
217
218
219/**
220 * A page descriptor for use when freeing pages.
221 * See GMMR0FreePages, GMMR0BalloonedPages.
222 */
223typedef struct GMMFREEPAGEDESC
224{
225 /** The Page ID of the page to be freed. */
226 uint32_t idPage;
227} GMMFREEPAGEDESC;
228/** Pointer to a page descriptor for freeing pages. */
229typedef GMMFREEPAGEDESC *PGMMFREEPAGEDESC;
230
231
232/**
233 * A page descriptor for use when updating and allocating pages.
234 *
235 * This is a bit complicated because we want to do as much as possible
236 * with the same structure.
237 */
238typedef struct GMMPAGEDESC
239{
240 /** The physical address of the page.
241 *
242 * @input GMMR0AllocateHandyPages expects the guest physical address
243 * to update the GMMPAGE structure with. Pass GMM_GCPHYS_UNSHAREABLE
244 * when appropriate and NIL_GMMPAGEDESC_PHYS when the page wasn't used
245 * for any specific guest address.
246 *
247 * GMMR0AllocatePage expects the guest physical address to put in
248 * the GMMPAGE structure for the page it allocates for this entry.
249 * Pass NIL_GMMPAGEDESC_PHYS and GMM_GCPHYS_UNSHAREABLE as above.
250 *
251 * @output The host physical address of the allocated page.
252 * NIL_GMMPAGEDESC_PHYS on allocation failure.
253 *
254 * ASSUMES: sizeof(RTHCPHYS) >= sizeof(RTGCPHYS) and that physical addresses are
255 * limited to 63 or fewer bits (52 by AMD64 arch spec).
256 */
257 RT_GCC_EXTENSION
258 RTHCPHYS HCPhysGCPhys : 63;
259 /** Set if the memory was zeroed. */
260 RT_GCC_EXTENSION
261 RTHCPHYS fZeroed : 1;
262
263 /** The Page ID.
264 *
265 * @input GMMR0AllocateHandyPages expects the Page ID of the page to
266 * update here. NIL_GMM_PAGEID means no page should be updated.
267 *
268 * GMMR0AllocatePages requires this to be initialized to
269 * NIL_GMM_PAGEID currently.
270 *
271 * @output The ID of the page, NIL_GMM_PAGEID if the allocation failed.
272 */
273 uint32_t idPage;
274
275 /** The Page ID of the shared page was replaced by this page.
276 *
277 * @input GMMR0AllocateHandyPages expects this to indicate a shared
278 * page that has been replaced by this page and should have its
279 * reference counter decremented and perhaps be freed up. Use
280 * NIL_GMM_PAGEID if no shared page was involved.
281 *
282 * All other APIs expects NIL_GMM_PAGEID here.
283 *
284 * @output All APIs sets this to NIL_GMM_PAGEID.
285 */
286 uint32_t idSharedPage;
287} GMMPAGEDESC;
288AssertCompileSize(GMMPAGEDESC, 16);
289/** Pointer to a page allocation. */
290typedef GMMPAGEDESC *PGMMPAGEDESC;
291
292/** Special NIL value for GMMPAGEDESC::HCPhysGCPhys. */
293#define NIL_GMMPAGEDESC_PHYS UINT64_C(0x7fffffffffffffff)
294
295/** GMMPAGEDESC::HCPhysGCPhys value that indicates that the page is unsharable.
296 * @note This corresponds to GMM_PAGE_PFN_UNSHAREABLE. */
297#if HC_ARCH_BITS == 64
298# define GMM_GCPHYS_UNSHAREABLE UINT64_C(0x00000fffffff1000)
299#else
300# define GMM_GCPHYS_UNSHAREABLE UINT64_C(0x0000000fffff1000)
301#endif
302
303
304/**
305 * The allocation sizes.
306 */
307typedef struct GMMVMSIZES
308{
309 /** The number of pages of base memory.
310 * This is the sum of RAM, ROMs and handy pages. */
311 uint64_t cBasePages;
312 /** The number of pages for the shadow pool. (Can be squeezed for memory.) */
313 uint32_t cShadowPages;
314 /** The number of pages for fixed allocations like MMIO2 and the hyper heap. */
315 uint32_t cFixedPages;
316} GMMVMSIZES;
317/** Pointer to a GMMVMSIZES. */
318typedef GMMVMSIZES *PGMMVMSIZES;
319
320
321/**
322 * GMM VM statistics.
323 */
324typedef struct GMMVMSTATS
325{
326 /** The reservations. */
327 GMMVMSIZES Reserved;
328 /** The actual allocations.
329 * This includes both private and shared page allocations. */
330 GMMVMSIZES Allocated;
331
332 /** The current number of private pages. */
333 uint64_t cPrivatePages;
334 /** The current number of shared pages. */
335 uint64_t cSharedPages;
336 /** The current number of ballooned pages. */
337 uint64_t cBalloonedPages;
338 /** The max number of pages that can be ballooned. */
339 uint64_t cMaxBalloonedPages;
340 /** The number of pages we've currently requested the guest to give us.
341 * This is 0 if no pages currently requested. */
342 uint64_t cReqBalloonedPages;
343 /** The number of pages the guest has given us in response to the request.
344 * This is not reset on request completed and may be used in later decisions. */
345 uint64_t cReqActuallyBalloonedPages;
346 /** The number of pages we've currently requested the guest to take back. */
347 uint64_t cReqDeflatePages;
348 /** The number of shareable module tracked by this VM. */
349 uint32_t cShareableModules;
350
351 /** The current over-commitment policy. */
352 GMMOCPOLICY enmPolicy;
353 /** The VM priority for arbitrating VMs in low and out of memory situation.
354 * Like which VMs to start squeezing first. */
355 GMMPRIORITY enmPriority;
356 /** Whether ballooning is enabled or not. */
357 bool fBallooningEnabled;
358 /** Whether shared paging is enabled or not. */
359 bool fSharedPagingEnabled;
360 /** Whether the VM is allowed to allocate memory or not.
361 * This is used when the reservation update request fails or when the VM has
362 * been told to suspend/save/die in an out-of-memory case. */
363 bool fMayAllocate;
364 /** Explicit alignment. */
365 bool afReserved[1];
366
367
368} GMMVMSTATS;
369
370
371/**
372 * The GMM statistics.
373 */
374typedef struct GMMSTATS
375{
376 /** The maximum number of pages we're allowed to allocate
377 * (GMM::cMaxPages). */
378 uint64_t cMaxPages;
379 /** The number of pages that has been reserved (GMM::cReservedPages). */
380 uint64_t cReservedPages;
381 /** The number of pages that we have over-committed in reservations
382 * (GMM::cOverCommittedPages). */
383 uint64_t cOverCommittedPages;
384 /** The number of actually allocated (committed if you like) pages
385 * (GMM::cAllocatedPages). */
386 uint64_t cAllocatedPages;
387 /** The number of pages that are shared. A subset of cAllocatedPages.
388 * (GMM::cSharedPages) */
389 uint64_t cSharedPages;
390 /** The number of pages that are actually shared between VMs.
391 * (GMM:cDuplicatePages) */
392 uint64_t cDuplicatePages;
393 /** The number of pages that are shared that has been left behind by
394 * VMs not doing proper cleanups (GMM::cLeftBehindSharedPages). */
395 uint64_t cLeftBehindSharedPages;
396 /** The number of current ballooned pages (GMM::cBalloonedPages). */
397 uint64_t cBalloonedPages;
398 /** The number of allocation chunks (GMM::cChunks). */
399 uint32_t cChunks;
400 /** The number of freed chunks ever (GMM::cFreedChunks). */
401 uint32_t cFreedChunks;
402 /** The number of shareable modules (GMM:cShareableModules). */
403 uint64_t cShareableModules;
404 /** The current chunk freeing generation use by the per-VM TLB validation (GMM::idFreeGeneration). */
405 uint64_t idFreeGeneration;
406 /** Space reserved for later. */
407 uint64_t au64Reserved[1];
408
409 /** Statistics for the specified VM. (Zero filled if not requested.) */
410 GMMVMSTATS VMStats;
411} GMMSTATS;
412/** Pointer to the GMM statistics. */
413typedef GMMSTATS *PGMMSTATS;
414/** Const pointer to the GMM statistics. */
415typedef const GMMSTATS *PCGMMSTATS;
416
417
418GMMR0DECL(int) GMMR0Init(void);
419GMMR0DECL(void) GMMR0Term(void);
420GMMR0DECL(int) GMMR0InitPerVMData(PGVM pGVM);
421GMMR0DECL(void) GMMR0CleanupVM(PGVM pGVM);
422GMMR0DECL(int) GMMR0InitialReservation(PGVM pGVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
423 GMMOCPOLICY enmPolicy, GMMPRIORITY enmPriority);
424GMMR0DECL(int) GMMR0UpdateReservation(PGVM pGVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages);
425GMMR0DECL(int) GMMR0AllocateHandyPages(PGVM pGVM, VMCPUID idCpu, uint32_t cPagesToUpdate,
426 uint32_t cPagesToAlloc, PGMMPAGEDESC paPages);
427GMMR0DECL(int) GMMR0AllocatePages(PGVM pGVM, VMCPUID idCpu, uint32_t cPages, PGMMPAGEDESC paPages, GMMACCOUNT enmAccount);
428GMMR0DECL(int) GMMR0AllocateLargePage(PGVM pGVM, VMCPUID idCpu, uint32_t cbPage, uint32_t *pIdPage, RTHCPHYS *pHCPhys);
429GMMR0DECL(int) GMMR0FreePages(PGVM pGVM, VMCPUID idCpu, uint32_t cPages, PGMMFREEPAGEDESC paPages, GMMACCOUNT enmAccount);
430GMMR0DECL(int) GMMR0FreeLargePage(PGVM pGVM, VMCPUID idCpu, uint32_t idPage);
431GMMR0DECL(int) GMMR0BalloonedPages(PGVM pGVM, VMCPUID idCpu, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
432GMMR0DECL(int) GMMR0MapUnmapChunk(PGVM pGVM, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
433GMMR0DECL(int) GMMR0PageIdToVirt(PGVM pGVM, uint32_t idPage, void **ppv);
434GMMR0DECL(int) GMMR0RegisterSharedModule(PGVM pGVM, VMCPUID idCpu, VBOXOSFAMILY enmGuestOS, char *pszModuleName,
435 char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule, uint32_t cRegions,
436 struct VMMDEVSHAREDREGIONDESC const *paRegions);
437GMMR0DECL(int) GMMR0UnregisterSharedModule(PGVM pGVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion,
438 RTGCPTR GCBaseAddr, uint32_t cbModule);
439GMMR0DECL(int) GMMR0UnregisterAllSharedModules(PGVM pGVM, VMCPUID idCpu);
440GMMR0DECL(int) GMMR0CheckSharedModules(PGVM pGVM, VMCPUID idCpu);
441GMMR0DECL(int) GMMR0ResetSharedModules(PGVM pGVM, VMCPUID idCpu);
442GMMR0DECL(int) GMMR0QueryStatistics(PGMMSTATS pStats, PSUPDRVSESSION pSession);
443GMMR0DECL(int) GMMR0ResetStatistics(PCGMMSTATS pStats, PSUPDRVSESSION pSession);
444
445/**
446 * Request buffer for GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION.
447 * @see GMMR0InitialReservation
448 */
449typedef struct GMMINITIALRESERVATIONREQ
450{
451 /** The header. */
452 SUPVMMR0REQHDR Hdr;
453 uint64_t cBasePages; /**< @see GMMR0InitialReservation */
454 uint32_t cShadowPages; /**< @see GMMR0InitialReservation */
455 uint32_t cFixedPages; /**< @see GMMR0InitialReservation */
456 GMMOCPOLICY enmPolicy; /**< @see GMMR0InitialReservation */
457 GMMPRIORITY enmPriority; /**< @see GMMR0InitialReservation */
458} GMMINITIALRESERVATIONREQ;
459/** Pointer to a GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION request buffer. */
460typedef GMMINITIALRESERVATIONREQ *PGMMINITIALRESERVATIONREQ;
461
462GMMR0DECL(int) GMMR0InitialReservationReq(PGVM pGVM, VMCPUID idCpu, PGMMINITIALRESERVATIONREQ pReq);
463
464
465/**
466 * Request buffer for GMMR0UpdateReservationReq / VMMR0_DO_GMM_UPDATE_RESERVATION.
467 * @see GMMR0UpdateReservation
468 */
469typedef struct GMMUPDATERESERVATIONREQ
470{
471 /** The header. */
472 SUPVMMR0REQHDR Hdr;
473 uint64_t cBasePages; /**< @see GMMR0UpdateReservation */
474 uint32_t cShadowPages; /**< @see GMMR0UpdateReservation */
475 uint32_t cFixedPages; /**< @see GMMR0UpdateReservation */
476} GMMUPDATERESERVATIONREQ;
477/** Pointer to a GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION request buffer. */
478typedef GMMUPDATERESERVATIONREQ *PGMMUPDATERESERVATIONREQ;
479
480GMMR0DECL(int) GMMR0UpdateReservationReq(PGVM pGVM, VMCPUID idCpu, PGMMUPDATERESERVATIONREQ pReq);
481
482
483/**
484 * Request buffer for GMMR0AllocatePagesReq / VMMR0_DO_GMM_ALLOCATE_PAGES.
485 * @see GMMR0AllocatePages.
486 */
487typedef struct GMMALLOCATEPAGESREQ
488{
489 /** The header. */
490 SUPVMMR0REQHDR Hdr;
491 /** The account to charge the allocation to. */
492 GMMACCOUNT enmAccount;
493 /** The number of pages to allocate. */
494 uint32_t cPages;
495 /** Array of page descriptors. */
496 GMMPAGEDESC aPages[1];
497} GMMALLOCATEPAGESREQ;
498/** Pointer to a GMMR0AllocatePagesReq / VMMR0_DO_GMM_ALLOCATE_PAGES request buffer. */
499typedef GMMALLOCATEPAGESREQ *PGMMALLOCATEPAGESREQ;
500
501GMMR0DECL(int) GMMR0AllocatePagesReq(PGVM pGVM, VMCPUID idCpu, PGMMALLOCATEPAGESREQ pReq);
502
503
504/**
505 * Request buffer for GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES.
506 * @see GMMR0FreePages.
507 */
508typedef struct GMMFREEPAGESREQ
509{
510 /** The header. */
511 SUPVMMR0REQHDR Hdr;
512 /** The account this relates to. */
513 GMMACCOUNT enmAccount;
514 /** The number of pages to free. */
515 uint32_t cPages;
516 /** Array of free page descriptors. */
517 GMMFREEPAGEDESC aPages[1];
518} GMMFREEPAGESREQ;
519/** Pointer to a GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES request buffer. */
520typedef GMMFREEPAGESREQ *PGMMFREEPAGESREQ;
521
522GMMR0DECL(int) GMMR0FreePagesReq(PGVM pGVM, VMCPUID idCpu, PGMMFREEPAGESREQ pReq);
523
524/**
525 * Request buffer for GMMR0BalloonedPagesReq / VMMR0_DO_GMM_BALLOONED_PAGES.
526 * @see GMMR0BalloonedPages.
527 */
528typedef struct GMMBALLOONEDPAGESREQ
529{
530 /** The header. */
531 SUPVMMR0REQHDR Hdr;
532 /** The number of ballooned pages. */
533 uint32_t cBalloonedPages;
534 /** Inflate or deflate the balloon. */
535 GMMBALLOONACTION enmAction;
536} GMMBALLOONEDPAGESREQ;
537/** Pointer to a GMMR0BalloonedPagesReq / VMMR0_DO_GMM_BALLOONED_PAGES request buffer. */
538typedef GMMBALLOONEDPAGESREQ *PGMMBALLOONEDPAGESREQ;
539
540GMMR0DECL(int) GMMR0BalloonedPagesReq(PGVM pGVM, VMCPUID idCpu, PGMMBALLOONEDPAGESREQ pReq);
541
542
543/**
544 * Request buffer for GMMR0QueryHypervisorMemoryStatsReq / VMMR0_DO_GMM_QUERY_VMM_MEM_STATS.
545 * @see GMMR0QueryHypervisorMemoryStatsReq.
546 */
547typedef struct GMMMEMSTATSREQ
548{
549 /** The header. */
550 SUPVMMR0REQHDR Hdr;
551 /** The number of allocated pages (out). */
552 uint64_t cAllocPages;
553 /** The number of free pages (out). */
554 uint64_t cFreePages;
555 /** The number of ballooned pages (out). */
556 uint64_t cBalloonedPages;
557 /** The number of shared pages (out). */
558 uint64_t cSharedPages;
559 /** Maximum nr of pages (out). */
560 uint64_t cMaxPages;
561} GMMMEMSTATSREQ;
562/** Pointer to a GMMR0QueryHypervisorMemoryStatsReq / VMMR0_DO_GMM_QUERY_HYPERVISOR_MEM_STATS request buffer. */
563typedef GMMMEMSTATSREQ *PGMMMEMSTATSREQ;
564
565GMMR0DECL(int) GMMR0QueryHypervisorMemoryStatsReq(PGMMMEMSTATSREQ pReq);
566GMMR0DECL(int) GMMR0QueryMemoryStatsReq(PGVM pGVM, VMCPUID idCpu, PGMMMEMSTATSREQ pReq);
567
568/**
569 * Request buffer for GMMR0MapUnmapChunkReq / VMMR0_DO_GMM_MAP_UNMAP_CHUNK.
570 * @see GMMR0MapUnmapChunk
571 */
572typedef struct GMMMAPUNMAPCHUNKREQ
573{
574 /** The header. */
575 SUPVMMR0REQHDR Hdr;
576 /** The chunk to map, NIL_GMM_CHUNKID if unmap only. (IN) */
577 uint32_t idChunkMap;
578 /** The chunk to unmap, NIL_GMM_CHUNKID if map only. (IN) */
579 uint32_t idChunkUnmap;
580 /** Where the mapping address is returned. (OUT) */
581 RTR3PTR pvR3;
582} GMMMAPUNMAPCHUNKREQ;
583/** Pointer to a GMMR0MapUnmapChunkReq / VMMR0_DO_GMM_MAP_UNMAP_CHUNK request buffer. */
584typedef GMMMAPUNMAPCHUNKREQ *PGMMMAPUNMAPCHUNKREQ;
585
586GMMR0DECL(int) GMMR0MapUnmapChunkReq(PGVM pGVM, PGMMMAPUNMAPCHUNKREQ pReq);
587
588
589/**
590 * Request buffer for GMMR0FreeLargePageReq / VMMR0_DO_GMM_FREE_LARGE_PAGE.
591 * @see GMMR0FreeLargePage.
592 */
593typedef struct GMMFREELARGEPAGEREQ
594{
595 /** The header. */
596 SUPVMMR0REQHDR Hdr;
597 /** The Page ID. */
598 uint32_t idPage;
599} GMMFREELARGEPAGEREQ;
600/** Pointer to a GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES request buffer. */
601typedef GMMFREELARGEPAGEREQ *PGMMFREELARGEPAGEREQ;
602
603GMMR0DECL(int) GMMR0FreeLargePageReq(PGVM pGVM, VMCPUID idCpu, PGMMFREELARGEPAGEREQ pReq);
604
605/** Maximum length of the shared module name string, terminator included. */
606#define GMM_SHARED_MODULE_MAX_NAME_STRING 128
607/** Maximum length of the shared module version string, terminator included. */
608#define GMM_SHARED_MODULE_MAX_VERSION_STRING 16
609
610/**
611 * Request buffer for GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE.
612 * @see GMMR0RegisterSharedModule.
613 */
614typedef struct GMMREGISTERSHAREDMODULEREQ
615{
616 /** The header. */
617 SUPVMMR0REQHDR Hdr;
618 /** Shared module size. */
619 uint32_t cbModule;
620 /** Number of included region descriptors */
621 uint32_t cRegions;
622 /** Base address of the shared module. */
623 RTGCPTR64 GCBaseAddr;
624 /** Guest OS type. */
625 VBOXOSFAMILY enmGuestOS;
626 /** return code. */
627 uint32_t rc;
628 /** Module name */
629 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
630 /** Module version */
631 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
632 /** Shared region descriptor(s). */
633 VMMDEVSHAREDREGIONDESC aRegions[1];
634} GMMREGISTERSHAREDMODULEREQ;
635/** Pointer to a GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE request buffer. */
636typedef GMMREGISTERSHAREDMODULEREQ *PGMMREGISTERSHAREDMODULEREQ;
637
638GMMR0DECL(int) GMMR0RegisterSharedModuleReq(PGVM pGVM, VMCPUID idCpu, PGMMREGISTERSHAREDMODULEREQ pReq);
639
640/**
641 * Shared region descriptor
642 */
643typedef struct GMMSHAREDREGIONDESC
644{
645 /** The page offset where the region starts. */
646 uint32_t off;
647 /** Region size - adjusted by the region offset and rounded up to a
648 * page. */
649 uint32_t cb;
650 /** Pointer to physical GMM page ID array. */
651 uint32_t *paidPages;
652} GMMSHAREDREGIONDESC;
653/** Pointer to a GMMSHAREDREGIONDESC. */
654typedef GMMSHAREDREGIONDESC *PGMMSHAREDREGIONDESC;
655
656
657/**
658 * Shared module registration info (global)
659 */
660typedef struct GMMSHAREDMODULE
661{
662 /** Tree node (keyed by a hash of name & version). */
663 AVLLU32NODECORE Core;
664 /** Shared module size. */
665 uint32_t cbModule;
666 /** Number of included region descriptors */
667 uint32_t cRegions;
668 /** Number of users (VMs). */
669 uint32_t cUsers;
670 /** Guest OS family type. */
671 VBOXOSFAMILY enmGuestOS;
672 /** Module name */
673 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
674 /** Module version */
675 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
676 /** Shared region descriptor(s). */
677 GMMSHAREDREGIONDESC aRegions[1];
678} GMMSHAREDMODULE;
679/** Pointer to a GMMSHAREDMODULE. */
680typedef GMMSHAREDMODULE *PGMMSHAREDMODULE;
681
682/**
683 * Page descriptor for GMMR0SharedModuleCheckRange
684 */
685typedef struct GMMSHAREDPAGEDESC
686{
687 /** HC Physical address (in/out) */
688 RTHCPHYS HCPhys;
689 /** GC Physical address (in) */
690 RTGCPHYS GCPhys;
691 /** GMM page id. (in/out) */
692 uint32_t idPage;
693 /** CRC32 of the page in strict builds (0 if page not available).
694 * In non-strict build this serves as structure alignment. */
695 uint32_t u32StrictChecksum;
696} GMMSHAREDPAGEDESC;
697/** Pointer to a GMMSHAREDPAGEDESC. */
698typedef GMMSHAREDPAGEDESC *PGMMSHAREDPAGEDESC;
699
700GMMR0DECL(int) GMMR0SharedModuleCheckPage(PGVM pGVM, PGMMSHAREDMODULE pModule, uint32_t idxRegion, uint32_t idxPage,
701 PGMMSHAREDPAGEDESC pPageDesc);
702
703/**
704 * Request buffer for GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE.
705 * @see GMMR0UnregisterSharedModule.
706 */
707typedef struct GMMUNREGISTERSHAREDMODULEREQ
708{
709 /** The header. */
710 SUPVMMR0REQHDR Hdr;
711 /** Shared module size. */
712 uint32_t cbModule;
713 /** Align at 8 byte boundary. */
714 uint32_t u32Alignment;
715 /** Base address of the shared module. */
716 RTGCPTR64 GCBaseAddr;
717 /** Module name */
718 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
719 /** Module version */
720 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
721} GMMUNREGISTERSHAREDMODULEREQ;
722/** Pointer to a GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE request buffer. */
723typedef GMMUNREGISTERSHAREDMODULEREQ *PGMMUNREGISTERSHAREDMODULEREQ;
724
725GMMR0DECL(int) GMMR0UnregisterSharedModuleReq(PGVM pGVM, VMCPUID idCpu, PGMMUNREGISTERSHAREDMODULEREQ pReq);
726
727#if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
728/**
729 * Request buffer for GMMR0FindDuplicatePageReq / VMMR0_DO_GMM_FIND_DUPLICATE_PAGE.
730 * @see GMMR0FindDuplicatePage.
731 */
732typedef struct GMMFINDDUPLICATEPAGEREQ
733{
734 /** The header. */
735 SUPVMMR0REQHDR Hdr;
736 /** Page id. */
737 uint32_t idPage;
738 /** Duplicate flag (out) */
739 bool fDuplicate;
740} GMMFINDDUPLICATEPAGEREQ;
741/** Pointer to a GMMR0FindDuplicatePageReq / VMMR0_DO_GMM_FIND_DUPLICATE_PAGE request buffer. */
742typedef GMMFINDDUPLICATEPAGEREQ *PGMMFINDDUPLICATEPAGEREQ;
743
744GMMR0DECL(int) GMMR0FindDuplicatePageReq(PGVM pGVM, PGMMFINDDUPLICATEPAGEREQ pReq);
745#endif /* VBOX_STRICT && HC_ARCH_BITS == 64 */
746
747
748/**
749 * Request buffer for GMMR0QueryStatisticsReq / VMMR0_DO_GMM_QUERY_STATISTICS.
750 * @see GMMR0QueryStatistics.
751 */
752typedef struct GMMQUERYSTATISTICSSREQ
753{
754 /** The header. */
755 SUPVMMR0REQHDR Hdr;
756 /** The support driver session. */
757 PSUPDRVSESSION pSession;
758 /** The statistics. */
759 GMMSTATS Stats;
760} GMMQUERYSTATISTICSSREQ;
761/** Pointer to a GMMR0QueryStatisticsReq / VMMR0_DO_GMM_QUERY_STATISTICS
762 * request buffer. */
763typedef GMMQUERYSTATISTICSSREQ *PGMMQUERYSTATISTICSSREQ;
764
765GMMR0DECL(int) GMMR0QueryStatisticsReq(PGVM pGVM, PGMMQUERYSTATISTICSSREQ pReq);
766
767
768/**
769 * Request buffer for GMMR0ResetStatisticsReq / VMMR0_DO_GMM_RESET_STATISTICS.
770 * @see GMMR0ResetStatistics.
771 */
772typedef struct GMMRESETSTATISTICSSREQ
773{
774 /** The header. */
775 SUPVMMR0REQHDR Hdr;
776 /** The support driver session. */
777 PSUPDRVSESSION pSession;
778 /** The statistics to reset.
779 * Any non-zero entry will be reset (if permitted). */
780 GMMSTATS Stats;
781} GMMRESETSTATISTICSSREQ;
782/** Pointer to a GMMR0ResetStatisticsReq / VMMR0_DO_GMM_RESET_STATISTICS
783 * request buffer. */
784typedef GMMRESETSTATISTICSSREQ *PGMMRESETSTATISTICSSREQ;
785
786GMMR0DECL(int) GMMR0ResetStatisticsReq(PGVM pGVM, PGMMRESETSTATISTICSSREQ pReq);
787
788
789
790#ifdef IN_RING3
791/** @defgroup grp_gmm_r3 The Global Memory Manager Ring-3 API Wrappers
792 * @{
793 */
794GMMR3DECL(int) GMMR3InitialReservation(PVM pVM, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
795 GMMOCPOLICY enmPolicy, GMMPRIORITY enmPriority);
796GMMR3DECL(int) GMMR3UpdateReservation(PVM pVM, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages);
797GMMR3DECL(int) GMMR3AllocatePagesPrepare(PVM pVM, PGMMALLOCATEPAGESREQ *ppReq, uint32_t cPages, GMMACCOUNT enmAccount);
798GMMR3DECL(int) GMMR3AllocatePagesPerform(PVM pVM, PGMMALLOCATEPAGESREQ pReq);
799GMMR3DECL(void) GMMR3AllocatePagesCleanup(PGMMALLOCATEPAGESREQ pReq);
800GMMR3DECL(int) GMMR3FreePagesPrepare(PVM pVM, PGMMFREEPAGESREQ *ppReq, uint32_t cPages, GMMACCOUNT enmAccount);
801GMMR3DECL(void) GMMR3FreePagesRePrep(PVM pVM, PGMMFREEPAGESREQ pReq, uint32_t cPages, GMMACCOUNT enmAccount);
802GMMR3DECL(int) GMMR3FreePagesPerform(PVM pVM, PGMMFREEPAGESREQ pReq, uint32_t cActualPages);
803GMMR3DECL(void) GMMR3FreePagesCleanup(PGMMFREEPAGESREQ pReq);
804GMMR3DECL(void) GMMR3FreeAllocatedPages(PVM pVM, GMMALLOCATEPAGESREQ const *pAllocReq);
805GMMR3DECL(int) GMMR3AllocateLargePage(PVM pVM, uint32_t cbPage);
806GMMR3DECL(int) GMMR3FreeLargePage(PVM pVM, uint32_t idPage);
807GMMR3DECL(int) GMMR3MapUnmapChunk(PVM pVM, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
808GMMR3DECL(int) GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages, uint64_t *puTotalBalloonSize);
809GMMR3DECL(int) GMMR3QueryMemoryStats(PVM pVM, uint64_t *pcAllocPages, uint64_t *pcMaxPages, uint64_t *pcBalloonPages);
810GMMR3DECL(int) GMMR3BalloonedPages(PVM pVM, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
811GMMR3DECL(int) GMMR3RegisterSharedModule(PVM pVM, PGMMREGISTERSHAREDMODULEREQ pReq);
812GMMR3DECL(int) GMMR3UnregisterSharedModule(PVM pVM, PGMMUNREGISTERSHAREDMODULEREQ pReq);
813GMMR3DECL(int) GMMR3CheckSharedModules(PVM pVM);
814GMMR3DECL(int) GMMR3ResetSharedModules(PVM pVM);
815
816# if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
817GMMR3DECL(bool) GMMR3IsDuplicatePage(PVM pVM, uint32_t idPage);
818# endif
819
820/** @} */
821#endif /* IN_RING3 */
822
823/** @} */
824
825RT_C_DECLS_END
826
827#endif /* !VBOX_INCLUDED_vmm_gmm_h */
828
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use