- Timestamp:
- Sep 17, 2009 2:39:06 PM (15 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/ConsoleImpl2.cpp
r23008 r23099 244 244 rc = CFGMR3InsertInteger(pRoot, "CSAMEnabled", 1); /* boolean */ RC_CHECK(); 245 245 246 PCFGMNODE pCPUM; 247 rc = CFGMR3InsertNode(pRoot, "CPUM", &pCPUM); RC_CHECK(); 248 246 249 if (osTypeId == "WindowsNT4") 247 250 { … … 251 254 */ 252 255 LogRel(("Limiting CPUID leaf count for NT4 guests\n")); 253 PCFGMNODE pCPUM;254 rc = CFGMR3InsertNode(pRoot, "CPUM", &pCPUM); RC_CHECK();255 256 rc = CFGMR3InsertInteger(pCPUM, "NT4LeafLimit", true); RC_CHECK(); 256 257 } … … 273 274 rc = CFGMR3InsertInteger(pRoot, "HwVirtExtForced", fHwVirtExtForced); RC_CHECK(); 274 275 #endif 276 277 if (!fHWVirtExEnabled && osTypeId == "NetBSD") 278 { 279 /* 280 * Use additional NetBSD-specific raw mode heuristics in PATM and CPUM, 281 * see #4291. 282 */ 283 PCFGMNODE pPATM; 284 rc = CFGMR3InsertNode(pRoot, "PATM", &pPATM); RC_CHECK(); 285 rc = CFGMR3InsertInteger(pPATM, "SearchImmediatesBackward", 1); RC_CHECK(); 286 rc = CFGMR3InsertInteger(pCPUM, "HideCX8", 1); RC_CHECK(); 287 } 288 275 289 276 290 PCFGMNODE pHWVirtExt; -
trunk/src/VBox/VMM/CPUM.cpp
r22891 r23099 528 528 } 529 529 530 PCFGMNODE pCpum = CFGMR3GetChild(CFGMR3GetRoot(pVM), "CPUM"); 530 531 /** @cfgm{/CPUM/NT4LeafLimit, boolean, false} 531 532 * Limit the number of standard CPUID leafs to 0..2 to prevent NT4 from … … 535 536 */ 536 537 bool fNt4LeafLimit; 537 CFGMR3QueryBoolDef( CFGMR3GetChild(CFGMR3GetRoot(pVM), "CPUM"), "NT4LeafLimit", &fNt4LeafLimit, false);538 CFGMR3QueryBoolDef(pCpum, "NT4LeafLimit", &fNt4LeafLimit, false); 538 539 if (fNt4LeafLimit) 539 540 pCPUM->aGuestCpuIdStd[0].eax = 2; 541 542 /** 543 * @todo: very hacky, may need to change, once better understand real reason 544 */ 545 bool fHideCX8; 546 CFGMR3QueryBoolDef(pCpum, "HideCX8", &fHideCX8, false); 547 if (fHideCX8) 548 pCPUM->aGuestCpuIdStd[1].edx &= ~X86_CPUID_FEATURE_EDX_CX8; 540 549 541 550 /* -
trunk/src/VBox/VMM/PATM/PATM.cpp
r22890 r23099 167 167 # endif 168 168 #endif 169 pVM->patm.s.uPATMFlags = 0; 170 bool fSearchBackward; 171 CFGMR3QueryBoolDef(CFGMR3GetChild(CFGMR3GetRoot(pVM), "PATM"), "SearchImmediatesBackward", &fSearchBackward, false); 172 if (fSearchBackward) 173 pVM->patm.s.uPATMFlags |= PATMGFL_SEARCH_IMM_BACKWARD; 169 174 170 175 rc = patmReinit(pVM); … … 1546 1551 1547 1552 /** 1553 * Checks if few instructions before patch contain something 1554 * which looks like immediate referring potential patch instruction 1555 * 1556 * @returns boolean 1557 * @param pVM The VM to operate on. 1558 * @param pInstrGC Guest context pointer to instruction 1559 */ 1560 static bool patmHasImmsReferringPatch(PVM pVM, RCPTRTYPE(uint8_t *) pInstrGC) 1561 { 1562 int rc; 1563 uint32_t value; 1564 1565 if (!(pVM->patm.s.uPATMFlags & PATMGFL_SEARCH_IMM_BACKWARD)) 1566 return false; 1567 1568 PVMCPU pCpu = VMMGetCpu0(pVM); 1569 for (int i = 4; i < 12; i++) 1570 { 1571 rc = PGMPhysSimpleReadGCPtr(pCpu, &value, pInstrGC - i, 4); 1572 if (rc == VINF_SUCCESS) 1573 { 1574 if ((uint32_t)(value-(uint32_t)pInstrGC) < 6) 1575 return true; 1576 } 1577 else 1578 break; 1579 } 1580 return false; 1581 } 1582 1583 /** 1548 1584 * Recompiles the instructions in a code block 1549 1585 * … … 1573 1609 Log(("patmRecompileCallback: jump to code we've recompiled before %RRv!\n", pCurInstrGC)); 1574 1610 return patmPatchGenRelJump(pVM, pPatch, pCurInstrGC, OP_JMP, !!(pCpu->prefix & PREFIX_OPSIZE)); 1611 } 1612 1613 1614 if (patmHasImmsReferringPatch(pVM, pInstrGC)) 1615 { 1616 pPatch->flags |= PATMFL_INT3_REPLACEMENT_BLOCK; 1575 1617 } 1576 1618 -
trunk/src/VBox/VMM/PATM/PATMInternal.h
r22793 r23099 79 79 #define PATMFL_EXTERNAL_JUMP_INSIDE RT_BIT_64(33) /** A trampoline patch was created that jumps to an instruction in the patch block */ 80 80 #define PATMFL_CODE_REFERENCED RT_BIT_64(34) /** patch block referenced (called, jumped to) by another patch. */ 81 82 /* Global flags, affect PATM behavior */ 83 #define PATMGFL_SEARCH_IMM_BACKWARD RT_BIT_32(0) /** search backward from priveledged insn for immediates referring inside patch */ 81 84 82 85 #define SIZEOF_NEARJUMP8 2 //opcode byte + 1 byte relative offset … … 520 523 STAMCOUNTER StatFunctionLookupInsert; 521 524 uint32_t StatU32FunctionMaxSlotsUsed; 522 uint32_t Alignment0; /**< Align the structure size on a 8-byte boundrary. */525 uint32_t uPATMFlags; 523 526 } PATM, *PPATM; 524 527
Note:
See TracChangeset
for help on using the changeset viewer.