VirtualBox

Changeset 30761 in vbox


Ignore:
Timestamp:
Jul 9, 2010 1:27:50 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63545
Message:

Added .pgmsharedmodules debug command

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r30733 r30761  
    641641static DECLCALLBACK(int)  pgmR3CmdAssertCR3(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);
    642642# endif
    643 # if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
    644 static DECLCALLBACK(int)  pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);
    645 # endif
    646643static DECLCALLBACK(int)  pgmR3CmdPhysToFile(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);
    647644#endif
     
    679676#if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
    680677    { "pgmcheckduppages", 0, 0,     NULL,                     0,            NULL,               0,          pgmR3CmdCheckDuplicatePages,  "",           "Check for duplicate pages in all running VMs." },
     678    { "pgmsharedmodules", 0, 0,     NULL,                     0,            NULL,               0,          pgmR3CmdShowSharedModules,  "",             "Print shared modules info." },
    681679#endif
    682680    { "pgmsyncalways", 0, 0,        NULL,                     0,            NULL,               0,          pgmR3CmdSyncAlways, "",                     "Toggle permanent CR3 syncing." },
     
    41694167#endif /* VBOX_STRICT */
    41704168
    4171 #if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
    4172 /**
    4173  * The '.pgmcheckduppages' command.
    4174  *
    4175  * @returns VBox status.
    4176  * @param   pCmd        Pointer to the command descriptor (as registered).
    4177  * @param   pCmdHlp     Pointer to command helper functions.
    4178  * @param   pVM         Pointer to the current VM (if any).
    4179  * @param   paArgs      Pointer to (readonly) array of arguments.
    4180  * @param   cArgs       Number of arguments in the array.
    4181  */
    4182 static DECLCALLBACK(int)  pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult)
    4183 {
    4184     unsigned cBallooned = 0;
    4185     unsigned cShared = 0;
    4186     unsigned cZero = 0;
    4187     unsigned cUnique = 0;
    4188     unsigned cDuplicate = 0;
    4189     unsigned cAllocZero = 0;
    4190     unsigned cPages = 0;
    4191 
    4192     pgmLock(pVM);
    4193 
    4194     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
    4195     {
    4196         PPGMPAGE    pPage  = &pRam->aPages[0];
    4197         RTGCPHYS    GCPhys = pRam->GCPhys;
    4198         uint32_t    cLeft  = pRam->cb >> PAGE_SHIFT;
    4199         while (cLeft-- > 0)
    4200         {
    4201             if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM)
    4202             {
    4203                 switch (PGM_PAGE_GET_STATE(pPage))
    4204                 {
    4205                     case PGM_PAGE_STATE_ZERO:
    4206                         cZero++;
    4207                         break;
    4208 
    4209                     case PGM_PAGE_STATE_BALLOONED:
    4210                         cBallooned++;
    4211                         break;
    4212 
    4213                     case PGM_PAGE_STATE_SHARED:
    4214                         cShared++;
    4215                         break;
    4216 
    4217                     case PGM_PAGE_STATE_ALLOCATED:
    4218                     case PGM_PAGE_STATE_WRITE_MONITORED:
    4219                     {
    4220                         const void *pvPage;
    4221                         /* Check if the page was allocated, but completely zero. */
    4222                         int rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pPage, GCPhys, &pvPage);
    4223                         if (    rc == VINF_SUCCESS
    4224                             &&  ASMMemIsZeroPage(pvPage))
    4225                         {
    4226                             cAllocZero++;
    4227                         }
    4228                         else
    4229                         if (GMMR3IsDuplicatePage(pVM, PGM_PAGE_GET_PAGEID(pPage)))
    4230                             cDuplicate++;
    4231                         else
    4232                             cUnique++;
    4233 
    4234                         break;
    4235                     }
    4236 
    4237                     default:
    4238                         AssertFailed();
    4239                         break;
    4240                 }
    4241             }
    4242 
    4243             /* next */
    4244             pPage++;
    4245             GCPhys += PAGE_SIZE;
    4246             cPages++;
    4247             /* Give some feedback for every processed megabyte. */
    4248             if ((cPages & 0x7f) == 0)
    4249                 pCmdHlp->pfnPrintf(pCmdHlp, NULL, ".");
    4250         }
    4251     }
    4252     pgmUnlock(pVM);
    4253 
    4254     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "\nNumber of zero pages      %08x (%d MB)\n", cZero, cZero / 256);
    4255     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of alloczero pages %08x (%d MB)\n", cAllocZero, cAllocZero / 256);   
    4256     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of ballooned pages %08x (%d MB)\n", cBallooned, cBallooned / 256);
    4257     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of shared pages    %08x (%d MB)\n", cShared, cShared / 256);
    4258     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of unique pages    %08x (%d MB)\n", cUnique, cUnique / 256);
    4259     pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of duplicate pages %08x (%d MB)\n", cDuplicate, cDuplicate / 256);
    4260     return VINF_SUCCESS;
    4261 }
    4262 
    4263 #endif /* VBOX_STRICT && HC_ARCH_BITS == 64*/
    4264 
    42654169
    42664170/**
  • trunk/src/VBox/VMM/PGMInternal.h

    r30613 r30761  
    2222#include <VBox/types.h>
    2323#include <VBox/err.h>
     24#include <VBox/dbg.h>
    2425#include <VBox/stam.h>
    2526#include <VBox/param.h>
     
    34423443PX86PML4        pgmGstLazyMapPml4(PPGMCPU pPGM);
    34433444
     3445# if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
     3446DECLCALLBACK(int)  pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);
     3447DECLCALLBACK(int)  pgmR3CmdShowSharedModules(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);
     3448# endif
     3449
    34443450RT_C_DECLS_END
    34453451
  • trunk/src/VBox/VMM/PGMSharedPage.cpp

    r30727 r30761  
    3535#include <iprt/mem.h>
    3636
     37#if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
     38/* Keep a copy of all registered shared modules for the .pgmcheckduppages debugger command. */
     39static PGMMREGISTERSHAREDMODULEREQ pSharedModules[512] = {0};
     40static unsigned cSharedModules = 0;
     41#endif
    3742
    3843/**
     
    7883
    7984    int rc = GMMR3RegisterSharedModule(pVM, pReq);
     85# if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
     86    if (rc == VINF_SUCCESS)
     87    {
     88        PGMMREGISTERSHAREDMODULEREQ *ppSharedModule = NULL;
     89
     90        if (pSharedModules[cSharedModules])
     91        {
     92            for (unsigned i = 0; i < cSharedModules; i++)
     93            {
     94                if (pSharedModules[cSharedModules] == NULL)
     95                {
     96                    ppSharedModule = &pSharedModules[i];
     97                    break;
     98                }
     99            }
     100            Assert(ppSharedModule);
     101        }
     102        else
     103            ppSharedModule = &pSharedModules[cSharedModules];
     104
     105        *ppSharedModule = (PGMMREGISTERSHAREDMODULEREQ)RTMemAllocZ(RT_OFFSETOF(GMMREGISTERSHAREDMODULEREQ, aRegions[cRegions]));
     106        memcpy(*ppSharedModule, pReq, RT_OFFSETOF(GMMREGISTERSHAREDMODULEREQ, aRegions[cRegions]));
     107        cSharedModules++;
     108    }
     109# endif
     110
    80111    RTMemFree(pReq);
    81112    Assert(rc == VINF_SUCCESS || rc == VINF_PGM_SHARED_MODULE_COLLISION || rc == VINF_PGM_SHARED_MODULE_ALREADY_REGISTERED);
    82113    if (RT_FAILURE(rc))
    83114        return rc;
     115
    84116    return VINF_SUCCESS;
    85117#else
     
    119151    int rc = GMMR3UnregisterSharedModule(pVM, pReq);
    120152    RTMemFree(pReq);
     153
     154# if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
     155    for (unsigned i = 0; i < cSharedModules; i++)
     156    {
     157        if (    !strcmp(pSharedModules[i]->szName, pszModuleName)
     158            &&  !strcmp(pSharedModules[i]->szVersion, pszVersion))
     159        {
     160            RTMemFree(pSharedModules[i]);
     161            pSharedModules[i] = NULL;
     162            cSharedModules--;
     163            break;
     164        }
     165    }
     166# endif
    121167    return rc;
    122168#else
     
    239285#endif
    240286}
     287
     288
     289#if defined(VBOX_STRICT) && HC_ARCH_BITS == 64
     290/**
     291 * The '.pgmcheckduppages' command.
     292 *
     293 * @returns VBox status.
     294 * @param   pCmd        Pointer to the command descriptor (as registered).
     295 * @param   pCmdHlp     Pointer to command helper functions.
     296 * @param   pVM         Pointer to the current VM (if any).
     297 * @param   paArgs      Pointer to (readonly) array of arguments.
     298 * @param   cArgs       Number of arguments in the array.
     299 */
     300DECLCALLBACK(int)  pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult)
     301{
     302    unsigned cBallooned = 0;
     303    unsigned cShared = 0;
     304    unsigned cZero = 0;
     305    unsigned cUnique = 0;
     306    unsigned cDuplicate = 0;
     307    unsigned cAllocZero = 0;
     308    unsigned cPages = 0;
     309
     310    pgmLock(pVM);
     311
     312    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     313    {
     314        PPGMPAGE    pPage  = &pRam->aPages[0];
     315        RTGCPHYS    GCPhys = pRam->GCPhys;
     316        uint32_t    cLeft  = pRam->cb >> PAGE_SHIFT;
     317        while (cLeft-- > 0)
     318        {
     319            if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM)
     320            {
     321                switch (PGM_PAGE_GET_STATE(pPage))
     322                {
     323                    case PGM_PAGE_STATE_ZERO:
     324                        cZero++;
     325                        break;
     326
     327                    case PGM_PAGE_STATE_BALLOONED:
     328                        cBallooned++;
     329                        break;
     330
     331                    case PGM_PAGE_STATE_SHARED:
     332                        cShared++;
     333                        break;
     334
     335                    case PGM_PAGE_STATE_ALLOCATED:
     336                    case PGM_PAGE_STATE_WRITE_MONITORED:
     337                    {
     338                        const void *pvPage;
     339                        /* Check if the page was allocated, but completely zero. */
     340                        int rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pPage, GCPhys, &pvPage);
     341                        if (    rc == VINF_SUCCESS
     342                            &&  ASMMemIsZeroPage(pvPage))
     343                        {
     344                            cAllocZero++;
     345                        }
     346                        else
     347                        if (GMMR3IsDuplicatePage(pVM, PGM_PAGE_GET_PAGEID(pPage)))
     348                            cDuplicate++;
     349                        else
     350                            cUnique++;
     351
     352                        break;
     353                    }
     354
     355                    default:
     356                        AssertFailed();
     357                        break;
     358                }
     359            }
     360
     361            /* next */
     362            pPage++;
     363            GCPhys += PAGE_SIZE;
     364            cPages++;
     365            /* Give some feedback for every processed megabyte. */
     366            if ((cPages & 0x7f) == 0)
     367                pCmdHlp->pfnPrintf(pCmdHlp, NULL, ".");
     368        }
     369    }
     370    pgmUnlock(pVM);
     371
     372    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "\nNumber of zero pages      %08x (%d MB)\n", cZero, cZero / 256);
     373    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of alloczero pages %08x (%d MB)\n", cAllocZero, cAllocZero / 256);   
     374    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of ballooned pages %08x (%d MB)\n", cBallooned, cBallooned / 256);
     375    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of shared pages    %08x (%d MB)\n", cShared, cShared / 256);
     376    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of unique pages    %08x (%d MB)\n", cUnique, cUnique / 256);
     377    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Number of duplicate pages %08x (%d MB)\n", cDuplicate, cDuplicate / 256);
     378    return VINF_SUCCESS;
     379}
     380
     381/**
     382 * The '.pgmsharedmodules' command.
     383 *
     384 * @returns VBox status.
     385 * @param   pCmd        Pointer to the command descriptor (as registered).
     386 * @param   pCmdHlp     Pointer to command helper functions.
     387 * @param   pVM         Pointer to the current VM (if any).
     388 * @param   paArgs      Pointer to (readonly) array of arguments.
     389 * @param   cArgs       Number of arguments in the array.
     390 */
     391DECLCALLBACK(int)  pgmR3CmdShowSharedModules(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult)
     392{
     393    unsigned i = 0;
     394
     395    pgmLock(pVM);
     396    do
     397    {
     398        if (pSharedModules[i])
     399        {
     400            pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Shared module %s (%s):\n", pSharedModules[i]->szName, pSharedModules[i]->szVersion);
     401            for (unsigned j = 0; j < pSharedModules[i]->cRegions; j++)
     402            {
     403                pCmdHlp->pfnPrintf(pCmdHlp, NULL, "--- Region %d: base %RGv size %x\n", pSharedModules[i]->aRegions[j].GCRegionAddr, pSharedModules[i]->aRegions[j].cbRegion);
     404            }
     405            i++;
     406        }
     407    }
     408    while (i < cSharedModules);
     409    pgmUnlock(pVM);
     410
     411    return VINF_SUCCESS;
     412}
     413
     414#endif /* VBOX_STRICT && HC_ARCH_BITS == 64*/
  • trunk/src/VBox/VMM/VMMR0/PGMR0SharedPage.cpp

    r30341 r30761  
    3838 *
    3939 * @param   pVM         The VM handle.
     40 * @param   pGVM        Pointer to the GVM instance data.
    4041 * @param   idCpu       VCPU id
    4142 * @param   pModule     Module description
    4243 * @param   cRegions    Number of regions
    4344 * @param   pRegions    Region array
    44  * @param   pGVM        Pointer to the GVM instance data.
    4545 */
    4646VMMR0DECL(int) PGMR0SharedModuleCheck(PVM pVM, PGVM pGVM, VMCPUID idCpu, PGMMSHAREDMODULE pModule, uint32_t cRegions, PGMMSHAREDREGIONDESC pRegions)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette