Changeset 55118 in vbox for trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
- Timestamp:
- Apr 7, 2015 3:21:45 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r55037 r55118 10241 10241 { 10242 10242 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(); 10243 10244 int rc = VERR_NOT_SUPPORTED; 10245 if (GIMAreHypercallsEnabled(pVCpu)) 10246 { 10247 rc = hmR0VmxSaveGuestState(pVCpu, pMixedCtx); 10243 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitVmcall); 10244 10245 PVM pVM = pVCpu->CTX_SUFF(pVM); 10246 if (pVM->hm.s.fHypercallsEnabled) 10247 { 10248 #if 0 10249 int rc = hmR0VmxSaveGuestState(pVCpu, pMixedCtx); 10248 10250 AssertRCReturn(rc, rc); 10251 #else 10252 /* Aggressive state sync. for now. */ 10253 int rc = hmR0VmxSaveGuestRip(pVCpu, pMixedCtx); 10254 rc |= hmR0VmxSaveGuestSegmentRegs(pVCpu, pMixedCtx); /* For long-mode checks in gimKvmHypercall(). */ 10255 #endif 10256 AssertRCReturn(rc, rc); 10249 10257 10250 10258 rc = GIMHypercall(pVCpu, pMixedCtx); 10251 } 10252 10253 if (RT_SUCCESS(rc)) 10254 { 10255 rc = hmR0VmxAdvanceGuestRip(pVCpu, pMixedCtx, pVmxTransient); 10256 Assert(pVmxTransient->cbInstr == 3); 10257 10258 /* If the hypercall changes anything other than guest general-purpose registers, 10259 we would need to reload the guest changed bits on VM-reentry. */ 10260 } 10261 else 10262 { 10263 hmR0VmxSetPendingXcptUD(pVCpu, pMixedCtx); 10264 rc = VINF_SUCCESS; 10265 } 10266 10267 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitVmcall); 10268 return rc; 10259 if (RT_SUCCESS(rc)) 10260 { 10261 /* If the hypercall changes anything other than guest general-purpose registers, 10262 we would need to reload the guest changed bits here before VM-reentry. */ 10263 hmR0VmxAdvanceGuestRip(pVCpu, pMixedCtx, pVmxTransient); 10264 return VINF_SUCCESS; 10265 } 10266 } 10267 10268 hmR0VmxSetPendingXcptUD(pVCpu, pMixedCtx); 10269 return VINF_SUCCESS; 10269 10270 } 10270 10271
Note:
See TracChangeset
for help on using the changeset viewer.