Changeset 100822 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Aug 8, 2023 9:01:10 AM (19 months ago)
- svn:sync-xref-src-repo-rev:
- 158717
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 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
Note:
See TracChangeset
for help on using the changeset viewer.