VirtualBox

Changeset 42633 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 6, 2012 5:22:56 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
79829
Message:

IEM: Implemented CMPXCHG8B. Fixed PGMPhysIemGCPhys2Ptr so that it doesn't return informational status returns, only VINF_SUCCESS and errors.

Location:
trunk/src/VBox/VMM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r42621 r42633  
    46714671                                  pLock);
    46724672    /*Log(("PGMPhysIemGCPhys2Ptr %Rrc pLock=%.*Rhxs\n", rc, sizeof(*pLock), pLock));*/
     4673    AssertMsg(rc == VINF_SUCCESS || RT_FAILURE_NP(rc), ("%Rrc\n", rc));
    46734674    return rc;
    46744675}
     
    49784979     * Filter out conditions we can handle and the ones which shouldn't happen.
    49794980     */
    4980     if (   rcMap != VINF_PGM_PHYS_TLB_CATCH_WRITE
     4981    if (   rcMap != VERR_PGM_PHYS_TLB_CATCH_WRITE
    49814982        && rcMap != VERR_PGM_PHYS_TLB_CATCH_ALL
    49824983        && rcMap != VERR_PGM_PHYS_TLB_UNASSIGNED)
     
    73337334
    73347335    /*
     7336     * Always note down the address of the current instruction.
     7337     */
     7338    pIemCpu->uOldCs  = pOrgCtx->cs.Sel;
     7339    pIemCpu->uOldRip = pOrgCtx->rip;
     7340
     7341    /*
    73357342     * Enable verification and/or logging.
    73367343     */
     
    73667373            || (pOrgCtx->cs.Sel == 0x58 && pOrgCtx->rip == 0x3be) /* NT4SP1 sidt/sgdt in early loader code */
    73677374#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
    73687387           )
    73697388       )
     
    76497668
    76507669    char szInstr1[256];
    7651     DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, pCtx->cs.Sel, pCtx->rip - pIemCpu->offOpcode,
     7670    DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, pIemCpu->uOldCs, pIemCpu->uOldRip,
    76527671                       DBGF_DISAS_FLAGS_DEFAULT_MODE,
    76537672                       szInstr1, sizeof(szInstr1), NULL);
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r40523 r42633  
    5050;         prefix argument.
    5151;
    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)
    5353%ifdef RT_ARCH_X86
    5454 %ifdef RT_OS_WINDOWS
     
    704704%endif
    705705ENDPROC 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;
     720BEGINCODE
     721BEGINPROC_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
     794ENDPROC iemAImpl_cmpxchg8b
     795
     796BEGINPROC_FASTCALL iemAImpl_cmpxchg8b_locked, 16
     797        ; Lazy bird always lock prefixes cmpxchg8b.
     798        jmp     NAME_FASTCALL(iemAImpl_cmpxchg8b,16,$@)
     799ENDPROC iemAImpl_cmpxchg8b_locked
     800
    706801
    707802
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r42625 r42633  
    451451                pCtx->ADDR_rDI = uAddrReg    += i * cbIncr;
    452452                pCtx->eflags.u = uEFlags;
    453                 Assert(!(uEFlags & X86_EFL_ZF) == (i < cLeftPage));
     453                Assert(!(uEFlags & X86_EFL_ZF) == fQuit);
    454454                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    455455                if (fQuit)
     
    576576                pCtx->ADDR_rDI = uAddrReg    += i * cbIncr;
    577577                pCtx->eflags.u = uEFlags;
    578                 Assert((!(uEFlags & X86_EFL_ZF) != (i < cLeftPage)) || (i == cLeftPage));
     578                Assert(!!(uEFlags & X86_EFL_ZF) == fQuit);
    579579                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    580580                if (fQuit)
     
    604604                return rcStrict;
    605605            RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
    606 
    607606            pCtx->ADDR_rDI = uAddrReg += cbIncr;
    608607            pCtx->ADDR_rCX = --uCounterReg;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r42623 r42633  
    48094809FNIEMOP_STUB(iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib);
    48104810
     4811
    48114812/** Opcode 0x0f 0xc7 !11/1. */
    4812 FNIEMOP_STUB_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm);
     4813FNIEMOP_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
    48134857
    48144858/** Opcode REX.W 0x0f 0xc7 !11/1. */
     
    97919835                switch (pIemCpu->enmEffAddrMode)
    97929836                {
    9793                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m16);
    9794                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m32);
    9795                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_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);
    97969840                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    97979841                }
     
    98009844                switch (pIemCpu->enmEffAddrMode)
    98019845                {
    9802                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m16);
    9803                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m32);
    9804                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_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);
    98059849                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    98069850                }
     
    98099853                {
    98109854                    case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
    9811                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_rax_m32);
    9812                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_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);
    98139857                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    98149858                }
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r42484 r42633  
    40094009 * additional checks.
    40104010 *
    4011  * @returns VBox status code.
     4011 * @returns VBox status code (no informational statuses).
    40124012 * @retval  VINF_SUCCESS on success.
    4013  * @retval  VINF_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write
     4013 * @retval  VERR_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write
    40144014 *          access handler of some kind.
    40154015 * @retval  VERR_PGM_PHYS_TLB_CATCH_ALL if the page has a handler catching all
     
    40404040    {
    40414041        if (PGM_PAGE_IS_BALLOONED(pPage))
    4042             rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
     4042            rc = VERR_PGM_PHYS_TLB_CATCH_WRITE;
    40434043        else if (   !PGM_PAGE_HAS_ANY_HANDLERS(pPage)
    40444044                 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) )
     
    40544054            {
    40554055                Assert(!fByPassHandlers);
    4056                 rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
     4056                rc = VERR_PGM_PHYS_TLB_CATCH_WRITE;
    40574057            }
    40584058        }
     
    40694069                    case PGM_PAGE_STATE_BALLOONED:
    40704070                        AssertFailed();
    4071                         break;
    40724071                    case PGM_PAGE_STATE_ZERO:
    40734072                    case PGM_PAGE_STATE_SHARED:
    4074                         if (rc == VINF_PGM_PHYS_TLB_CATCH_WRITE)
    4075                             break;
    40764073                    case PGM_PAGE_STATE_WRITE_MONITORED:
    40774074                        rc2 = pgmPhysPageMakeWritable(pVM, pPage, GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r42621 r42633  
    261261     *  was executed, causing the memory write records to be incorrrect. */
    262262    bool                    fOverlappingMovs;
    263     bool                    afAlignment2[1];
     263    bool                    afAlignment2[1+4];
    264264    /** Mask of undefined eflags.
    265265     * The verifier will any difference in these flags. */
    266266    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;
    267271    /** The physical address corresponding to abOpcodes[0]. */
    268272    RTGCPHYS                GCPhysOpcodes;
     
    617621/** @}  */
    618622
     623/** @name Compare and exchange.
     624 * @{ */
     625IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx,
     626                                            uint32_t *pEFlags));
     627IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b_locked,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx,
     628                                                   uint32_t *pEFlags));
     629IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg16b,(PRTUINT128U *pu128Dst, PRTUINT128U pu64RaxRdx, PRTUINT128U pu64RbxRcx,
     630                                             uint32_t *pEFlags));
     631IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg16b_locked,(PRTUINT128U *pu128Dst, PRTUINT128U pu64RaxRdx, PRTUINT128U pu64RbxRcx,
     632                                                    uint32_t *pEFlags));
     633/** @} */
     634
    619635/** @name Double precision shifts
    620636 * @{ */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette