VirtualBox

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

Last change on this file since 32536 was 32345, checked in by vboxsync, 14 years ago

Merged VBox/feature.h with VBox/param.h.

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