- Timestamp:
- Aug 8, 2023 9:01:10 AM (19 months ago)
- svn:sync-xref-src-repo-rev:
- 158717
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllMemRWTmpl.cpp.h
r100820 r100822 75 75 RT_CONCAT3(iemMemFetchData,TMPL_MEM_FN_SUFF,SafeJmp)(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP 76 76 { 77 # if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) 78 pVCpu->iem.s.DataTlb.cTlbSafeReadPath++; 79 # endif 77 80 TMPL_MEM_TYPE const *puSrc = (TMPL_MEM_TYPE const *)iemMemMapJmp(pVCpu, sizeof(*puSrc), iSegReg, GCPtrMem, 78 81 IEM_ACCESS_DATA_R, TMPL_MEM_TYPE_ALIGN); … … 121 124 TMPL_MEM_TYPE uValue) IEM_NOEXCEPT_MAY_LONGJMP 122 125 { 126 # if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) 127 pVCpu->iem.s.DataTlb.cTlbSafeWritePath++; 128 # endif 123 129 Log8(("IEM WR " TMPL_MEM_FMT_DESC " %d|%RGv: " TMPL_MEM_FMT_TYPE "\n", iSegReg, GCPtrMem, uValue)); 124 130 TMPL_MEM_TYPE *puDst = (TMPL_MEM_TYPE *)iemMemMapJmp(pVCpu, sizeof(*puDst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W, 0); -
trunk/src/VBox/VMM/VMMAll/IEMAllMemRWTmplInline.cpp.h
r100821 r100822 31 31 # error "TMPL_MEM_TYPE is undefined" 32 32 #endif 33 #ifndef TMPL_MEM_TYPE_SIZE 34 # error "TMPL_MEM_TYPE_SIZE is undefined" 35 #endif 33 36 #ifndef TMPL_MEM_TYPE_ALIGN 34 # define TMPL_MEM_TYPE_ALIGN (sizeof(TMPL_MEM_TYPE) - 1)37 # error "TMPL_MEM_TYPE_ALIGN is undefined" 35 38 #endif 36 39 #ifndef TMPL_MEM_FN_SUFF … … 56 59 RT_CONCAT3(iemMemFetchData,TMPL_MEM_FN_SUFF,Jmp)(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP 57 60 { 61 AssertCompile(sizeof(TMPL_MEM_TYPE) == TMPL_MEM_TYPE_SIZE); 58 62 # if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) && !defined(TMPL_MEM_NO_INLINE) 59 63 /* … … 61 65 */ 62 66 RTGCPTR GCPtrEff = iemMemApplySegmentToReadJmp(pVCpu, iSegReg, sizeof(TMPL_MEM_TYPE), GCPtrMem); 67 # if TMPL_MEM_TYPE_SIZE > 1 63 68 if (RT_LIKELY((GCPtrEff & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE))) 69 # endif 64 70 { 65 71 /* … … 81 87 STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;}); 82 88 89 # if TMPL_MEM_TYPE_ALIGN != 0 83 90 /* 84 91 * Alignment check: … … 86 93 /** @todo check priority \#AC vs \#PF */ 87 94 AssertCompile(X86_CR0_AM == X86_EFL_AC); 95 AssertCompile(((3U + 1U) << 16) == X86_CR0_AM); 88 96 if ( !(GCPtrEff & TMPL_MEM_TYPE_ALIGN) 89 || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM) 90 || IEM_GET_CPL(pVCpu) != 3) 97 || !( (uint32_t)pVCpu->cpum.GstCtx.cr0 98 & pVCpu->cpum.GstCtx.eflags.u 99 & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */ 100 & X86_CR0_AM)) 101 # endif 91 102 { 92 103 /* … … 99 110 return uRet; 100 111 } 112 # if TMPL_MEM_TYPE_ALIGN != 0 101 113 Log10Func(("Raising #AC for %RGv\n", GCPtrEff)); 102 114 iemRaiseAlignmentCheckExceptionJmp(pVCpu); 115 # endif 103 116 } 104 117 } … … 123 136 * Check that it doesn't cross a page boundrary. 124 137 */ 138 # if TMPL_MEM_TYPE_SIZE > 1 125 139 if (RT_LIKELY((GCPtrMem & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE))) 140 # endif 126 141 { 127 142 /* … … 143 158 STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;}); 144 159 160 # if TMPL_MEM_TYPE_ALIGN != 0 145 161 /* 146 162 * Alignment check: … … 148 164 /** @todo check priority \#AC vs \#PF */ 149 165 AssertCompile(X86_CR0_AM == X86_EFL_AC); 166 AssertCompile(((3U + 1U) << 16) == X86_CR0_AM); 150 167 if ( !(GCPtrMem & TMPL_MEM_TYPE_ALIGN) 151 || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM) 152 || IEM_GET_CPL(pVCpu) != 3) 168 || !( (uint32_t)pVCpu->cpum.GstCtx.cr0 169 & pVCpu->cpum.GstCtx.eflags.u 170 & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */ 171 & X86_CR0_AM)) 172 # endif 153 173 { 154 174 /* … … 161 181 return uRet; 162 182 } 183 # if TMPL_MEM_TYPE_ALIGN != 0 163 184 Log10Func(("Raising #AC for %RGv\n", GCPtrMem)); 164 185 iemRaiseAlignmentCheckExceptionJmp(pVCpu); 186 # endif 165 187 } 166 188 } … … 190 212 */ 191 213 RTGCPTR GCPtrEff = iemMemApplySegmentToWriteJmp(pVCpu, iSegReg, sizeof(TMPL_MEM_TYPE), GCPtrMem); 214 # if TMPL_MEM_TYPE_SIZE > 1 192 215 if (RT_LIKELY((GCPtrEff & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE))) 216 # endif 193 217 { 194 218 /* … … 211 235 STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;}); 212 236 237 # if TMPL_MEM_TYPE_ALIGN != 0 213 238 /* 214 239 * Alignment check: … … 216 241 /** @todo check priority \#AC vs \#PF */ 217 242 AssertCompile(X86_CR0_AM == X86_EFL_AC); 243 AssertCompile(((3U + 1U) << 16) == X86_CR0_AM); 218 244 if ( !(GCPtrEff & TMPL_MEM_TYPE_ALIGN) 219 || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM) 220 || IEM_GET_CPL(pVCpu) != 3) 245 || !( (uint32_t)pVCpu->cpum.GstCtx.cr0 246 & pVCpu->cpum.GstCtx.eflags.u 247 & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */ 248 & X86_CR0_AM)) 249 # endif 221 250 { 222 251 /* … … 229 258 return; 230 259 } 260 # if TMPL_MEM_TYPE_ALIGN != 0 231 261 Log10Func(("Raising #AC for %RGv\n", GCPtrEff)); 232 262 iemRaiseAlignmentCheckExceptionJmp(pVCpu); 263 # endif 233 264 } 234 265 } … … 254 285 * Check that it doesn't cross a page boundrary. 255 286 */ 287 # if TMPL_MEM_TYPE_SIZE > 1 256 288 if (RT_LIKELY((GCPtrMem & GUEST_PAGE_OFFSET_MASK) <= GUEST_PAGE_SIZE - sizeof(TMPL_MEM_TYPE))) 289 # endif 257 290 { 258 291 /* … … 275 308 STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;}); 276 309 310 # if TMPL_MEM_TYPE_ALIGN != 0 277 311 /* 278 312 * Alignment check: … … 280 314 /** @todo check priority \#AC vs \#PF */ 281 315 AssertCompile(X86_CR0_AM == X86_EFL_AC); 316 AssertCompile(((3U + 1U) << 16) == X86_CR0_AM); 282 317 if ( !(GCPtrMem & TMPL_MEM_TYPE_ALIGN) 283 || !((uint32_t)pVCpu->cpum.GstCtx.cr0 & pVCpu->cpum.GstCtx.eflags.u & X86_CR0_AM) 284 || IEM_GET_CPL(pVCpu) != 3) 318 || !( (uint32_t)pVCpu->cpum.GstCtx.cr0 319 & pVCpu->cpum.GstCtx.eflags.u 320 & ((IEM_GET_CPL(pVCpu) + 1U) << 16) /* IEM_GET_CPL(pVCpu) == 3 ? X86_CR0_AM : 0 */ 321 & X86_CR0_AM)) 322 # endif 285 323 { 286 324 /* … … 293 331 return; 294 332 } 333 # if TMPL_MEM_TYPE_ALIGN != 0 295 334 Log10Func(("Raising #AC for %RGv\n", GCPtrMem)); 296 335 iemRaiseAlignmentCheckExceptionJmp(pVCpu); 336 # endif 297 337 } 298 338 } … … 312 352 #undef TMPL_MEM_TYPE 313 353 #undef TMPL_MEM_TYPE_ALIGN 354 #undef TMPL_MEM_TYPE_SIZE 314 355 #undef TMPL_MEM_FN_SUFF 315 356 #undef TMPL_MEM_FMT_TYPE 316 357 #undef TMPL_MEM_FMT_DESC 317 358 #undef TMPL_MEM_NO_STORE 359 -
trunk/src/VBox/VMM/VMMR3/IEMR3.cpp
r100803 r100822 162 162 STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbMisses, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, 163 163 "Data TLB misses", "/IEM/CPU%u/DataTlb-Misses", idCpu); 164 STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbSafeReadPath, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, 165 "Data TLB safe read path", "/IEM/CPU%u/DataTlb-SafeReads", idCpu); 166 STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.cTlbSafeWritePath, STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, 167 "Data TLB safe write path", "/IEM/CPU%u/DataTlb-SafeWrites", idCpu); 164 168 STAMR3RegisterF(pVM, &pVCpu->iem.s.DataTlb.uTlbRevision, STAMTYPE_X64, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE, 165 169 "Data TLB revision", "/IEM/CPU%u/DataTlb-Revision", idCpu); -
trunk/src/VBox/VMM/include/IEMInline.h
r100820 r100822 3413 3413 */ 3414 3414 #define TMPL_MEM_TYPE uint8_t 3415 #define TMPL_MEM_TYPE_ALIGN 0 3416 #define TMPL_MEM_TYPE_SIZE 1 3415 3417 #define TMPL_MEM_FN_SUFF U8 3416 3418 #define TMPL_MEM_FMT_TYPE "%#04x" … … 3419 3421 3420 3422 #define TMPL_MEM_TYPE uint16_t 3423 #define TMPL_MEM_TYPE_ALIGN 1 3424 #define TMPL_MEM_TYPE_SIZE 2 3421 3425 #define TMPL_MEM_FN_SUFF U16 3422 3426 #define TMPL_MEM_FMT_TYPE "%#06x" … … 3425 3429 3426 3430 #define TMPL_MEM_TYPE uint32_t 3431 #define TMPL_MEM_TYPE_ALIGN 3 3432 #define TMPL_MEM_TYPE_SIZE 4 3427 3433 #define TMPL_MEM_FN_SUFF U32 3428 3434 #define TMPL_MEM_FMT_TYPE "%#010x" … … 3431 3437 3432 3438 #define TMPL_MEM_TYPE uint64_t 3439 #define TMPL_MEM_TYPE_ALIGN 7 3440 #define TMPL_MEM_TYPE_SIZE 8 3433 3441 #define TMPL_MEM_FN_SUFF U64 3434 3442 #define TMPL_MEM_FMT_TYPE "%#018RX64" … … 3438 3446 #define TMPL_MEM_NO_STORE 3439 3447 #define TMPL_MEM_TYPE uint64_t 3440 #define TMPL_MEM_TYPE_ALIGN (sizeof(uint64_t) * 2 - 1) 3448 #define TMPL_MEM_TYPE_ALIGN 15 3449 #define TMPL_MEM_TYPE_SIZE 8 3441 3450 #define TMPL_MEM_FN_SUFF U64AlignedU128 3442 3451 #define TMPL_MEM_FMT_TYPE "%#018RX64" 3443 3452 #define TMPL_MEM_FMT_DESC "qword" 3444 3453 #include "../VMMAll/IEMAllMemRWTmplInline.cpp.h" 3445 #undef TMPL_MEM_NO_STORE3446 3454 3447 3455 /** @} */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r100820 r100822 484 484 /** Slow read path. */ 485 485 uint32_t cTlbSlowReadPath; 486 /** Safe read path. */ 487 uint32_t cTlbSafeReadPath; 488 /** Safe write path. */ 489 uint32_t cTlbSafeWritePath; 486 490 #if 0 487 491 /** TLB misses because of tag mismatch. */ … … 499 503 #endif 500 504 /** Alignment padding. */ 501 uint32_t au32Padding[ 3+5];505 uint32_t au32Padding[6]; 502 506 } IEMTLB; 503 507 AssertCompileSizeAlignment(IEMTLB, 64);
Note:
See TracChangeset
for help on using the changeset viewer.