/* $Id: GMMR0Internal.h 82991 2020-02-05 11:46:05Z vboxsync $ */ /** @file * GMM - The Global Memory Manager, Internal Header. */ /* * Copyright (C) 2007-2020 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License (GPL) as published by the Free Software * Foundation, in version 2 as it comes in the "COPYING" file of the * VirtualBox OSE distribution. VirtualBox OSE is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ #ifndef VMM_INCLUDED_SRC_VMMR0_GMMR0Internal_h #define VMM_INCLUDED_SRC_VMMR0_GMMR0Internal_h #ifndef RT_WITHOUT_PRAGMA_ONCE # pragma once #endif #include #include /** * Shared module registration info (per VM) */ typedef struct GMMSHAREDMODULEPERVM { /** Tree node. */ AVLGCPTRNODECORE Core; /** Pointer to global shared module info. */ PGMMSHAREDMODULE pGlobalModule; /** Pointer to the region addresses. * * They can differe between VMs because of address space scrambling or * simply different loading order. */ RTGCPTR64 aRegionsGCPtrs[1]; } GMMSHAREDMODULEPERVM; /** Pointer to a GMMSHAREDMODULEPERVM. */ typedef GMMSHAREDMODULEPERVM *PGMMSHAREDMODULEPERVM; /** Pointer to a GMM allocation chunk. */ typedef struct GMMCHUNK *PGMMCHUNK; /** The GMMCHUNK::cFree shift count employed by gmmR0SelectFreeSetList. */ #define GMM_CHUNK_FREE_SET_SHIFT 4 /** Index of the list containing completely unused chunks. * The code ASSUMES this is the last list. */ #define GMM_CHUNK_FREE_SET_UNUSED_LIST (GMM_CHUNK_NUM_PAGES >> GMM_CHUNK_FREE_SET_SHIFT) /** * A set of free chunks. */ typedef struct GMMCHUNKFREESET { /** The number of free pages in the set. */ uint64_t cFreePages; /** The generation ID for the set. This is incremented whenever * something is linked or unlinked from this set. */ uint64_t idGeneration; /** Chunks ordered by increasing number of free pages. * In the final list the chunks are completely unused. */ PGMMCHUNK apLists[GMM_CHUNK_FREE_SET_UNUSED_LIST + 1]; } GMMCHUNKFREESET; /** * A per-VM allocation chunk lookup TLB entry (for GMMR0PageIdToVirt). */ typedef struct GMMPERVMCHUNKTLBE { /** The GMM::idFreeGeneration value this is valid for. */ uint64_t idGeneration; /** The chunk. */ PGMMCHUNK pChunk; } GMMPERVMCHUNKTLBE; /** Poitner to a per-VM allocation chunk TLB entry. */ typedef GMMPERVMCHUNKTLBE *PGMMPERVMCHUNKTLBE; /** The number of entries in the allocation chunk lookup TLB. */ #define GMMPERVM_CHUNKTLB_ENTRIES 32 /** Gets the TLB entry index for the given Chunk ID. */ #define GMMPERVM_CHUNKTLB_IDX(a_idChunk) ( (a_idChunk) & (GMMPERVM_CHUNKTLB_ENTRIES - 1) ) /** * The per-VM GMM data. */ typedef struct GMMPERVM { /** Free set for use in bound mode. */ GMMCHUNKFREESET Private; /** The VM statistics. */ GMMVMSTATS Stats; /** Shared module tree (per-vm). */ PAVLGCPTRNODECORE pSharedModuleTree; /** Hints at the last chunk we allocated some memory from. */ uint32_t idLastChunkHint; uint32_t u32Padding; /** Spinlock protecting the chunk lookup TLB. */ RTSPINLOCK hChunkTlbSpinLock; /** The chunk lookup TLB used by GMMR0PageIdToVirt. */ GMMPERVMCHUNKTLBE aChunkTlbEntries[GMMPERVM_CHUNKTLB_ENTRIES]; } GMMPERVM; /** Pointer to the per-VM GMM data. */ typedef GMMPERVM *PGMMPERVM; #endif /* !VMM_INCLUDED_SRC_VMMR0_GMMR0Internal_h */