VirtualBox

source: vbox/trunk/include/VBox/gmm.h@ 30739

Last change on this file since 30739 was 30660, checked in by vboxsync, 15 years ago

Very annoying to return informational codes without hitting assertions, so turn it into an error.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 24.0 KB
Line 
1/** @file
2 * GMM - The Global Memory Manager. (VMM)
3 */
4
5/*
6 * Copyright (C) 2007 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_gmm_h
27#define ___VBox_gmm_h
28
29#include <VBox/types.h>
30#include <VBox/gvmm.h>
31#include <VBox/sup.h>
32#include <VBox/VMMDev.h> /* for VMMDEVSHAREDREGIONDESC */
33#include <VBox/feature.h>
34#include <iprt/avl.h>
35RT_C_DECLS_BEGIN
36
37/** @defgroup grp_gmm GMM - The Global Memory Manager
38 * @{
39 */
40
41/** @def IN_GMM_R0
42 * Used to indicate whether we're inside the same link module as the ring 0
43 * part of the Global Memory Manager or not.
44 */
45#ifdef DOXYGEN_RUNNING
46# define IN_GMM_R0
47#endif
48/** @def GMMR0DECL
49 * Ring 0 GMM export or import declaration.
50 * @param type The return type of the function declaration.
51 */
52#ifdef IN_GMM_R0
53# define GMMR0DECL(type) DECLEXPORT(type) VBOXCALL
54#else
55# define GMMR0DECL(type) DECLIMPORT(type) VBOXCALL
56#endif
57
58/** @def IN_GMM_R3
59 * Used to indicate whether we're inside the same link module as the ring 3
60 * part of the Global Memory Manager or not.
61 */
62#ifdef DOXYGEN_RUNNING
63# define IN_GMM_R3
64#endif
65/** @def GMMR3DECL
66 * Ring 3 GMM export or import declaration.
67 * @param type The return type of the function declaration.
68 */
69#ifdef IN_GMM_R3
70# define GMMR3DECL(type) DECLEXPORT(type) VBOXCALL
71#else
72# define GMMR3DECL(type) DECLIMPORT(type) VBOXCALL
73#endif
74
75
76/** The chunk shift. (2^21 = 2 MB) */
77#define GMM_CHUNK_SHIFT 21
78/** The allocation chunk size. */
79#define GMM_CHUNK_SIZE (1U << GMM_CHUNK_SHIFT)
80/** The allocation chunk size in pages. */
81#define GMM_CHUNK_NUM_PAGES (1U << (GMM_CHUNK_SHIFT - PAGE_SHIFT))
82/** The shift factor for converting a page id into a chunk id. */
83#define GMM_CHUNKID_SHIFT (GMM_CHUNK_SHIFT - PAGE_SHIFT)
84/** The last valid Chunk ID value. */
85#define GMM_CHUNKID_LAST (GMM_PAGEID_LAST >> GMM_CHUNKID_SHIFT)
86/** The last valid Page ID value.
87 * The current limit is 2^28 - 1, or almost 1TB if you like.
88 * The constraints are currently dictated by PGMPAGE. */
89#define GMM_PAGEID_LAST (RT_BIT_32(28) - 1)
90/** Mask out the page index from the Page ID. */
91#define GMM_PAGEID_IDX_MASK ((1U << GMM_CHUNKID_SHIFT) - 1)
92/** The NIL Chunk ID value. */
93#define NIL_GMM_CHUNKID 0
94/** The NIL Page ID value. */
95#define NIL_GMM_PAGEID 0
96
97#if 0 /* wrong - these are guest page pfns and not page ids! */
98/** Special Page ID used by unassigned pages. */
99#define GMM_PAGEID_UNASSIGNED 0x0fffffffU
100/** Special Page ID used by unsharable pages.
101 * Like MMIO2, shadow and heap. This is for later, obviously. */
102#define GMM_PAGEID_UNSHARABLE 0x0ffffffeU
103/** The end of the valid Page IDs. This is the first special one. */
104#define GMM_PAGEID_END 0x0ffffff0U
105#endif
106
107
108/** @def GMM_GCPHYS_LAST
109 * The last of the valid guest physical address as it applies to GMM pages.
110 *
111 * This must reflect the constraints imposed by the RTGCPHYS type and
112 * the guest page frame number used internally in GMMPAGE.
113 *
114 * @note Note this corresponds to GMM_PAGE_PFN_LAST. */
115#if HC_ARCH_BITS == 64
116# define GMM_GCPHYS_LAST UINT64_C(0x00000fffffff0000) /* 2^44 (16TB) - 0x10000 */
117#else
118# define GMM_GCPHYS_LAST UINT64_C(0x0000000fffff0000) /* 2^36 (64GB) - 0x10000 */
119#endif
120
121/**
122 * Over-commitment policy.
123 */
124typedef enum GMMOCPOLICY
125{
126 /** The usual invalid 0 value. */
127 GMMOCPOLICY_INVALID = 0,
128 /** No over-commitment, fully backed.
129 * The GMM guarantees that it will be able to allocate all of the
130 * guest RAM for a VM with OC policy. */
131 GMMOCPOLICY_NO_OC,
132 /** to-be-determined. */
133 GMMOCPOLICY_TBD,
134 /** The end of the valid policy range. */
135 GMMOCPOLICY_END,
136 /** The usual 32-bit hack. */
137 GMMOCPOLICY_32BIT_HACK = 0x7fffffff
138} GMMOCPOLICY;
139
140/**
141 * VM / Memory priority.
142 */
143typedef enum GMMPRIORITY
144{
145 /** The usual invalid 0 value. */
146 GMMPRIORITY_INVALID = 0,
147 /** High.
148 * When ballooning, ask these VMs last.
149 * When running out of memory, try not to interrupt these VMs. */
150 GMMPRIORITY_HIGH,
151 /** Normal.
152 * When ballooning, don't wait to ask these.
153 * When running out of memory, pause, save and/or kill these VMs. */
154 GMMPRIORITY_NORMAL,
155 /** Low.
156 * When ballooning, maximize these first.
157 * When running out of memory, save or kill these VMs. */
158 GMMPRIORITY_LOW,
159 /** The end of the valid priority range. */
160 GMMPRIORITY_END,
161 /** The custom 32-bit type blowup. */
162 GMMPRIORITY_32BIT_HACK = 0x7fffffff
163} GMMPRIORITY;
164
165
166/**
167 * GMM Memory Accounts.
168 */
169typedef enum GMMACCOUNT
170{
171 /** The customary invalid zero entry. */
172 GMMACCOUNT_INVALID = 0,
173 /** Account with the base allocations. */
174 GMMACCOUNT_BASE,
175 /** Account with the shadow allocations. */
176 GMMACCOUNT_SHADOW,
177 /** Account with the fixed allocations. */
178 GMMACCOUNT_FIXED,
179 /** The end of the valid values. */
180 GMMACCOUNT_END,
181 /** The usual 32-bit value to finish it off. */
182 GMMACCOUNT_32BIT_HACK = 0x7fffffff
183} GMMACCOUNT;
184
185
186/**
187 * Balloon actions.
188 */
189typedef enum
190{
191 /** Invalid zero entry. */
192 GMMBALLOONACTION_INVALID = 0,
193 /** Inflate the balloon. */
194 GMMBALLOONACTION_INFLATE,
195 /** Deflate the balloon. */
196 GMMBALLOONACTION_DEFLATE,
197 /** Puncture the balloon because of VM reset. */
198 GMMBALLOONACTION_RESET,
199 /** End of the valid actions. */
200 GMMBALLOONACTION_END,
201 /** hack forcing the size of the enum to 32-bits. */
202 GMMBALLOONACTION_MAKE_32BIT_HACK = 0x7fffffff
203} GMMBALLOONACTION;
204
205
206/**
207 * A page descriptor for use when freeing pages.
208 * See GMMR0FreePages, GMMR0BalloonedPages.
209 */
210typedef struct GMMFREEPAGEDESC
211{
212 /** The Page ID of the page to be freed. */
213 uint32_t idPage;
214} GMMFREEPAGEDESC;
215/** Pointer to a page descriptor for freeing pages. */
216typedef GMMFREEPAGEDESC *PGMMFREEPAGEDESC;
217
218
219/**
220 * A page descriptor for use when updating and allocating pages.
221 *
222 * This is a bit complicated because we want to do as much as possible
223 * with the same structure.
224 */
225typedef struct GMMPAGEDESC
226{
227 /** The physical address of the page.
228 *
229 * @input GMMR0AllocateHandyPages expects the guest physical address
230 * to update the GMMPAGE structure with. Pass GMM_GCPHYS_UNSHAREABLE
231 * when appropriate and NIL_RTHCPHYS when the page wasn't used
232 * for any specific guest address.
233 *
234 * GMMR0AllocatePage expects the guest physical address to put in
235 * the GMMPAGE structure for the page it allocates for this entry.
236 * Pass NIL_RTHCPHYS and GMM_GCPHYS_UNSHAREABLE as above.
237 *
238 * @output The host physical address of the allocated page.
239 * NIL_RTHCPHYS on allocation failure.
240 *
241 * ASSUMES: sizeof(RTHCPHYS) >= sizeof(RTGCPHYS).
242 */
243 RTHCPHYS HCPhysGCPhys;
244
245 /** The Page ID.
246 *
247 * @intput GMMR0AllocateHandyPages expects the Page ID of the page to
248 * update here. NIL_GMM_PAGEID means no page should be updated.
249 *
250 * GMMR0AllocatePages requires this to be initialized to
251 * NIL_GMM_PAGEID currently.
252 *
253 * @output The ID of the page, NIL_GMM_PAGEID if the allocation failed.
254 */
255 uint32_t idPage;
256
257 /** The Page ID of the shared page was replaced by this page.
258 *
259 * @input GMMR0AllocateHandyPages expects this to indicate a shared
260 * page that has been replaced by this page and should have its
261 * reference counter decremented and perhaps be freed up. Use
262 * NIL_GMM_PAGEID if no shared page was involved.
263 *
264 * All other APIs expects NIL_GMM_PAGEID here.
265 *
266 * @output All APIs sets this to NIL_GMM_PAGEID.
267 */
268 uint32_t idSharedPage;
269} GMMPAGEDESC;
270AssertCompileSize(GMMPAGEDESC, 16);
271/** Pointer to a page allocation. */
272typedef GMMPAGEDESC *PGMMPAGEDESC;
273
274/** GMMPAGEDESC::HCPhysGCPhys value that indicates that the page is unsharable.
275 * @note This corresponds to GMM_PAGE_PFN_UNSHAREABLE. */
276#if HC_ARCH_BITS == 64
277# define GMM_GCPHYS_UNSHAREABLE UINT64_C(0x00000fffffff1000)
278#else
279# define GMM_GCPHYS_UNSHAREABLE UINT64_C(0x0000000fffff1000)
280#endif
281
282
283GMMR0DECL(int) GMMR0Init(void);
284GMMR0DECL(void) GMMR0Term(void);
285GMMR0DECL(void) GMMR0InitPerVMData(PGVM pGVM);
286GMMR0DECL(void) GMMR0CleanupVM(PGVM pGVM);
287GMMR0DECL(int) GMMR0InitialReservation(PVM pVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
288 GMMOCPOLICY enmPolicy, GMMPRIORITY enmPriority);
289GMMR0DECL(int) GMMR0UpdateReservation(PVM pVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages);
290GMMR0DECL(int) GMMR0AllocateHandyPages(PVM pVM, VMCPUID idCpu, uint32_t cPagesToUpdate, uint32_t cPagesToAlloc, PGMMPAGEDESC paPages);
291GMMR0DECL(int) GMMR0AllocatePages(PVM pVM, VMCPUID idCpu, uint32_t cPages, PGMMPAGEDESC paPages, GMMACCOUNT enmAccount);
292GMMR0DECL(int) GMMR0AllocateLargePage(PVM pVM, VMCPUID idCpu, uint32_t cbPage, uint32_t *pIdPage, RTHCPHYS *pHCPhys);
293GMMR0DECL(int) GMMR0FreePages(PVM pVM, VMCPUID idCpu, uint32_t cPages, PGMMFREEPAGEDESC paPages, GMMACCOUNT enmAccount);
294GMMR0DECL(int) GMMR0FreeLargePage(PVM pVM, VMCPUID idCpu, uint32_t idPage);
295GMMR0DECL(int) GMMR0BalloonedPages(PVM pVM, VMCPUID idCpu, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
296GMMR0DECL(int) GMMR0MapUnmapChunk(PVM pVM, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
297GMMR0DECL(int) GMMR0SeedChunk(PVM pVM, VMCPUID idCpu, RTR3PTR pvR3);
298GMMR0DECL(int) GMMR0RegisterSharedModule(PVM pVM, VMCPUID idCpu, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule, unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions);
299GMMR0DECL(int) GMMR0UnregisterSharedModule(PVM pVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule);
300GMMR0DECL(int) GMMR0UnregisterAllSharedModules(PVM pVM, VMCPUID idCpu);
301GMMR0DECL(int) GMMR0CheckSharedModules(PVM pVM, PVMCPU pVCpu);
302GMMR0DECL(int) GMMR0ResetSharedModules(PVM pVM, VMCPUID idCpu);
303#ifdef LOG_ENABLED
304GMMR0DECL(int) GMMR0CheckSharedModulesStart(PVM pVM);
305GMMR0DECL(int) GMMR0CheckSharedModulesEnd(PVM pVM);
306#endif
307
308/**
309 * Request buffer for GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION.
310 * @see GMMR0InitialReservation
311 */
312typedef struct GMMINITIALRESERVATIONREQ
313{
314 /** The header. */
315 SUPVMMR0REQHDR Hdr;
316 uint64_t cBasePages; /**< @see GMMR0InitialReservation */
317 uint32_t cShadowPages; /**< @see GMMR0InitialReservation */
318 uint32_t cFixedPages; /**< @see GMMR0InitialReservation */
319 GMMOCPOLICY enmPolicy; /**< @see GMMR0InitialReservation */
320 GMMPRIORITY enmPriority; /**< @see GMMR0InitialReservation */
321} GMMINITIALRESERVATIONREQ;
322/** Pointer to a GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION request buffer. */
323typedef GMMINITIALRESERVATIONREQ *PGMMINITIALRESERVATIONREQ;
324
325GMMR0DECL(int) GMMR0InitialReservationReq(PVM pVM, VMCPUID idCpu, PGMMINITIALRESERVATIONREQ pReq);
326
327
328/**
329 * Request buffer for GMMR0UpdateReservationReq / VMMR0_DO_GMM_UPDATE_RESERVATION.
330 * @see GMMR0UpdateReservation
331 */
332typedef struct GMMUPDATERESERVATIONREQ
333{
334 /** The header. */
335 SUPVMMR0REQHDR Hdr;
336 uint64_t cBasePages; /**< @see GMMR0UpdateReservation */
337 uint32_t cShadowPages; /**< @see GMMR0UpdateReservation */
338 uint32_t cFixedPages; /**< @see GMMR0UpdateReservation */
339} GMMUPDATERESERVATIONREQ;
340/** Pointer to a GMMR0InitialReservationReq / VMMR0_DO_GMM_INITIAL_RESERVATION request buffer. */
341typedef GMMUPDATERESERVATIONREQ *PGMMUPDATERESERVATIONREQ;
342
343GMMR0DECL(int) GMMR0UpdateReservationReq(PVM pVM, VMCPUID idCpu, PGMMUPDATERESERVATIONREQ pReq);
344
345
346/**
347 * Request buffer for GMMR0AllocatePagesReq / VMMR0_DO_GMM_ALLOCATE_PAGES.
348 * @see GMMR0AllocatePages.
349 */
350typedef struct GMMALLOCATEPAGESREQ
351{
352 /** The header. */
353 SUPVMMR0REQHDR Hdr;
354 /** The account to charge the allocation to. */
355 GMMACCOUNT enmAccount;
356 /** The number of pages to allocate. */
357 uint32_t cPages;
358 /** Array of page descriptors. */
359 GMMPAGEDESC aPages[1];
360} GMMALLOCATEPAGESREQ;
361/** Pointer to a GMMR0AllocatePagesReq / VMMR0_DO_GMM_ALLOCATE_PAGES request buffer. */
362typedef GMMALLOCATEPAGESREQ *PGMMALLOCATEPAGESREQ;
363
364GMMR0DECL(int) GMMR0AllocatePagesReq(PVM pVM, VMCPUID idCpu, PGMMALLOCATEPAGESREQ pReq);
365
366
367/**
368 * Request buffer for GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES.
369 * @see GMMR0FreePages.
370 */
371typedef struct GMMFREEPAGESREQ
372{
373 /** The header. */
374 SUPVMMR0REQHDR Hdr;
375 /** The account this relates to. */
376 GMMACCOUNT enmAccount;
377 /** The number of pages to free. */
378 uint32_t cPages;
379 /** Array of free page descriptors. */
380 GMMFREEPAGEDESC aPages[1];
381} GMMFREEPAGESREQ;
382/** Pointer to a GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES request buffer. */
383typedef GMMFREEPAGESREQ *PGMMFREEPAGESREQ;
384
385GMMR0DECL(int) GMMR0FreePagesReq(PVM pVM, VMCPUID idCpu, PGMMFREEPAGESREQ pReq);
386
387/**
388 * Request buffer for GMMR0BalloonedPagesReq / VMMR0_DO_GMM_BALLOONED_PAGES.
389 * @see GMMR0BalloonedPages.
390 */
391typedef struct GMMBALLOONEDPAGESREQ
392{
393 /** The header. */
394 SUPVMMR0REQHDR Hdr;
395 /** The number of ballooned pages. */
396 uint32_t cBalloonedPages;
397 /** Inflate or deflate the balloon. */
398 GMMBALLOONACTION enmAction;
399} GMMBALLOONEDPAGESREQ;
400/** Pointer to a GMMR0BalloonedPagesReq / VMMR0_DO_GMM_BALLOONED_PAGES request buffer. */
401typedef GMMBALLOONEDPAGESREQ *PGMMBALLOONEDPAGESREQ;
402
403GMMR0DECL(int) GMMR0BalloonedPagesReq(PVM pVM, VMCPUID idCpu, PGMMBALLOONEDPAGESREQ pReq);
404
405
406/**
407 * Request buffer for GMMR0QueryHypervisorMemoryStatsReq / VMMR0_DO_GMM_QUERY_VMM_MEM_STATS.
408 * @see GMMR0QueryHypervisorMemoryStatsReq.
409 */
410typedef struct GMMMEMSTATSREQ
411{
412 /** The header. */
413 SUPVMMR0REQHDR Hdr;
414 /** The number of allocated pages (out). */
415 uint64_t cAllocPages;
416 /** The number of free pages (out). */
417 uint64_t cFreePages;
418 /** The number of ballooned pages (out). */
419 uint64_t cBalloonedPages;
420 /** The number of shared pages (out). */
421 uint64_t cSharedPages;
422 /** Maximum nr of pages (out). */
423 uint64_t cMaxPages;
424} GMMMEMSTATSREQ;
425/** Pointer to a GMMR0QueryHypervisorMemoryStatsReq / VMMR0_DO_GMM_QUERY_HYPERVISOR_MEM_STATS request buffer. */
426typedef GMMMEMSTATSREQ *PGMMMEMSTATSREQ;
427
428GMMR0DECL(int) GMMR0QueryHypervisorMemoryStatsReq(PVM pVM, PGMMMEMSTATSREQ pReq);
429GMMR0DECL(int) GMMR0QueryMemoryStatsReq(PVM pVM, VMCPUID idCpu, PGMMMEMSTATSREQ pReq);
430
431/**
432 * Request buffer for GMMR0MapUnmapChunkReq / VMMR0_DO_GMM_MAP_UNMAP_CHUNK.
433 * @see GMMR0MapUnmapChunk
434 */
435typedef struct GMMMAPUNMAPCHUNKREQ
436{
437 /** The header. */
438 SUPVMMR0REQHDR Hdr;
439 /** The chunk to map, NIL_GMM_CHUNKID if unmap only. (IN) */
440 uint32_t idChunkMap;
441 /** The chunk to unmap, NIL_GMM_CHUNKID if map only. (IN) */
442 uint32_t idChunkUnmap;
443 /** Where the mapping address is returned. (OUT) */
444 RTR3PTR pvR3;
445} GMMMAPUNMAPCHUNKREQ;
446/** Pointer to a GMMR0MapUnmapChunkReq / VMMR0_DO_GMM_MAP_UNMAP_CHUNK request buffer. */
447typedef GMMMAPUNMAPCHUNKREQ *PGMMMAPUNMAPCHUNKREQ;
448
449GMMR0DECL(int) GMMR0MapUnmapChunkReq(PVM pVM, PGMMMAPUNMAPCHUNKREQ pReq);
450
451
452/**
453 * Request buffer for GMMR0FreeLargePageReq / VMMR0_DO_GMM_FREE_LARGE_PAGE.
454 * @see GMMR0FreeLargePage.
455 */
456typedef struct GMMFREELARGEPAGEREQ
457{
458 /** The header. */
459 SUPVMMR0REQHDR Hdr;
460 /** The Page ID. */
461 uint32_t idPage;
462} GMMFREELARGEPAGEREQ;
463/** Pointer to a GMMR0FreePagesReq / VMMR0_DO_GMM_FREE_PAGES request buffer. */
464typedef GMMFREELARGEPAGEREQ *PGMMFREELARGEPAGEREQ;
465
466GMMR0DECL(int) GMMR0FreeLargePageReq(PVM pVM, VMCPUID idCpu, PGMMFREELARGEPAGEREQ pReq);
467
468/** Maximum length of the shared module name string. */
469#define GMM_SHARED_MODULE_MAX_NAME_STRING 128
470/** Maximum length of the shared module version string. */
471#define GMM_SHARED_MODULE_MAX_VERSION_STRING 16
472
473/**
474 * Request buffer for GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE.
475 * @see GMMR0RegisterSharedModule.
476 */
477typedef struct GMMREGISTERSHAREDMODULEREQ
478{
479 /** The header. */
480 SUPVMMR0REQHDR Hdr;
481 /** Shared module size. */
482 uint32_t cbModule;
483 /** Number of included region descriptors */
484 uint32_t cRegions;
485 /** Base address of the shared module. */
486 RTGCPTR64 GCBaseAddr;
487 /** Guest OS type. */
488 VBOXOSFAMILY enmGuestOS;
489 /** return code. */
490 uint32_t rc;
491 /** Module name */
492 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
493 /** Module version */
494 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
495 /** Shared region descriptor(s). */
496 VMMDEVSHAREDREGIONDESC aRegions[1];
497} GMMREGISTERSHAREDMODULEREQ;
498/** Pointer to a GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE request buffer. */
499typedef GMMREGISTERSHAREDMODULEREQ *PGMMREGISTERSHAREDMODULEREQ;
500
501GMMR0DECL(int) GMMR0RegisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMREGISTERSHAREDMODULEREQ pReq);
502
503/**
504 * Shared region descriptor
505 */
506typedef struct GMMSHAREDREGIONDESC
507{
508 /** Region base address. */
509 RTGCPTR64 GCRegionAddr;
510 /** Region size. */
511 uint32_t cbRegion;
512 /** Alignment. */
513 uint32_t u32Alignment;
514 /** Pointer to physical page id array. */
515 uint32_t *paHCPhysPageID;
516} GMMSHAREDREGIONDESC;
517/** Pointer to a GMMSHAREDREGIONDESC. */
518typedef GMMSHAREDREGIONDESC *PGMMSHAREDREGIONDESC;
519
520
521/**
522 * Shared module registration info (global)
523 */
524typedef struct GMMSHAREDMODULE
525{
526 /* Tree node. */
527 AVLGCPTRNODECORE Core;
528 /** Shared module size. */
529 uint32_t cbModule;
530 /** Number of included region descriptors */
531 uint32_t cRegions;
532 /** Number of users (VMs). */
533 uint32_t cUsers;
534 /** Guest OS family type. */
535 VBOXOSFAMILY enmGuestOS;
536 /** Module name */
537 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
538 /** Module version */
539 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
540 /** Shared region descriptor(s). */
541 GMMSHAREDREGIONDESC aRegions[1];
542} GMMSHAREDMODULE;
543/** Pointer to a GMMSHAREDMODULE. */
544typedef GMMSHAREDMODULE *PGMMSHAREDMODULE;
545
546/**
547 * Page descriptor for GMMR0SharedModuleCheckRange
548 */
549typedef struct GMMSHAREDPAGEDESC
550{
551 /** HC Physical address (in/out) */
552 RTHCPHYS HCPhys;
553 /** GC Physical address (in) */
554 RTGCPHYS GCPhys;
555 /** GMM page id. (in/out) */
556 uint32_t uHCPhysPageId;
557 /** Align at 8 byte boundary. */
558 uint32_t uAlignment;
559} GMMSHAREDPAGEDESC;
560/** Pointer to a GMMSHAREDPAGEDESC. */
561typedef GMMSHAREDPAGEDESC *PGMMSHAREDPAGEDESC;
562
563GMMR0DECL(int) GMMR0SharedModuleCheckRange(PGVM pGVM, PGMMSHAREDMODULE pModule, unsigned idxRegion, unsigned cPages, PGMMSHAREDPAGEDESC paPageDesc);
564
565/**
566 * Request buffer for GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE.
567 * @see GMMR0UnregisterSharedModule.
568 */
569typedef struct GMMUNREGISTERSHAREDMODULEREQ
570{
571 /** The header. */
572 SUPVMMR0REQHDR Hdr;
573 /** Shared module size. */
574 uint32_t cbModule;
575 /** Align at 8 byte boundary. */
576 uint32_t u32Alignment;
577 /** Base address of the shared module. */
578 RTGCPTR64 GCBaseAddr;
579 /** Module name */
580 char szName[GMM_SHARED_MODULE_MAX_NAME_STRING];
581 /** Module version */
582 char szVersion[GMM_SHARED_MODULE_MAX_VERSION_STRING];
583} GMMUNREGISTERSHAREDMODULEREQ;
584/** Pointer to a GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE request buffer. */
585typedef GMMUNREGISTERSHAREDMODULEREQ *PGMMUNREGISTERSHAREDMODULEREQ;
586
587GMMR0DECL(int) GMMR0UnregisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMUNREGISTERSHAREDMODULEREQ pReq);
588
589#if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
590/**
591 * Request buffer for GMMR0FindDuplicatePageReq / VMMR0_DO_GMM_FIND_DUPLICATE_PAGE.
592 * @see GMMR0FindDuplicatePage.
593 */
594typedef struct GMMFINDDUPLICATEPAGEREQ
595{
596 /** The header. */
597 SUPVMMR0REQHDR Hdr;
598 /** Page id. */
599 uint32_t idPage;
600 /** Duplicate flag (out) */
601 bool fDuplicate;
602} GMMFINDDUPLICATEPAGEREQ;
603/** Pointer to a GMMR0FindDuplicatePageReq / VMMR0_DO_GMM_FIND_DUPLICATE_PAGE request buffer. */
604typedef GMMFINDDUPLICATEPAGEREQ *PGMMFINDDUPLICATEPAGEREQ;
605
606GMMR0DECL(int) GMMR0FindDuplicatePageReq(PVM pVM, PGMMFINDDUPLICATEPAGEREQ pReq);
607#endif /* VBOX_STRICT && HC_ARCH_BITS == 64 */
608
609#ifdef IN_RING3
610/** @defgroup grp_gmm_r3 The Global Memory Manager Ring-3 API Wrappers
611 * @ingroup grp_gmm
612 * @{
613 */
614GMMR3DECL(int) GMMR3InitialReservation(PVM pVM, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
615 GMMOCPOLICY enmPolicy, GMMPRIORITY enmPriority);
616GMMR3DECL(int) GMMR3UpdateReservation(PVM pVM, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages);
617GMMR3DECL(int) GMMR3AllocatePagesPrepare(PVM pVM, PGMMALLOCATEPAGESREQ *ppReq, uint32_t cPages, GMMACCOUNT enmAccount);
618GMMR3DECL(int) GMMR3AllocatePagesPerform(PVM pVM, PGMMALLOCATEPAGESREQ pReq);
619GMMR3DECL(void) GMMR3AllocatePagesCleanup(PGMMALLOCATEPAGESREQ pReq);
620GMMR3DECL(int) GMMR3FreePagesPrepare(PVM pVM, PGMMFREEPAGESREQ *ppReq, uint32_t cPages, GMMACCOUNT enmAccount);
621GMMR3DECL(void) GMMR3FreePagesRePrep(PVM pVM, PGMMFREEPAGESREQ pReq, uint32_t cPages, GMMACCOUNT enmAccount);
622GMMR3DECL(int) GMMR3FreePagesPerform(PVM pVM, PGMMFREEPAGESREQ pReq, uint32_t cActualPages);
623GMMR3DECL(void) GMMR3FreePagesCleanup(PGMMFREEPAGESREQ pReq);
624GMMR3DECL(void) GMMR3FreeAllocatedPages(PVM pVM, GMMALLOCATEPAGESREQ const *pAllocReq);
625GMMR3DECL(int) GMMR3AllocateLargePage(PVM pVM, uint32_t cbPage);
626GMMR3DECL(int) GMMR3FreeLargePage(PVM pVM, uint32_t idPage);
627GMMR3DECL(int) GMMR3MapUnmapChunk(PVM pVM, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
628GMMR3DECL(int) GMMR3SeedChunk(PVM pVM, RTR3PTR pvR3);
629GMMR3DECL(int) GMMR3QueryHypervisorMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages, uint64_t *puTotalBalloonSize);
630GMMR3DECL(int) GMMR3QueryMemoryStats(PVM pVM, uint64_t *pcAllocPages, uint64_t *pcMaxPages, uint64_t *pcBalloonPages);
631GMMR3DECL(int) GMMR3BalloonedPages(PVM pVM, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
632GMMR3DECL(int) GMMR3RegisterSharedModule(PVM pVM, PGMMREGISTERSHAREDMODULEREQ pReq);
633GMMR3DECL(int) GMMR3UnregisterSharedModule(PVM pVM, PGMMUNREGISTERSHAREDMODULEREQ pReq);
634GMMR3DECL(int) GMMR3CheckSharedModules(PVM pVM);
635GMMR3DECL(int) GMMR3ResetSharedModules(PVM pVM);
636
637# if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
638GMMR3DECL(bool) GMMR3IsDuplicatePage(PVM pVM, uint32_t idPage);
639# endif
640
641/** @} */
642#endif /* IN_RING3 */
643
644/** @} */
645
646RT_C_DECLS_END
647
648#endif
649
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