Changeset 30761 in vbox
- Timestamp:
- Jul 9, 2010 1:27:50 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63545
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r30733 r30761 641 641 static DECLCALLBACK(int) pgmR3CmdAssertCR3(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult); 642 642 # endif 643 # if defined(VBOX_STRICT) && HC_ARCH_BITS == 64644 static DECLCALLBACK(int) pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult);645 # endif646 643 static DECLCALLBACK(int) pgmR3CmdPhysToFile(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult); 647 644 #endif … … 679 676 #if defined(VBOX_STRICT) && HC_ARCH_BITS == 64 680 677 { "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." }, 681 679 #endif 682 680 { "pgmsyncalways", 0, 0, NULL, 0, NULL, 0, pgmR3CmdSyncAlways, "", "Toggle permanent CR3 syncing." }, … … 4169 4167 #endif /* VBOX_STRICT */ 4170 4168 4171 #if defined(VBOX_STRICT) && HC_ARCH_BITS == 644172 /**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_SUCCESS4224 && ASMMemIsZeroPage(pvPage))4225 {4226 cAllocZero++;4227 }4228 else4229 if (GMMR3IsDuplicatePage(pVM, PGM_PAGE_GET_PAGEID(pPage)))4230 cDuplicate++;4231 else4232 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 4265 4169 4266 4170 /** -
trunk/src/VBox/VMM/PGMInternal.h
r30613 r30761 22 22 #include <VBox/types.h> 23 23 #include <VBox/err.h> 24 #include <VBox/dbg.h> 24 25 #include <VBox/stam.h> 25 26 #include <VBox/param.h> … … 3442 3443 PX86PML4 pgmGstLazyMapPml4(PPGMCPU pPGM); 3443 3444 3445 # if defined(VBOX_STRICT) && HC_ARCH_BITS == 64 3446 DECLCALLBACK(int) pgmR3CmdCheckDuplicatePages(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult); 3447 DECLCALLBACK(int) pgmR3CmdShowSharedModules(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs, PDBGCVAR pResult); 3448 # endif 3449 3444 3450 RT_C_DECLS_END 3445 3451 -
trunk/src/VBox/VMM/PGMSharedPage.cpp
r30727 r30761 35 35 #include <iprt/mem.h> 36 36 37 #if defined(VBOX_STRICT) && HC_ARCH_BITS == 64 38 /* Keep a copy of all registered shared modules for the .pgmcheckduppages debugger command. */ 39 static PGMMREGISTERSHAREDMODULEREQ pSharedModules[512] = {0}; 40 static unsigned cSharedModules = 0; 41 #endif 37 42 38 43 /** … … 78 83 79 84 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 80 111 RTMemFree(pReq); 81 112 Assert(rc == VINF_SUCCESS || rc == VINF_PGM_SHARED_MODULE_COLLISION || rc == VINF_PGM_SHARED_MODULE_ALREADY_REGISTERED); 82 113 if (RT_FAILURE(rc)) 83 114 return rc; 115 84 116 return VINF_SUCCESS; 85 117 #else … … 119 151 int rc = GMMR3UnregisterSharedModule(pVM, pReq); 120 152 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 121 167 return rc; 122 168 #else … … 239 285 #endif 240 286 } 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 */ 300 DECLCALLBACK(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 */ 391 DECLCALLBACK(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 38 38 * 39 39 * @param pVM The VM handle. 40 * @param pGVM Pointer to the GVM instance data. 40 41 * @param idCpu VCPU id 41 42 * @param pModule Module description 42 43 * @param cRegions Number of regions 43 44 * @param pRegions Region array 44 * @param pGVM Pointer to the GVM instance data.45 45 */ 46 46 VMMR0DECL(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.