Changeset 42633 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Aug 6, 2012 5:22:56 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 79829
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r42621 r42633 4671 4671 pLock); 4672 4672 /*Log(("PGMPhysIemGCPhys2Ptr %Rrc pLock=%.*Rhxs\n", rc, sizeof(*pLock), pLock));*/ 4673 AssertMsg(rc == VINF_SUCCESS || RT_FAILURE_NP(rc), ("%Rrc\n", rc)); 4673 4674 return rc; 4674 4675 } … … 4978 4979 * Filter out conditions we can handle and the ones which shouldn't happen. 4979 4980 */ 4980 if ( rcMap != V INF_PGM_PHYS_TLB_CATCH_WRITE4981 if ( rcMap != VERR_PGM_PHYS_TLB_CATCH_WRITE 4981 4982 && rcMap != VERR_PGM_PHYS_TLB_CATCH_ALL 4982 4983 && rcMap != VERR_PGM_PHYS_TLB_UNASSIGNED) … … 7333 7334 7334 7335 /* 7336 * Always note down the address of the current instruction. 7337 */ 7338 pIemCpu->uOldCs = pOrgCtx->cs.Sel; 7339 pIemCpu->uOldRip = pOrgCtx->rip; 7340 7341 /* 7335 7342 * Enable verification and/or logging. 7336 7343 */ … … 7366 7373 || (pOrgCtx->cs.Sel == 0x58 && pOrgCtx->rip == 0x3be) /* NT4SP1 sidt/sgdt in early loader code */ 7367 7374 #endif 7375 #if 0 7376 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8013ec28) /* NT4SP1 first str (early boot) */ 7377 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x80119e3f) /* NT4SP1 second str (early boot) */ 7378 #endif 7379 #if 0 /* NT4SP1 - later on the blue screen, things goes wrong... */ 7380 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8010a5df) 7381 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8013a7c4) 7382 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8013a7d2) 7383 #endif 7384 #if 1 /* NT4SP1 - xadd early boot. */ 7385 || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8019cf0f) 7386 #endif 7368 7387 ) 7369 7388 ) … … 7649 7668 7650 7669 char szInstr1[256]; 7651 DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, p Ctx->cs.Sel, pCtx->rip - pIemCpu->offOpcode,7670 DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, pIemCpu->uOldCs, pIemCpu->uOldRip, 7652 7671 DBGF_DISAS_FLAGS_DEFAULT_MODE, 7653 7672 szInstr1, sizeof(szInstr1), NULL); -
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r40523 r42633 50 50 ; prefix argument. 51 51 ; 52 %define NAME_FASTCALL(a_Name, a_cbArgs, a_ Dollar) NAME(a_Name)52 %define NAME_FASTCALL(a_Name, a_cbArgs, a_Prefix) NAME(a_Name) 53 53 %ifdef RT_ARCH_X86 54 54 %ifdef RT_OS_WINDOWS … … 704 704 %endif 705 705 ENDPROC iemAImpl_xadd_u64_locked 706 707 708 ; 709 ; CMPXCHG8B. 710 ; 711 ; These are tricky register wise, so the code is duplicated for each calling 712 ; convention. 713 ; 714 ; WARNING! This code make ASSUMPTIONS about which registers T1 and T0 are mapped to! 715 ; 716 ; C-proto: 717 ; IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx, 718 ; uint32_t *pEFlags)); 719 ; 720 BEGINCODE 721 BEGINPROC_FASTCALL iemAImpl_cmpxchg8b, 16 722 %ifdef RT_ARCH_AMD64 723 %ifdef ASM_CALL64_MSC 724 push rbx 725 726 mov r11, rdx ; pu64EaxEdx (is also T1) 727 mov r10, rcx ; pu64Dst 728 729 mov ebx, [r8] 730 mov ecx, [r8 + 4] 731 IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0 ; clobbers T0 (eax) 732 mov eax, [r11] 733 mov edx, [r11 + 4] 734 735 lock cmpxchg8b [r10] 736 737 mov [r11], eax 738 mov [r11 + 4], edx 739 IEM_SAVE_FLAGS r9, (X86_EFL_ZF), 0 ; clobbers T0+T1 (eax, r11) 740 741 pop rbx 742 ret 743 %else 744 push rbx 745 746 mov r10, rcx ; pEFlags 747 mov r11, rdx ; pu64EbxEcx (is also T1) 748 749 mov ebx, [r11] 750 mov ecx, [r11 + 4] 751 IEM_MAYBE_LOAD_FLAGS r10, (X86_EFL_ZF), 0 ; clobbers T0 (eax) 752 mov eax, [rsi] 753 mov edx, [rsi + 4] 754 755 lock cmpxchg8b [rdi] 756 757 mov [rsi], eax 758 mov [rsi + 4], edx 759 IEM_SAVE_FLAGS r10, (X86_EFL_ZF), 0 ; clobbers T0+T1 (eax, r11) 760 761 pop rbx 762 ret 763 764 %endif 765 %else 766 push esi 767 push edi 768 push ebx 769 push ebp 770 771 mov edi, ecx ; pu64Dst 772 mov esi, edx ; pu64EaxEdx 773 mov ecx, [esp + 16 + 4 + 0] ; pu64EbxEcx 774 mov ebp, [esp + 16 + 4 + 4] ; pEFlags 775 776 mov ebx, [ecx] 777 mov ecx, [ecx + 4] 778 IEM_MAYBE_LOAD_FLAGS rbp, (X86_EFL_ZF), 0 ; clobbers T0 (eax) 779 mov eax, [esi] 780 mov edx, [esi + 4] 781 782 lock cmpxchg8b [edi] 783 784 mov [rsi], eax 785 mov [rsi + 4], edx 786 IEM_SAVE_FLAGS rbp, (X86_EFL_ZF), 0 ; clobbers T0+T1 (eax, edi) 787 788 pop ebp 789 pop ebx 790 pop edi 791 pop esi 792 ret 8 793 %endif 794 ENDPROC iemAImpl_cmpxchg8b 795 796 BEGINPROC_FASTCALL iemAImpl_cmpxchg8b_locked, 16 797 ; Lazy bird always lock prefixes cmpxchg8b. 798 jmp NAME_FASTCALL(iemAImpl_cmpxchg8b,16,$@) 799 ENDPROC iemAImpl_cmpxchg8b_locked 800 706 801 707 802 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r42625 r42633 451 451 pCtx->ADDR_rDI = uAddrReg += i * cbIncr; 452 452 pCtx->eflags.u = uEFlags; 453 Assert(!(uEFlags & X86_EFL_ZF) == (i < cLeftPage));453 Assert(!(uEFlags & X86_EFL_ZF) == fQuit); 454 454 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem); 455 455 if (fQuit) … … 576 576 pCtx->ADDR_rDI = uAddrReg += i * cbIncr; 577 577 pCtx->eflags.u = uEFlags; 578 Assert( (!(uEFlags & X86_EFL_ZF) != (i < cLeftPage)) || (i == cLeftPage));578 Assert(!!(uEFlags & X86_EFL_ZF) == fQuit); 579 579 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem); 580 580 if (fQuit) … … 604 604 return rcStrict; 605 605 RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags); 606 607 606 pCtx->ADDR_rDI = uAddrReg += cbIncr; 608 607 pCtx->ADDR_rCX = --uCounterReg; -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r42623 r42633 4809 4809 FNIEMOP_STUB(iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib); 4810 4810 4811 4811 4812 /** Opcode 0x0f 0xc7 !11/1. */ 4812 FNIEMOP_STUB_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm); 4813 FNIEMOP_DEF_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm) 4814 { 4815 IEMOP_MNEMONIC("cmpxchg8b Mq"); 4816 4817 IEM_MC_BEGIN(4, 3); 4818 IEM_MC_ARG(uint64_t *, pu64MemDst, 0); 4819 IEM_MC_ARG(PRTUINT64U, pu64EaxEdx, 1); 4820 IEM_MC_ARG(PRTUINT64U, pu64EbxEcx, 2); 4821 IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 3); 4822 IEM_MC_LOCAL(RTUINT64U, u64EaxEdx); 4823 IEM_MC_LOCAL(RTUINT64U, u64EbxEcx); 4824 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 4825 4826 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 4827 IEMOP_HLP_DONE_DECODING(); 4828 IEM_MC_MEM_MAP(pu64MemDst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/); 4829 4830 IEM_MC_FETCH_GREG_U32(u64EaxEdx.s.Lo, X86_GREG_xAX); 4831 IEM_MC_FETCH_GREG_U32(u64EaxEdx.s.Hi, X86_GREG_xDX); 4832 IEM_MC_REF_LOCAL(pu64EaxEdx, u64EaxEdx); 4833 4834 IEM_MC_FETCH_GREG_U32(u64EbxEcx.s.Lo, X86_GREG_xBX); 4835 IEM_MC_FETCH_GREG_U32(u64EbxEcx.s.Hi, X86_GREG_xCX); 4836 IEM_MC_REF_LOCAL(pu64EbxEcx, u64EbxEcx); 4837 4838 IEM_MC_FETCH_EFLAGS(EFlags); 4839 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)) 4840 IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg8b, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags); 4841 else 4842 IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg8b_locked, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags); 4843 4844 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64MemDst, IEM_ACCESS_DATA_RW); 4845 IEM_MC_COMMIT_EFLAGS(EFlags); 4846 IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF) 4847 /** @todo Testcase: Check effect of cmpxchg8b on bits 63:32 in rax and rdx. */ 4848 IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u64EaxEdx.s.Lo); 4849 IEM_MC_STORE_GREG_U32(X86_GREG_xDX, u64EaxEdx.s.Hi); 4850 IEM_MC_ENDIF(); 4851 IEM_MC_ADVANCE_RIP(); 4852 4853 IEM_MC_END(); 4854 return VINF_SUCCESS; 4855 } 4856 4813 4857 4814 4858 /** Opcode REX.W 0x0f 0xc7 !11/1. */ … … 9791 9835 switch (pIemCpu->enmEffAddrMode) 9792 9836 { 9793 case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_ax_m16);9794 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_ax_m32);9795 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_ax_m64);9837 case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m16); 9838 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m32); 9839 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m64); 9796 9840 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 9797 9841 } … … 9800 9844 switch (pIemCpu->enmEffAddrMode) 9801 9845 { 9802 case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_eax_m16);9803 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_eax_m32);9804 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_eax_m64);9846 case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m16); 9847 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m32); 9848 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m64); 9805 9849 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 9806 9850 } … … 9809 9853 { 9810 9854 case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3); 9811 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_rax_m32);9812 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rep e_scas_rax_m64);9855 case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m32); 9856 case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m64); 9813 9857 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 9814 9858 } -
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r42484 r42633 4009 4009 * additional checks. 4010 4010 * 4011 * @returns VBox status code .4011 * @returns VBox status code (no informational statuses). 4012 4012 * @retval VINF_SUCCESS on success. 4013 * @retval V INF_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write4013 * @retval VERR_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write 4014 4014 * access handler of some kind. 4015 4015 * @retval VERR_PGM_PHYS_TLB_CATCH_ALL if the page has a handler catching all … … 4040 4040 { 4041 4041 if (PGM_PAGE_IS_BALLOONED(pPage)) 4042 rc = V INF_PGM_PHYS_TLB_CATCH_WRITE;4042 rc = VERR_PGM_PHYS_TLB_CATCH_WRITE; 4043 4043 else if ( !PGM_PAGE_HAS_ANY_HANDLERS(pPage) 4044 4044 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) ) … … 4054 4054 { 4055 4055 Assert(!fByPassHandlers); 4056 rc = V INF_PGM_PHYS_TLB_CATCH_WRITE;4056 rc = VERR_PGM_PHYS_TLB_CATCH_WRITE; 4057 4057 } 4058 4058 } … … 4069 4069 case PGM_PAGE_STATE_BALLOONED: 4070 4070 AssertFailed(); 4071 break;4072 4071 case PGM_PAGE_STATE_ZERO: 4073 4072 case PGM_PAGE_STATE_SHARED: 4074 if (rc == VINF_PGM_PHYS_TLB_CATCH_WRITE)4075 break;4076 4073 case PGM_PAGE_STATE_WRITE_MONITORED: 4077 4074 rc2 = pgmPhysPageMakeWritable(pVM, pPage, GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK); -
trunk/src/VBox/VMM/include/IEMInternal.h
r42621 r42633 261 261 * was executed, causing the memory write records to be incorrrect. */ 262 262 bool fOverlappingMovs; 263 bool afAlignment2[1 ];263 bool afAlignment2[1+4]; 264 264 /** Mask of undefined eflags. 265 265 * The verifier will any difference in these flags. */ 266 266 uint32_t fUndefinedEFlags; 267 /** The CS of the instruction being interpreted. */ 268 RTSEL uOldCs; 269 /** The RIP of the instruction being interpreted. */ 270 uint64_t uOldRip; 267 271 /** The physical address corresponding to abOpcodes[0]. */ 268 272 RTGCPHYS GCPhysOpcodes; … … 617 621 /** @} */ 618 622 623 /** @name Compare and exchange. 624 * @{ */ 625 IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx, 626 uint32_t *pEFlags)); 627 IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b_locked,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx, 628 uint32_t *pEFlags)); 629 IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg16b,(PRTUINT128U *pu128Dst, PRTUINT128U pu64RaxRdx, PRTUINT128U pu64RbxRcx, 630 uint32_t *pEFlags)); 631 IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg16b_locked,(PRTUINT128U *pu128Dst, PRTUINT128U pu64RaxRdx, PRTUINT128U pu64RbxRcx, 632 uint32_t *pEFlags)); 633 /** @} */ 634 619 635 /** @name Double precision shifts 620 636 * @{ */
Note:
See TracChangeset
for help on using the changeset viewer.