Changeset 62290 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jul 16, 2016 1:34:27 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 108810
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r62257 r62290 735 735 IEM_STATIC VBOXSTRICTRC iemRaiseAlignmentCheckException(PVMCPU pVCpu); 736 736 #ifdef IEM_WITH_SETJMP 737 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaisePageFaultJmp(PVMCPU pVCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc); 737 738 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseGeneralProtectionFault0Jmp(PVMCPU pVCpu); 738 739 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsJmp(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess); … … 1361 1362 pVCpu->iem.s.DataTlb.uTlbPhysRev = uTlbPhysRev; 1362 1363 1363 if (!fF lushFlush)1364 if (!fFullFlush) 1364 1365 { /* very likely */ } 1365 1366 else … … 1371 1372 { 1372 1373 pVCpu->iem.s.CodeTlb.aEntries[i].pMappingR3 = NULL; 1373 pVCpu->iem.s.CodeTlb.aEntries[i].fFlagsAndPhysRev &= ~(IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PHYS_REV) 1374 pVCpu->iem.s.CodeTlb.aEntries[i].fFlagsAndPhysRev &= ~(IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PHYS_REV); 1374 1375 } 1375 1376 # endif … … 1379 1380 { 1380 1381 pVCpu->iem.s.DataTlb.aEntries[i].pMappingR3 = NULL; 1381 pVCpu->iem.s.DataTlb.aEntries[i].fFlagsAndPhysRev &= ~(IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PHYS_REV) 1382 pVCpu->iem.s.DataTlb.aEntries[i].fFlagsAndPhysRev &= ~(IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PHYS_REV); 1382 1383 } 1383 1384 # endif … … 1501 1502 RTGCPHYS GCPhys; 1502 1503 uint64_t fFlags; 1503 int rc = PGMGstGetPage(pVCpu, GCPtr Next, &fFlags, &GCPhys);1504 int rc = PGMGstGetPage(pVCpu, GCPtrFirst, &fFlags, &GCPhys); 1504 1505 if (RT_FAILURE(rc)) 1505 1506 { 1506 Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtr Next, rc));1507 return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);1507 Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrFirst, rc)); 1508 iemRaisePageFaultJmp(pVCpu, GCPtrFirst, IEM_ACCESS_INSTRUCTION, rc); 1508 1509 } 1509 1510 … … 1517 1518 1518 1519 /* 1519 * Check TLB access flags.1520 * Check TLB page table level access flags. 1520 1521 */ 1521 1522 if (pTlbe->fFlagsAndPhysRev & (IEMTLBE_F_PT_NO_USER | IEMTLBE_F_PT_NO_EXEC)) … … 1542 1543 else 1543 1544 { 1544 1545 } 1546 1545 /** @todo Could be optimized this a little in ring-3 if we liked. */ 1546 size_t cbRead = 0; 1547 int rc = PATMReadPatchCode(pVCpu->CTX_SUFF(pVM), GCPtrFirst, pvDst, cbDst, &cbRead); 1548 AssertRCStmt(rc, longjmp(*CTX_SUFF(pVCpu->iem.s.pJmpBuf), rc)); 1549 AssertStmt(cbRead == cbDst, longjmp(*CTX_SUFF(pVCpu->iem.s.pJmpBuf), VERR_IEM_IPE_1)); 1550 return; 1551 } 1547 1552 # endif /* VBOX_WITH_RAW_MODE_NOT_R0 */ 1548 1553 1554 /* 1555 * Look up the physical page info if necessary. 1556 */ 1557 if ((pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PHYS_REV) == pVCpu->iem.s.CodeTlb.uTlbPhysRev) 1558 { /* not necessary */ } 1559 else 1560 { 1561 } 1562 1563 1564 # if defined(IN_RING3) || (defined(IN_RING0) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE)) 1565 /* 1566 * Try do a direct read using the pMappingR3 pointer. 1567 */ 1568 if (!(pTlbe->fFlagsAndPhysRev & (IEMTLBE_F_NO_MAPPINGR3 | IEMTLBE_F_PG_NO_READ)) 1569 { 1570 1571 } 1572 # endif 1573 1574 1549 1575 # if 0 1550 1551 # ifdef VBOX_WITH_RAW_MODE_NOT_R01552 /* Allow interpretation of patch manager code blocks since they can for1553 instance throw #PFs for perfectly good reasons. */1554 if (pVCpu->iem.s.fInPatchCode)1555 {1556 size_t cbRead = 0;1557 int rc = PATMReadPatchCode(pVCpu->CTX_SUFF(pVM), GCPtrNext, pVCpu->iem.s.abOpcode, cbToTryRead, &cbRead);1558 AssertRCReturn(rc, rc);1559 pVCpu->iem.s.cbOpcode = (uint8_t)cbRead; Assert(pVCpu->iem.s.cbOpcode == cbRead); Assert(cbRead > 0);1560 return VINF_SUCCESS;1561 }1562 # endif /* VBOX_WITH_RAW_MODE_NOT_R0 */1563 1564 RTGCPHYS GCPhys;1565 uint64_t fFlags;1566 int rc = PGMGstGetPage(pVCpu, GCPtrNext, &fFlags, &GCPhys);1567 if (RT_FAILURE(rc))1568 {1569 Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrNext, rc));1570 return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);1571 }1572 if (!(fFlags & X86_PTE_US) && pVCpu->iem.s.uCpl == 3)1573 {1574 Log(("iemOpcodeFetchMoreBytes: %RGv - supervisor page\n", GCPtrNext));1575 return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);1576 }1577 if ((fFlags & X86_PTE_PAE_NX) && (pCtx->msrEFER & MSR_K6_EFER_NXE))1578 {1579 Log(("iemOpcodeFetchMoreBytes: %RGv - NX\n", GCPtrNext));1580 return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);1581 }1582 GCPhys |= GCPtrNext & PAGE_OFFSET_MASK;1583 Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n", GCPtrNext, GCPhys, pVCpu->iem.s.cbOpcode));1584 /** @todo Check reserved bits and such stuff. PGM is better at doing1585 * that, so do it when implementing the guest virtual address1586 * TLB... */1587 1588 1576 /* 1589 1577 * Read the bytes at this address. … … 5284 5272 uErr, GCPtrWhere); 5285 5273 } 5274 5275 #ifdef IEM_WITH_SETJMP 5276 /** \#PF(n) - 0e, longjmp. */ 5277 IEM_STATIC DECL_NO_RETURN(void) iemRaisePageFaultJmp(PVMCPU pVCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc) 5278 { 5279 longjmp(*CTX_SUFF(pVCpu->iem.s.pJmpBuf), VBOXSTRICTRC_VAL(iemRaisePageFault(pVCpu, GCPtrWhere, fAccess, rc))); 5280 } 5281 #endif 5286 5282 5287 5283
Note:
See TracChangeset
for help on using the changeset viewer.