Changeset 208 in vbox for trunk/src/VBox
- Timestamp:
- Jan 21, 2007 2:23:25 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 17693
- Location:
- trunk/src/VBox/VMM/PATM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PATM/CSAM.cpp
r27 r208 1774 1774 RTHCPHYS GCPhys; 1775 1775 rc = PGMShwGetPage(pVM, pPageAddrGC, &fPageShw, &GCPhys); 1776 AssertMsg( (rc == VERR_PAGE_NOT_PRESENT || rc == VERR_PAGE_TABLE_NOT_PRESENT)1777 || !(fPageShw & X86_PTE_RW)1778 || (pPageRec->page.GCPhys == 0), ("Shadow page flags for %VGv (%VHp) aren't readonly (%VX64)!!\n", pPageAddrGC, GCPhys, fPageShw));1776 // AssertMsg( (rc == VERR_PAGE_NOT_PRESENT || rc == VERR_PAGE_TABLE_NOT_PRESENT) 1777 // || !(fPageShw & X86_PTE_RW) 1778 // || (pPageRec->page.GCPhys == 0), ("Shadow page flags for %VGv (%VHp) aren't readonly (%VX64)!!\n", pPageAddrGC, GCPhys, fPageShw)); 1779 1779 } 1780 1780 #endif … … 2266 2266 else 2267 2267 { 2268 /* OpenBSD guest specific patch test */ 2269 rc = PATMR3InstallPatch(pVM, pHandler - 4, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC); 2270 if (VBOX_SUCCESS(rc)) 2268 if (iGate >= 0x20) 2271 2269 { 2272 Log(("Installed OpenBSD interrupt handler prefix instruction (push cs) patch\n")); 2273 if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) 2270 /* OpenBSD guest specific patch test (3.7 & 3.8) */ 2271 rc = PATMR3InstallPatch(pVM, pHandler - 3, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC); 2272 if (VBOX_FAILURE(rc)) 2273 /* OpenBSD guest specific patch test (3.9 & 4.0) */ 2274 rc = PATMR3InstallPatch(pVM, pHandler - 0x2B, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC); 2275 if (VBOX_SUCCESS(rc)) 2274 2276 { 2275 /* This is actually fatal!!!! */ 2276 Log(("Warning: patch jump overwrites trap handler entrypoint!!!!!!!!!!!!!\n")); 2277 Log(("Installed OpenBSD interrupt handler prefix instruction (push cs) patch\n")); 2278 if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) 2279 { 2280 /* This is actually fatal!!!! */ 2281 Log(("Warning: patch jump overwrites trap handler entrypoint!!!!!!!!!!!!!\n")); 2282 } 2277 2283 } 2278 2284 } 2285 2286 /* Trap gates and certain interrupt gates. */ 2287 uint32_t fPatchFlags = PATMFL_CODE32 | PATMFL_IDTHANDLER; 2288 2289 if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) 2290 fPatchFlags |= PATMFL_TRAPHANDLER; 2279 2291 else 2280 /* Trap gates and certain interrupt gates. */ 2281 // if ( pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32 2282 // || iGate == 0x2E || iGate == 0xE || iGate == 0x80 || iGate == 0xEF) 2292 fPatchFlags |= PATMFL_INTHANDLER; 2293 2294 switch (iGate) { 2295 case 8: 2296 case 10: 2297 case 11: 2298 case 12: 2299 case 13: 2300 case 14: 2301 case 17: 2302 fPatchFlags |= PATMFL_TRAPHANDLER_WITH_ERRORCODE; 2303 break; 2304 default: 2305 /* No error code. */ 2306 break; 2307 } 2308 2309 Log(("Installing %s gate handler for 0x%X at %VGv\n", (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) ? "trap" : "intr", iGate, pHandler)); 2310 2311 rc = PATMR3InstallPatch(pVM, pHandler, fPatchFlags); 2312 if (VBOX_SUCCESS(rc) || rc == VERR_PATM_ALREADY_PATCHED) 2283 2313 { 2284 uint32_t fPatchFlags = PATMFL_CODE32 | PATMFL_IDTHANDLER; 2285 2286 if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) 2287 fPatchFlags |= PATMFL_TRAPHANDLER; 2314 RTGCPTR pNewHandlerGC; 2315 2316 Log(("Gate handler 0x%X is SAFE!\n", iGate)); 2317 2318 pNewHandlerGC = PATMR3QueryPatchGCPtr(pVM, pHandler); 2319 if (pNewHandlerGC) 2320 { 2321 rc = TRPMR3SetGuestTrapHandler(pVM, iGate, pNewHandlerGC); 2322 if (VBOX_FAILURE(rc)) 2323 Log(("TRPMR3SetGuestTrapHandler %d failed with %Vrc\n", iGate, rc)); 2324 } 2288 2325 else 2289 fPatchFlags |= PATMFL_INTHANDLER; 2290 2291 switch (iGate) { 2292 case 8: 2293 case 10: 2294 case 11: 2295 case 12: 2296 case 13: 2297 case 14: 2298 case 17: 2299 fPatchFlags |= PATMFL_TRAPHANDLER_WITH_ERRORCODE; 2300 break; 2301 default: 2302 /* No error code. */ 2303 break; 2304 } 2305 2306 Log(("Installing %s gate handler for 0x%X at %VGv\n", (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) ? "trap" : "intr", iGate, pHandler)); 2307 2308 rc = PATMR3InstallPatch(pVM, pHandler, fPatchFlags); 2309 if (VBOX_SUCCESS(rc) || rc == VERR_PATM_ALREADY_PATCHED) 2310 { 2311 RTGCPTR pNewHandlerGC; 2312 2313 Log(("Gate handler 0x%X is SAFE!\n", iGate)); 2314 2315 pNewHandlerGC = PATMR3QueryPatchGCPtr(pVM, pHandler); 2316 if (pNewHandlerGC) 2317 { 2318 rc = TRPMR3SetGuestTrapHandler(pVM, iGate, pNewHandlerGC); 2319 if (VBOX_FAILURE(rc)) 2320 Log(("TRPMR3SetGuestTrapHandler %d failed with %Vrc\n", iGate, rc)); 2321 } 2322 else 2323 Assert(0); 2324 } 2326 Assert(0); 2325 2327 } 2326 2328 } -
trunk/src/VBox/VMM/PATM/PATM.cpp
r103 r208 4173 4173 { 4174 4174 case OP_SYSENTER: 4175 case OP_PUSH F:4175 case OP_PUSH: 4176 4176 rc = PATMInstallGuestSpecificPatch(pVM, &cpu, pInstrGC, pInstrHC, pPatchRec); 4177 4177 if (rc == VINF_SUCCESS) -
trunk/src/VBox/VMM/PATM/PATMGuest.cpp
r23 r208 70 70 71 71 /* 72 * D0101B6C: pushf [9C] 72 * OpenBSD 3.7 & 3.8: 73 * 73 74 * D0101B6D: push CS [0E] 74 75 * D0101B6E: push ESI [56] 75 76 * D0101B6F: cli [FA] 76 77 */ 77 static uint8_t uFnOpenBSDHandlerPrefix[4] = { 0x9C, 0x0E, 0x56, 0xFA }; 78 static uint8_t uFnOpenBSDHandlerPrefix1[3] = { 0x0E, 0x56, 0xFA }; 79 /* 80 * OpenBSD 3.9 & 4.0 81 * 82 * D0101BD1: push CS [0E] 83 * D0101BD2: push ESI [56] 84 * D0101BD3: push 0x00 [6A 00] 85 * D0101BD4: push 0x03 [6A 03] 86 */ 87 static uint8_t uFnOpenBSDHandlerPrefix2[6] = { 0x0E, 0x56, 0x6A, 0x00, 0x6A, 0x03 }; 78 88 79 89 … … 175 185 int rc; 176 186 177 Assert(sizeof(uTemp) > sizeof(uFnOpenBSDHandlerPrefix));187 Assert(sizeof(uTemp) > RT_MAX(sizeof(uFnOpenBSDHandlerPrefix1), sizeof(uFnOpenBSDHandlerPrefix2))); 178 188 179 189 /* Guest OS specific patch; check heuristics first */ 180 190 181 rc = PGMPhysReadGCPtr(pVM, uTemp, pInstrGC, sizeof(uFnOpenBSDHandlerPrefix)); 182 if (VBOX_FAILURE(rc) || memcmp(uFnOpenBSDHandlerPrefix, uTemp, sizeof(uFnOpenBSDHandlerPrefix))) 183 { 184 return VERR_PATCHING_REFUSED; 185 } 186 /* Found it; patch the pushf block (including push cs) */ 191 rc = PGMPhysReadGCPtr(pVM, uTemp, pInstrGC, RT_MAX(sizeof(uFnOpenBSDHandlerPrefix1), sizeof(uFnOpenBSDHandlerPrefix2))); 192 if ( VBOX_FAILURE(rc) 193 || ( memcmp(uFnOpenBSDHandlerPrefix1, uTemp, sizeof(uFnOpenBSDHandlerPrefix1)) 194 && memcmp(uFnOpenBSDHandlerPrefix2, uTemp, sizeof(uFnOpenBSDHandlerPrefix2)))) 195 { 196 return VERR_PATCHING_REFUSED; 197 } 198 /* Found it; patch the push cs */ 187 199 pPatchRec->patch.flags &= ~(PATMFL_GUEST_SPECIFIC); /* prevent a breakpoint from being triggered */ 188 return PATMR3Patch Block(pVM, pInstrGC, pInstrHC, pCpu->pCurInstr->opcode, pCpu->opsize, pPatchRec);200 return PATMR3PatchInstrInt3(pVM, pInstrGC, pInstrHC, pCpu, &pPatchRec->patch); 189 201 } 190 202 … … 218 230 return VINF_SUCCESS; 219 231 220 case OP_PUSH F:232 case OP_PUSH: 221 233 /* OpenBSD guest specific patch for the following code block: 222 234 * … … 226 238 * cli 227 239 */ 228 return PATMPatchOpenBSDHandlerPrefix(pVM, pCpu, pInstrGC, pInstrHC, pPatchRec); 240 if (pCpu->pCurInstr->param1 == OP_PARM_REG_CS) 241 return PATMPatchOpenBSDHandlerPrefix(pVM, pCpu, pInstrGC, pInstrHC, pPatchRec); 242 243 return VERR_PATCHING_REFUSED; 229 244 230 245 default: -
trunk/src/VBox/VMM/PATM/PATMInternal.h
r188 r208 730 730 731 731 /** 732 * Replace an instruction with a breakpoint (0xCC), that is handled dynamically in the guest context. 733 * 734 * @returns VBox status code. 735 * @param pVM The VM to operate on. 736 * @param pInstrGC Guest context point to privileged instruction 737 * @param pInstrHC Host context point to privileged instruction 738 * @param pCpu Disassembly CPU structure ptr 739 * @param pPatch Patch record 740 * 741 * @note returns failure if patching is not allowed or possible 742 * 743 */ 744 PATMR3DECL(int) PATMR3PatchInstrInt3(PVM pVM, RTGCPTR pInstrGC, HCPTRTYPE(uint8_t *) pInstrHC, DISCPUSTATE *pCpu, PPATCHINFO pPatch); 745 746 /** 732 747 * Mark patch as dirty 733 748 *
Note:
See TracChangeset
for help on using the changeset viewer.