VirtualBox

Changeset 102736 in vbox


Ignore:
Timestamp:
Dec 31, 2023 1:06:09 AM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Debugged TLB lookup code on arm and enabled it there. bugref:10371

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

Legend:

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

    r102735 r102736  
    99689968*********************************************************************************************************************************/
    99699969
    9970 #if (defined(RT_ARCH_AMD64) && 1) || (defined(RT_ARCH_ARM64) && 0)
     9970#if (defined(RT_ARCH_AMD64) && 1) || (defined(RT_ARCH_ARM64) && 1)
    99719971# define IEMNATIVE_WITH_TLB_LOOKUP
    99729972#endif
     
    1011810118    {
    1011910119off = iemNativeEmitBrkEx(pCodeBuf, off, 1); /** @todo this needs testing */
    10120         /* cmp  seglim, regptr */
     10120        /* cmp  seglim, regptr */   /** @todo r=bird: why 64-bit compare again? */
    1012110121        if (pTlbState->idxRegPtr != UINT8_MAX)
    1012210122            off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxRegSegLimit, pTlbState->idxRegPtr);
     
    1013610136        /* cmp  reg1, reg2 (64-bit) / imm (32-bit) */
    1013710137        if (pTlbState->idxRegPtr != UINT8_MAX)
    10138             off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg2);
     10138            off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1,
     10139                                               cbMem > 1 ? pTlbState->idxReg2 : pTlbState->idxRegPtr);
    1013910140        else
    1014010141            off = iemNativeEmitCmpGpr32WithImmEx(pCodeBuf, off, pTlbState->idxReg1, (uint32_t)(pTlbState->uAbsPtr + cbMem - 1));
     
    1015010151     */
    1015110152    iemNativeLabelDefine(pReNative, idxLabelTlbLookup, off);
    10152 # if defined(RT_ARCH_ARM64)
    10153     off = iemNativeEmitBrkEx(pCodeBuf, off, 0); /** @todo debug on arm */
     10153# if defined(RT_ARCH_ARM64) && 0
     10154    off = iemNativeEmitBrkEx(pCodeBuf, off, 0);
    1015410155# endif
    1015510156
     
    1039710398    off = iemNativeEmitAddGprImmEx(pCodeBuf, off, pTlbState->idxReg2, RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.aEntries),
    1039810399                                   pTlbState->idxReg3 /*iGprTmp*/);
    10399 
     10400    /* reg2 += pVCpu */
     10401    off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, pTlbState->idxReg2, IEMNATIVE_REG_FIXED_PVMCPU);
    1040010402# else
    1040110403#  error "Port me"
     
    1041110413    off = iemNativeEmitGprByGprDisp(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag));
    1041210414# elif defined(RT_ARCH_ARM64)
    10413     pCodeBuf[off++] = Armv8A64MkInstrStLdRUOff(kArmv8A64InstrLdStType_Ld_Dword, pTlbState->idxReg3,
    10414                                                pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag));
     10415    off = iemNativeEmitLoadGprByGprEx(pCodeBuf, off, pTlbState->idxReg3, pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag));
    1041510416    off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg3);
    1041610417# else
     
    1044310444                                    RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev));
    1044410445# elif defined(RT_ARCH_ARM64)
    10445     pCodeBuf[off++] = Armv8A64MkInstrStLdRUOff(kArmv8A64InstrLdStType_Ld_Dword, pTlbState->idxReg3,
    10446                                                pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, fFlagsAndPhysRev));
     10446    off = iemNativeEmitLoadGprByGprEx(pCodeBuf, off, pTlbState->idxReg3, pTlbState->idxReg2,
     10447                                      RT_UOFFSETOF(IEMTLBENTRY, fFlagsAndPhysRev));
    1044710448    pCodeBuf[off++] = Armv8A64MkInstrAnd(pTlbState->idxReg1, pTlbState->idxReg1, pTlbState->idxReg3);
    10448     off = iemNativeEmitLoadGprFromVCpuU64Ex(pCodeBuf, off, pTlbState->idxReg3,  RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev));
     10449    off = iemNativeEmitLoadGprFromVCpuU64Ex(pCodeBuf, off, pTlbState->idxReg3, RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev));
    1044910450    off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg3);
    1045010451# else
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r102735 r102736  
    25032503    }
    25042504    else
    2505         off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprDst == iGprAddend1 ? iGprAddend1 : iGprAddend2);
     2505        off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprDst != iGprAddend1 ? iGprAddend1 : iGprAddend2);
    25062506
    25072507#elif defined(RT_ARCH_ARM64)
     
    25312531    }
    25322532    else
    2533         off = iemNativeEmitAddTwoGprs32Ex(pCodeBuf, off, iGprDst, iGprDst == iGprAddend1 ? iGprAddend1 : iGprAddend2);
     2533        off = iemNativeEmitAddTwoGprs32Ex(pCodeBuf, off, iGprDst, iGprDst != iGprAddend1 ? iGprAddend1 : iGprAddend2);
    25342534
    25352535#elif defined(RT_ARCH_ARM64)
     
    25512551 */
    25522552DECL_FORCE_INLINE_THROW(uint32_t)
    2553 iemNativeEmitGprEqGprPlusImmEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGprDst, uint8_t iGprAddend, int32_t iImmAddend)
     2553iemNativeEmitGprEqGprPlusImmEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGprDst, uint8_t iGprAddend, int64_t iImmAddend)
    25542554{
    25552555#ifdef RT_ARCH_AMD64
     
    25572557    if ((int8_t)iImmAddend == iImmAddend)
    25582558    {
    2559         /* mov dst, gpradd */
    25602559        off = iemNativeEmitLoadGprFromGprEx(pCodeBuf, off, iGprDst, iGprAddend);
    2561         /* add dst, immadd */
    25622560        off = iemNativeEmitAddGprImm8Ex(pCodeBuf, off, iGprDst, (int8_t)iImmAddend);
    25632561    }
    25642562    else
    25652563    {
    2566         /* mov dst, immadd */
    25672564        off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, iImmAddend);
    2568         /* add dst, gpradd */
    25692565        off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend);
    25702566    }
    25712567
    25722568#elif defined(RT_ARCH_ARM64)
    2573     uint32_t const uAbsImmAddend = RT_ABS(iImmAddend);
     2569    uint64_t const uAbsImmAddend = RT_ABS(iImmAddend);
    25742570    if (uAbsImmAddend < 4096)
    25752571    {
     
    25882584    else if (iGprDst != iGprAddend)
    25892585    {
    2590         off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, (uint32_t)iImmAddend);
     2586        off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, (uint64_t)iImmAddend);
    25912587        off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend);
    25922588    }
     
    26212617    if ((int8_t)iImmAddend == iImmAddend)
    26222618    {
    2623         /* mov dst, gpradd */
    26242619        off = iemNativeEmitLoadGprFromGpr32Ex(pCodeBuf, off, iGprDst, iGprAddend);
    2625         /* add dst, immadd */
    26262620        off = iemNativeEmitAddGpr32Imm8Ex(pCodeBuf, off, iGprDst, (int8_t)iImmAddend);
    26272621    }
    26282622    else
    26292623    {
    2630         /* mov dst, immadd */
    26312624        off = iemNativeEmitLoadGpr32ImmEx(pCodeBuf, off, iGprDst, iImmAddend);
    2632         /* add dst, gpradd */
    26332625        off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend);
    26342626    }
     
    30553047    {
    30563048        if (!fSetFlags)
    3057             pCodeBuf[off++] = Armv8A64MkInstrAndImm(iGprDst, iGprDst, uImmNandS, uImmR, false /*f64Bit*/);
     3049            pCodeBuf[off++] = Armv8A64MkInstrAndImm(iGprDst, iGprSrc, uImmNandS, uImmR, false /*f64Bit*/);
    30583050        else
    3059             pCodeBuf[off++] = Armv8A64MkInstrAndsImm(iGprDst, iGprDst, uImmNandS, uImmR, false /*f64Bit*/);
     3051            pCodeBuf[off++] = Armv8A64MkInstrAndsImm(iGprDst, iGprSrc, uImmNandS, uImmR, false /*f64Bit*/);
    30603052    }
    30613053    else if (iGprDst != iGprSrc)
     
    39243916    else
    39253917    {
    3926         Assert((int64_t)(offLabel - off) <= -0x3ffff);
     3918        Assert(off - offLabel <= 0x3ffffU);
    39273919        pCodeBuf[off++] = Armv8A64MkInstrBCond(enmCond, offLabel - off);
    39283920    }
Note: See TracChangeset for help on using the changeset viewer.

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