Changeset 105591 in vbox
- Timestamp:
- Aug 5, 2024 11:05:33 PM (7 months ago)
- svn:sync-xref-src-repo-rev:
- 164270
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r105579 r105591 781 781 IEMTLBTRACE_LARGE_SCAN(pVCpu, a_fGlobal, a_fNonGlobal, a_fDataTlb); 782 782 783 /* Combine TAG values with the TLB revisions. */ 783 /* 784 * Combine TAG values with the TLB revisions. 785 */ 784 786 RTGCPTR GCPtrTagGlob = a_fGlobal ? GCPtrTag | pTlb->uTlbRevisionGlobal : 0; 785 787 if (a_fNonGlobal) 786 788 GCPtrTag |= pTlb->uTlbRevision; 787 789 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; 791 802 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)); 806 IEMTLBTRACE_USER3(pVCpu, GCPtrTagMask, GCPtrTag, RT_MAKE_U32(idxEven, idxEvenEnd), a_fDataTlb); 798 807 799 808 /* -
trunk/src/VBox/VMM/VMMR3/IEMR3.cpp
r105579 r105591 1257 1257 uint64_t const uTag = IEMTLB_CALC_TAG_NO_REV(uAddress); 1258 1258 #ifdef IEMTLB_TAG_TO_EVEN_INDEX 1259 uint32_t const uSlot = IEMTLB_TAG_TO_EVEN_INDEX(u Address);1259 uint32_t const uSlot = IEMTLB_TAG_TO_EVEN_INDEX(uTag); 1260 1260 #else 1261 uint32_t const uSlot = IEMTLB_TAG_TO_INDEX(u Address);1261 uint32_t const uSlot = IEMTLB_TAG_TO_INDEX(uTag); 1262 1262 #endif 1263 1263 IEMTLBENTRY const TlbeL = pTlb->aEntries[uSlot];
Note:
See TracChangeset
for help on using the changeset viewer.