- Timestamp:
- May 27, 2019 8:52:25 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 130863
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r78771 r78776 3168 3168 Assert(iGReg < X86_GREG_COUNT); 3169 3169 3170 PCVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs); 3171 Assert(pVmcs); 3172 3173 uint64_t uGuestCrX; 3174 uint64_t fGstHostMask; 3175 uint64_t fReadShadow; 3176 if (iCrReg == 0) 3177 { 3178 IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0); 3179 uGuestCrX = pVCpu->cpum.GstCtx.cr0; 3180 fGstHostMask = pVmcs->u64Cr0Mask.u; 3181 fReadShadow = pVmcs->u64Cr0ReadShadow.u; 3182 } 3183 else 3184 { 3185 IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR4); 3186 uGuestCrX = pVCpu->cpum.GstCtx.cr4; 3187 fGstHostMask = pVmcs->u64Cr4Mask.u; 3188 fReadShadow = pVmcs->u64Cr4ReadShadow.u; 3189 } 3190 3191 /* 3192 * For any CR0/CR4 bit owned by the host (in the CR0/CR4 guest/host mask), if the 3193 * corresponding bits differ between the source operand and the read-shadow, 3194 * we must cause a VM-exit. 3195 * 3196 * See Intel spec. 25.1.3 "Instructions That Cause VM Exits Conditionally". 3197 */ 3198 if ((fReadShadow & fGstHostMask) != (*puNewCrX & fGstHostMask)) 3199 { 3200 Assert(fGstHostMask != 0); 3170 uint64_t const uNewCrX = *puNewCrX; 3171 if (CPUMIsGuestVmxMovToCr0Cr4InterceptSet(pVCpu, &pVCpu->cpum.GstCtx, iCrReg, uNewCrX)) 3172 { 3201 3173 Log2(("mov_Cr_Rd: (CR%u) Guest intercept -> VM-exit\n", iCrReg)); 3202 3174 … … 3217 3189 * See Intel Spec. 25.3 "Changes To Instruction Behavior In VMX Non-root Operation". 3218 3190 */ 3191 PCVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs); 3192 Assert(pVmcs); 3193 uint64_t uGuestCrX; 3194 uint64_t fGstHostMask; 3195 if (iCrReg == 0) 3196 { 3197 IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0); 3198 uGuestCrX = pVCpu->cpum.GstCtx.cr0; 3199 fGstHostMask = pVmcs->u64Cr0Mask.u; 3200 } 3201 else 3202 { 3203 IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR4); 3204 uGuestCrX = pVCpu->cpum.GstCtx.cr4; 3205 fGstHostMask = pVmcs->u64Cr4Mask.u; 3206 } 3207 3219 3208 *puNewCrX = (uGuestCrX & fGstHostMask) | (*puNewCrX & ~fGstHostMask); 3220 3221 3209 return VINF_VMX_INTERCEPT_NOT_ACTIVE; 3222 3210 }
Note:
See TracChangeset
for help on using the changeset viewer.