VirtualBox

Changeset 105591 in vbox


Ignore:
Timestamp:
Aug 5, 2024 11:05:33 PM (7 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164270
Message:

VMM/IEM: Fixed a bug in iemTlbInvalidateLargePageWorkerInner for TLB sizes less than 512 for 2MB pages, and 1024 for 4MB pages. bugref:10727

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

Legend:

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

    r105579 r105591  
    781781    IEMTLBTRACE_LARGE_SCAN(pVCpu, a_fGlobal, a_fNonGlobal, a_fDataTlb);
    782782
    783     /* Combine TAG values with the TLB revisions. */
     783    /*
     784     * Combine TAG values with the TLB revisions.
     785     */
    784786    RTGCPTR GCPtrTagGlob = a_fGlobal ? GCPtrTag | pTlb->uTlbRevisionGlobal : 0;
    785787    if (a_fNonGlobal)
    786788        GCPtrTag |= pTlb->uTlbRevision;
    787789
    788     /* Set up the scan. */
    789     bool const      fPartialScan = IEMTLB_ENTRY_COUNT >= (a_f2MbLargePage ? 512 : 1024);
    790     uintptr_t       idxEven      = fPartialScan ? IEMTLB_TAG_TO_EVEN_INDEX(GCPtrTag) : 0;
     790    /*
     791     * Set up the scan.
     792     *
     793     * GCPtrTagMask: A 2MB page consists of 512 4K pages, so a 256 TLB will map
     794     * offset zero and offset 1MB to the same slot pair.  Our GCPtrTag[Globl]
     795     * values are for the range 0-1MB, or slots 0-256.  So, we construct a mask
     796     * that fold large page offsets 1MB-2MB into the 0-1MB range.
     797     *
     798     * For our example with 2MB pages and a 256 entry TLB: 0xfffffffffffffeff
     799     */
     800    bool const      fPartialScan = IEMTLB_ENTRY_COUNT > (a_f2MbLargePage ? 512 : 1024);
     801    uintptr_t       idxEven      = fPartialScan ? IEMTLB_TAG_TO_EVEN_INDEX(GCPtrTag)             : 0;
    791802    uintptr_t const idxEvenEnd   = fPartialScan ? idxEven + ((a_f2MbLargePage ? 512 : 1024) * 2) : IEMTLB_ENTRY_COUNT * 2;
    792     RTGCPTR const   GCPtrTagMask = fPartialScan
    793                                  ? ~(RTGCPTR)0
    794                                  :   ~(RTGCPTR)GUEST_PAGE_OFFSET_MASK
    795                                    & ~(RTGCPTR)(   (RT_BIT_64(RT_MAX(  (a_f2MbLargePage ? 9 : 10)
    796                                                                      - IEMTLB_ENTRY_COUNT_AS_POWER_OF_TWO, 0)) - 1U)
    797                                                 << IEMTLB_ENTRY_COUNT_AS_POWER_OF_TWO);
     803    RTGCPTR const   GCPtrTagMask = fPartialScan ? ~(RTGCPTR)0
     804                                 : ~(RTGCPTR)(  (RT_BIT_32(a_f2MbLargePage ? 9 : 10) - 1U)
     805                                              & ~(uint32_t)(RT_BIT_32(IEMTLB_ENTRY_COUNT_AS_POWER_OF_TWO) - 1U));
     806IEMTLBTRACE_USER3(pVCpu, GCPtrTagMask, GCPtrTag, RT_MAKE_U32(idxEven, idxEvenEnd), a_fDataTlb);
    798807
    799808    /*
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r105579 r105591  
    12571257    uint64_t const    uTag  = IEMTLB_CALC_TAG_NO_REV(uAddress);
    12581258#ifdef IEMTLB_TAG_TO_EVEN_INDEX
    1259     uint32_t const    uSlot = IEMTLB_TAG_TO_EVEN_INDEX(uAddress);
     1259    uint32_t const    uSlot = IEMTLB_TAG_TO_EVEN_INDEX(uTag);
    12601260#else
    1261     uint32_t const    uSlot = IEMTLB_TAG_TO_INDEX(uAddress);
     1261    uint32_t const    uSlot = IEMTLB_TAG_TO_INDEX(uTag);
    12621262#endif
    12631263    IEMTLBENTRY const TlbeL = pTlb->aEntries[uSlot];
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