VirtualBox

Changeset 105250 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 10, 2024 1:47:33 AM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: invlpg assertion fix + optimization. bugref:10687

File:
1 edited

Legend:

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

    r105177 r105250  
    740740     * G bit to accomplish this.
    741741     */
    742     bool fMaybeLargePage = true;
     742    int fMaybeLargePage = -1;
    743743    if (pTlb->aEntries[idxEven].uTag == (GCPtrTag | pTlb->uTlbRevision))
    744744    {
     
    786786                if ((pTlb->aEntries[idxEven].uTag & GCPtrTagMask) == GCPtrTag)
    787787                {
    788                     Assert(pTlb->aEntries[idxEven].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE); /* bad guest */
    789                     pTlb->aEntries[idxEven].uTag = 0;
    790                     if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
    791                         pVCpu->iem.s.cbInstrBufTotal = 0;
     788                    if (pTlb->aEntries[idxEven].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE)
     789                    {
     790                        pTlb->aEntries[idxEven].uTag = 0;
     791                        if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
     792                            pVCpu->iem.s.cbInstrBufTotal = 0;
     793                        fMaybeLargePage = true;
     794                    }
     795                    else
     796                    {
     797                        Assert(fMaybeLargePage == -1);
     798                        break;
     799                    }
    792800                }
    793801                if ((pTlb->aEntries[idxEven + 1].uTag & GCPtrTagMask) == GCPtrTagGlob)
    794802                {
    795                     Assert(pTlb->aEntries[idxEven + 1].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE); /* bad guest */
    796                     pTlb->aEntries[idxEven + 1].uTag = 0;
    797                     if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
    798                         pVCpu->iem.s.cbInstrBufTotal = 0;
     803                    if (pTlb->aEntries[idxEven + 1].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE)
     804                    {
     805                        pTlb->aEntries[idxEven + 1].uTag = 0;
     806                        if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
     807                            pVCpu->iem.s.cbInstrBufTotal = 0;
     808                        fMaybeLargePage = true;
     809                    }
     810                    else
     811                    {
     812                        Assert(fMaybeLargePage == -1);
     813                        break;
     814                    }
    799815                }
    800816                GCPtrTag++;
     
    823839                if ((pTlb->aEntries[idxEven].uTag & GCPtrTagMask) == GCPtrTag)
    824840                {
    825                     Assert(pTlb->aEntries[idxEven].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE); /* bad guest */
    826                     pTlb->aEntries[idxEven].uTag = 0;
    827                     if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
    828                         pVCpu->iem.s.cbInstrBufTotal = 0;
     841                    if (pTlb->aEntries[idxEven].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE)
     842                    {
     843                        pTlb->aEntries[idxEven].uTag = 0;
     844                        if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
     845                            pVCpu->iem.s.cbInstrBufTotal = 0;
     846                        fMaybeLargePage = true;
     847                    }
     848                    else
     849                    {
     850                        Assert(fMaybeLargePage == -1);
     851                        break;
     852                    }
    829853                }
    830854                if ((pTlb->aEntries[idxEven + 1].uTag & GCPtrTagMask) == GCPtrTagGlob)
    831855                {
    832                     Assert(pTlb->aEntries[idxEven + 1].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE); /* bad guest */
    833                     pTlb->aEntries[idxEven + 1].uTag = 0;
    834                     if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
    835                         pVCpu->iem.s.cbInstrBufTotal = 0;
     856                    if (pTlb->aEntries[idxEven + 1].fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE)
     857                    {
     858                        pTlb->aEntries[idxEven + 1].uTag = 0;
     859                        if (!a_fDataTlb && GCPtrTag == GCPtrInstrBufPcTag)
     860                            pVCpu->iem.s.cbInstrBufTotal = 0;
     861                        fMaybeLargePage = true;
     862                    }
     863                    else
     864                    {
     865                        Assert(fMaybeLargePage == -1);
     866                        break;
     867                    }
    836868                }
    837869                GCPtrTag++;
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