Changeset 42453 in vbox for trunk/src/VBox
- Timestamp:
- Jul 30, 2012 3:23:18 PM (12 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r42437 r42453 657 657 658 658 /** 659 * Sets the pass up status. 660 * 661 * @returns VINF_SUCCESS. 662 * @param pIemCpu The per CPU IEM state of the calling thread. 663 * @param rcPassUp The pass up status. Must be informational. 664 * VINF_SUCCESS is not allowed. 665 */ 666 static int iemSetPassUpStatus(PIEMCPU pIemCpu, VBOXSTRICTRC rcPassUp) 667 { 668 AssertRC(VBOXSTRICTRC_VAL(rcPassUp)); Assert(rcPassUp != VINF_SUCCESS); 669 670 int32_t const rcOldPassUp = pIemCpu->rcPassUp; 671 if (rcOldPassUp == VINF_SUCCESS) 672 pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp); 673 /* If both are EM scheduling code, use EM priority rules. */ 674 else if ( rcOldPassUp >= VINF_EM_FIRST && rcOldPassUp <= VINF_EM_LAST 675 && rcPassUp >= VINF_EM_FIRST && rcPassUp <= VINF_EM_LAST) 676 { 677 if (rcPassUp < rcOldPassUp) 678 { 679 Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp)); 680 pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp); 681 } 682 else 683 Log(("IEM: rcPassUp=%Rrc rcOldPassUp=%Rrc!\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp)); 684 } 685 /* Override EM scheduling with specific status code. */ 686 else if (rcOldPassUp >= VINF_EM_FIRST && rcOldPassUp <= VINF_EM_LAST) 687 { 688 Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp)); 689 pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp); 690 } 691 /* Don't override specific status code, first come first served. */ 692 else 693 Log(("IEM: rcPassUp=%Rrc rcOldPassUp=%Rrc!\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp)); 694 return VINF_SUCCESS; 695 } 696 697 698 /** 659 699 * Initializes the decoder state. 660 700 * … … 688 728 pIemCpu->cActiveMappings = 0; 689 729 pIemCpu->iNextMapping = 0; 730 pIemCpu->rcPassUp = VINF_SUCCESS; 690 731 } 691 732 … … 802 843 if (rc != VINF_SUCCESS) 803 844 { 804 Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - read error - rc=%Rrc\n", GCPtrPC, rc)); 845 /** @todo status code handling */ 846 Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - read error - rc=%Rrc (!!)\n", GCPtrPC, rc)); 805 847 return rc; 806 848 } … … 891 933 if (rc != VINF_SUCCESS) 892 934 { 893 Log(("iemOpcodeFetchMoreBytes: %RGv - read error - rc=%Rrc\n", GCPtrNext, rc)); 935 /** @todo status code handling */ 936 Log(("iemOpcodeFetchMoreBytes: %RGv - read error - rc=%Rrc (!!)\n", GCPtrNext, rc)); 894 937 return rc; 895 938 } … … 4486 4529 #endif 4487 4530 4488 /* 4489 * If we can map the page without trouble, do a block processing 4490 * until the end of the current page. 4491 */ 4492 /** @todo need some better API. */ 4493 #ifdef IN_RING3 4494 RT_ZERO(*pLock); 4495 return PGMR3PhysTlbGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu), 4496 GCPhysMem, 4497 RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), 4498 ppvMem); 4499 #else 4500 if (fAccess & IEM_ACCESS_TYPE_WRITE) 4501 return PGMPhysGCPhys2CCPtr(IEMCPU_TO_VM(pIemCpu), 4502 GCPhysMem, 4503 ppvMem, 4504 pLock); 4505 return PGMPhysGCPhys2CCPtrReadOnly(IEMCPU_TO_VM(pIemCpu), 4506 GCPhysMem, 4507 (void const **)ppvMem, 4508 pLock); 4509 #endif 4531 /** @todo This API may require some improving later. A private deal with PGM 4532 * regarding locking and unlocking needs to be struct. A couple of TLBs 4533 * living in PGM, but with publicly accessible inlined access methods 4534 * could perhaps be an even better solution. */ 4535 return PGMPhysIemGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu), 4536 GCPhysMem, 4537 RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), 4538 pIemCpu->fByPassHandlers, 4539 ppvMem, 4540 pLock); 4510 4541 } 4511 4542 … … 4632 4663 cbSecond); 4633 4664 } 4665 if (rc != VINF_SUCCESS) 4666 { 4667 /** @todo status code handling */ 4668 Log(("iemMemBounceBufferCommitAndUnmap: %s GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (!!)\n", 4669 pIemCpu->fByPassHandlers ? "PGMPhysWrite" : "PGMPhysSimpleWriteGCPhys", 4670 pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, 4671 pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, rc)); 4672 } 4634 4673 } 4635 4674 else … … 4716 4755 rc = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhysFirst, pbBuf, cbFirstPage); 4717 4756 if (rc != VINF_SUCCESS) 4757 { 4758 /** @todo status code handling */ 4759 Log(("iemMemBounceBufferMapPhys: PGMPhysRead GCPhysFirst=%RGp rc=%Rrc (!!)\n", GCPhysFirst, rc)); 4718 4760 return rc; 4761 } 4719 4762 rc = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhysSecond, pbBuf + cbFirstPage, cbSecondPage); 4720 4763 if (rc != VINF_SUCCESS) 4764 { 4765 /** @todo status code handling */ 4766 Log(("iemMemBounceBufferMapPhys: PGMPhysRead GCPhysSecond=%RGp rc=%Rrc (!!)\n", GCPhysSecond, rc)); 4721 4767 return rc; 4768 } 4722 4769 } 4723 4770 else … … 4725 4772 rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf, GCPhysFirst, cbFirstPage); 4726 4773 if (rc != VINF_SUCCESS) 4774 { 4775 /** @todo status code handling */ 4776 Log(("iemMemBounceBufferMapPhys: PGMPhysSimpleReadGCPhys GCPhysFirst=%RGp rc=%Rrc (!!)\n", GCPhysFirst, rc)); 4727 4777 return rc; 4778 } 4728 4779 rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf + cbFirstPage, GCPhysSecond, cbSecondPage); 4729 4780 if (rc != VINF_SUCCESS) 4781 { 4782 /** @todo status code handling */ 4783 Log(("iemMemBounceBufferMapPhys: PGMPhysSimpleReadGCPhys GCPhysSecond=%RGp rc=%Rrc (!!)\n", GCPhysSecond, rc)); 4730 4784 return rc; 4785 } 4731 4786 } 4732 4787 … … 4820 4875 rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf, GCPhysFirst, cbMem); 4821 4876 if (rc != VINF_SUCCESS) 4877 { 4878 /** @todo status code handling */ 4879 Log(("iemMemBounceBufferMapPhys: %s GCPhysFirst=%RGp rc=%Rrc (!!)\n", 4880 pIemCpu->fByPassHandlers ? "PGMPhysRead" : "PGMPhysSimpleReadGCPhys", GCPhysFirst, rc)); 4822 4881 return rc; 4882 } 4823 4883 } 4824 4884 … … 7890 7950 } 7891 7951 7952 /* 7953 * Return value fiddling and statistics. 7954 */ 7892 7955 if (rcStrict != VINF_SUCCESS) 7893 7956 { 7894 if (rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED) 7957 if (RT_SUCCESS(rcStrict)) 7958 { 7959 AssertMsg(rcStrict >= VINF_EM_FIRST && rcStrict <= VINF_EM_LAST, ("rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 7960 int32_t const rcPassUp = pIemCpu->rcPassUp; 7961 if (rcPassUp == VINF_SUCCESS) 7962 pIemCpu->cRetInfStatuses++; 7963 else if ( rcPassUp < VINF_EM_FIRST 7964 || rcPassUp > VINF_EM_LAST 7965 || rcPassUp < VBOXSTRICTRC_VAL(rcStrict)) 7966 { 7967 Log(("IEM: rcPassUp=%Rrc! rcStrict=%Rrc\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict))); 7968 pIemCpu->cRetPassUpStatus++; 7969 rcStrict = rcPassUp; 7970 } 7971 else 7972 { 7973 Log(("IEM: rcPassUp=%Rrc rcStrict=%Rrc!\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict))); 7974 pIemCpu->cRetInfStatuses++; 7975 } 7976 } 7977 else if (rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED) 7895 7978 pIemCpu->cRetAspectNotImplemented++; 7896 7979 else if (rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED) 7897 7980 pIemCpu->cRetInstrNotImplemented++; 7898 else if (RT_SUCCESS(rcStrict))7899 pIemCpu->cRetInfStatuses++;7900 7981 else 7901 7982 pIemCpu->cRetErrStatuses++; 7983 } 7984 else if (pIemCpu->rcPassUp != VINF_SUCCESS) 7985 { 7986 pIemCpu->cRetPassUpStatus++; 7987 rcStrict = pIemCpu->rcPassUp; 7902 7988 } 7903 7989 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r42437 r42453 2637 2637 { 2638 2638 if (!IEM_VERIFICATION_ENABLED(pIemCpu)) 2639 rcStrict =CPUMSetGuestIDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit);2639 CPUMSetGuestIDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit); 2640 2640 else 2641 2641 { … … 2644 2644 pCtx->idtr.pIdt = GCPtrBase; 2645 2645 } 2646 if (rcStrict == VINF_SUCCESS) 2647 iemRegAddToRip(pIemCpu, cbInstr); 2646 iemRegAddToRip(pIemCpu, cbInstr); 2648 2647 } 2649 2648 return rcStrict; … … 3001 3000 */ 3002 3001 if (!IEM_VERIFICATION_ENABLED(pIemCpu)) 3003 { 3004 rc = CPUMSetGuestCR0(pVCpu, uNewCrX); 3005 AssertRCSuccessReturn(rc, RT_FAILURE_NP(rc) ? rc : VERR_INTERNAL_ERROR_3); 3006 } 3002 CPUMSetGuestCR0(pVCpu, uNewCrX); 3007 3003 else 3008 3004 pCtx->cr0 = uNewCrX; … … 3041 3037 } 3042 3038 rcStrict = PGMChangeMode(pVCpu, pCtx->cr0, pCtx->cr4, pCtx->msrEFER); 3043 /** @todo Status code management. */3044 3039 } 3045 3040 else … … 3107 3102 AssertRCReturn(rc, rc); 3108 3103 /* ignore informational status codes */ 3109 /** @todo status code management */3110 3104 } 3111 3105 } … … 3120 3114 case 4: 3121 3115 { 3122 uint64_t const uOldCrX = pCtx->cr 0;3116 uint64_t const uOldCrX = pCtx->cr4; 3123 3117 3124 3118 /* reserved bits */ … … 3168 3162 /* SELM - VME may change things wrt to the TSS shadowing. */ 3169 3163 if ((uNewCrX ^ uOldCrX) & X86_CR4_VME) 3164 { 3165 Log(("iemCImpl_load_CrX: VME %d -> %d => Setting VMCPU_FF_SELM_SYNC_TSS\n", 3166 RT_BOOL(uOldCrX & X86_CR4_VME), RT_BOOL(uNewCrX & X86_CR4_VME) )); 3170 3167 VMCPU_FF_SET(pVCpu, VMCPU_FF_SELM_SYNC_TSS); 3168 } 3171 3169 3172 3170 /* PGM - flushing and mode. */ … … 3179 3177 } 3180 3178 rcStrict = PGMChangeMode(pVCpu, pCtx->cr0, pCtx->cr4, pCtx->msrEFER); 3181 /** @todo Status code management. */3182 3179 } 3183 3180 else … … 3202 3199 * Advance the RIP on success. 3203 3200 */ 3204 /** @todo Status code management. */ 3205 if (rcStrict == VINF_SUCCESS) 3201 if (RT_SUCCESS(rcStrict)) 3202 { 3203 if (rcStrict != VINF_SUCCESS) 3204 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 3206 3205 iemRegAddToRip(pIemCpu, cbInstr); 3206 } 3207 3207 3208 return rcStrict; 3208 3209 3209 } 3210 3210 … … 3450 3450 iemRegAddToRip(pIemCpu, cbInstr); 3451 3451 3452 if ( rc == VINF_SUCCESS 3453 || rc == VINF_PGM_SYNC_CR3) 3452 if (rc == VINF_SUCCESS) 3454 3453 return VINF_SUCCESS; 3454 if (rc == VINF_PGM_SYNC_CR3) 3455 return iemSetPassUpStatus(pIemCpu, rc); 3456 3457 AssertMsg(rc == VINF_EM_RAW_EMULATE_INSTR || RT_FAILURE_NP(rc), ("%Rrc\n", rc)); 3455 3458 Log(("PGMInvalidatePage(%RGv) -> %Rrc\n", rc)); 3456 3459 return rc; … … 3563 3566 iemRegAddToRip(pIemCpu, cbInstr); 3564 3567 pIemCpu->cPotentialExits++; 3565 } 3566 /** @todo massage rcStrict. */ 3568 if (rcStrict != VINF_SUCCESS) 3569 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 3570 } 3571 3567 3572 return rcStrict; 3568 3573 } … … 3612 3617 default: AssertFailedReturn(VERR_INTERNAL_ERROR_3); 3613 3618 } 3614 VBOXSTRICTRC rc ;3619 VBOXSTRICTRC rcStrict; 3615 3620 if (!IEM_VERIFICATION_ENABLED(pIemCpu)) 3616 rc = IOMIOPortWrite(IEMCPU_TO_VM(pIemCpu), u16Port, u32Value, cbReg);3621 rcStrict = IOMIOPortWrite(IEMCPU_TO_VM(pIemCpu), u16Port, u32Value, cbReg); 3617 3622 else 3618 rc = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, u32Value, cbReg);3619 if (IOM_SUCCESS(rc ))3623 rcStrict = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, u32Value, cbReg); 3624 if (IOM_SUCCESS(rcStrict)) 3620 3625 { 3621 3626 iemRegAddToRip(pIemCpu, cbInstr); 3622 3627 pIemCpu->cPotentialExits++; 3623 /** @todo massage rc. */ 3624 } 3625 return rc; 3628 if (rcStrict != VINF_SUCCESS) 3629 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 3630 } 3631 return rcStrict; 3626 3632 } 3627 3633 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r42193 r42453 5 5 6 6 /* 7 * Copyright (C) 2011 Oracle Corporation7 * Copyright (C) 2011-2012 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 1124 1124 if (rcStrict != VINF_SUCCESS) 1125 1125 { 1126 /** @todo massage rc */ 1126 if (IOM_SUCCESS(rcStrict)) 1127 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1127 1128 if (uCounterReg == 0) 1128 1129 iemRegAddToRip(pIemCpu, cbInstr); … … 1179 1180 if (rcStrict != VINF_SUCCESS) 1180 1181 { 1181 /** @todo massage IOM status codes! */ 1182 if (IOM_SUCCESS(rcStrict)) 1183 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1182 1184 if (uCounterReg == 0) 1183 1185 iemRegAddToRip(pIemCpu, cbInstr); … … 1228 1230 pCtx->ADDR_rSI -= OP_SIZE / 8; 1229 1231 iemRegAddToRip(pIemCpu, cbInstr); 1230 /** @todo massage IOM status codes. */ 1232 if (rcStrict != VINF_SUCCESS) 1233 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1231 1234 } 1232 1235 } … … 1324 1327 if (rcStrict != VINF_SUCCESS) 1325 1328 { 1326 /** @todo massage IOM rc */ 1329 if (IOM_SUCCESS(rcStrict)) 1330 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1327 1331 if (uCounterReg == 0) 1328 1332 iemRegAddToRip(pIemCpu, cbInstr); … … 1373 1377 if (rcStrict != VINF_SUCCESS) 1374 1378 { 1375 /** @todo massage IOM status codes! */ 1379 if (IOM_SUCCESS(rcStrict)) 1380 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1376 1381 if (uCounterReg == 0) 1377 1382 iemRegAddToRip(pIemCpu, cbInstr); -
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r42186 r42453 4002 4002 } 4003 4003 4004 4005 4006 4007 /** 4008 * Converts a GC physical address to a HC ring-3 pointer, with some 4009 * additional checks. 4010 * 4011 * @returns VBox status code. 4012 * @retval VINF_SUCCESS on success. 4013 * @retval VINF_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write 4014 * access handler of some kind. 4015 * @retval VERR_PGM_PHYS_TLB_CATCH_ALL if the page has a handler catching all 4016 * accesses or is odd in any way. 4017 * @retval VERR_PGM_PHYS_TLB_UNASSIGNED if the page doesn't exist. 4018 * 4019 * @param pVM Pointer to the VM. 4020 * @param GCPhys The GC physical address to convert. Since this is only 4021 * used for filling the REM TLB, the A20 mask must be 4022 * applied before calling this API. 4023 * @param fWritable Whether write access is required. 4024 * @param ppv Where to store the pointer corresponding to GCPhys on 4025 * success. 4026 * @param pLock 4027 * 4028 * @remarks This is more or a less a copy of PGMR3PhysTlbGCPhys2Ptr. 4029 */ 4030 VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers, 4031 void **ppv, PPGMPAGEMAPLOCK pLock) 4032 { 4033 pgmLock(pVM); 4034 PGM_A20_ASSERT_MASKED(VMMGetCpu(pVM), GCPhys); 4035 4036 PPGMRAMRANGE pRam; 4037 PPGMPAGE pPage; 4038 int rc = pgmPhysGetPageAndRangeEx(pVM, GCPhys, &pPage, &pRam); 4039 if (RT_SUCCESS(rc)) 4040 { 4041 if (PGM_PAGE_IS_BALLOONED(pPage)) 4042 rc = VINF_PGM_PHYS_TLB_CATCH_WRITE; 4043 else if ( !PGM_PAGE_HAS_ANY_HANDLERS(pPage) 4044 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) ) 4045 rc = VINF_SUCCESS; 4046 else 4047 { 4048 if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) /* catches MMIO */ 4049 { 4050 Assert(!fByPassHandlers || PGM_PAGE_IS_MMIO(pPage)); 4051 rc = VERR_PGM_PHYS_TLB_CATCH_ALL; 4052 } 4053 else if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && fWritable) 4054 { 4055 Assert(!fByPassHandlers); 4056 rc = VINF_PGM_PHYS_TLB_CATCH_WRITE; 4057 } 4058 } 4059 if (RT_SUCCESS(rc)) 4060 { 4061 int rc2; 4062 4063 /* Make sure what we return is writable. */ 4064 if (fWritable) 4065 switch (PGM_PAGE_GET_STATE(pPage)) 4066 { 4067 case PGM_PAGE_STATE_ALLOCATED: 4068 break; 4069 case PGM_PAGE_STATE_BALLOONED: 4070 AssertFailed(); 4071 break; 4072 case PGM_PAGE_STATE_ZERO: 4073 case PGM_PAGE_STATE_SHARED: 4074 if (rc == VINF_PGM_PHYS_TLB_CATCH_WRITE) 4075 break; 4076 case PGM_PAGE_STATE_WRITE_MONITORED: 4077 rc2 = pgmPhysPageMakeWritable(pVM, pPage, GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK); 4078 AssertLogRelRCReturn(rc2, rc2); 4079 break; 4080 } 4081 4082 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) 4083 PVMCPU pVCpu = VMMGetCpu(pVM); 4084 void *pv; 4085 rc = pgmRZDynMapHCPageInlined(pVCpu, 4086 PGM_PAGE_GET_HCPHYS(pPage), 4087 &pv 4088 RTLOG_COMMA_SRC_POS); 4089 if (RT_FAILURE(rc)) 4090 return rc; 4091 *ppv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK)); 4092 pLock->pvPage = pv; 4093 pLock->pVCpu = pVCpu; 4094 4095 #else 4096 /* Get a ring-3 mapping of the address. */ 4097 PPGMPAGER3MAPTLBE pTlbe; 4098 rc2 = pgmPhysPageQueryTlbeWithPage(pVM, pPage, GCPhys, &pTlbe); 4099 AssertLogRelRCReturn(rc2, rc2); 4100 4101 /* Lock it and calculate the address. */ 4102 if (fWritable) 4103 pgmPhysPageMapLockForWriting(pVM, pPage, pTlbe, pLock); 4104 else 4105 pgmPhysPageMapLockForReading(pVM, pPage, pTlbe, pLock); 4106 *ppv = (void *)((uintptr_t)pTlbe->pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK)); 4107 #endif 4108 4109 4110 Log6(("PGMPhysIemGCPhys2Ptr: GCPhys=%RGp rc=%Rrc pPage=%R[pgmpage] *ppv=%p\n", GCPhys, rc, pPage, *ppv)); 4111 } 4112 else 4113 Log6(("PGMPhysIemGCPhys2Ptr: GCPhys=%RGp rc=%Rrc pPage=%R[pgmpage]\n", GCPhys, rc, pPage)); 4114 4115 /* else: handler catching all access, no pointer returned. */ 4116 } 4117 else 4118 rc = VERR_PGM_PHYS_TLB_UNASSIGNED; 4119 4120 pgmUnlock(pVM); 4121 return rc; 4122 } 4123 -
trunk/src/VBox/VMM/include/IEMInternal.h
r42437 r42453 221 221 /** The current CPU execution mode (CS). */ 222 222 IEMMODE enmCpuMode; 223 /** Info status code that needs to be propagated to the IEM caller. 224 * This cannot be passed internally, as it would complicate all success 225 * checks within the interpreter making the code larger and almost impossible 226 * to get right. Instead, we'll store status codes to pass on here. Each 227 * source of these codes will perform appropriate sanity checks. */ 228 int32_t rcPassUp; 223 229 224 230 /** @name Statistics … … 239 245 /** Counts other error statuses returned. */ 240 246 uint32_t cRetErrStatuses; 247 /** Number of times rcPassUp has been used. */ 248 uint32_t cRetPassUpStatus; 241 249 #ifdef IEM_VERIFICATION_MODE 242 250 /** The Number of I/O port reads that has been performed. */
Note:
See TracChangeset
for help on using the changeset viewer.