Changeset 67925 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jul 12, 2017 11:13:08 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 116917
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r67528 r67925 5089 5089 { 5090 5090 #ifdef VBOX_WITH_NESTED_HWVIRT 5091 if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking) 5092 { 5093 crX = pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR; 5091 PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl; 5092 if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking) 5093 { 5094 crX = pVmcbCtrl->IntCtrl.n.u8VTPR; 5094 5095 break; 5095 5096 } … … 5463 5464 } 5464 5465 5465 pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR = u8Tpr; 5466 if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking) 5466 PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl; 5467 pVmcbCtrl->IntCtrl.n.u8VTPR = u8Tpr; 5468 if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking) 5467 5469 { 5468 5470 rcStrict = VINF_SUCCESS; -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplSvmInstr.cpp.h
r67749 r67925 147 147 Assert(CPUMGetGuestCPL(pVCpu) == pCtx->ss.Attr.n.u2Dpl); 148 148 149 PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl; 149 150 /* Save interrupt shadow of the nested-guest instruction if any. */ 150 151 if ( VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS) … … 152 153 { 153 154 LogFlow(("iemSvmVmexit: Interrupt shadow till %#RX64\n", pCtx->rip)); 154 p Ctx->hwvirt.svm.VmcbCtrl.u64IntShadow |= SVM_INTERRUPT_SHADOW_ACTIVE;155 pVmcbCtrl->u64IntShadow |= SVM_INTERRUPT_SHADOW_ACTIVE; 155 156 } 156 157 … … 160 161 if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST)) 161 162 { 162 Assert(p Ctx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIrqPending);163 Assert(pVmcbCtrl->IntCtrl.n.u1VIrqPending); 163 164 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST); 164 165 } 165 166 else 166 p Ctx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIrqPending = 0;167 pVmcbCtrl->IntCtrl.n.u1VIrqPending = 0; 167 168 168 169 /** @todo Save V_TPR, V_IRQ. */ … … 170 171 171 172 /* Save exit information. */ 172 p Ctx->hwvirt.svm.VmcbCtrl.u64ExitCode = uExitCode;173 p Ctx->hwvirt.svm.VmcbCtrl.u64ExitInfo1 = uExitInfo1;174 p Ctx->hwvirt.svm.VmcbCtrl.u64ExitInfo2 = uExitInfo2;173 pVmcbCtrl->u64ExitCode = uExitCode; 174 pVmcbCtrl->u64ExitInfo1 = uExitInfo1; 175 pVmcbCtrl->u64ExitInfo2 = uExitInfo2; 175 176 176 177 /* … … 184 185 bool const fRaisingEvent = IEMGetCurrentXcpt(pVCpu, &uExitIntVector, &fExitIntFlags, &uExitIntErr, 185 186 NULL /* uExitIntCr2 */); 186 p Ctx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u1Valid = fRaisingEvent;187 pVmcbCtrl->ExitIntInfo.n.u1Valid = fRaisingEvent; 187 188 if (fRaisingEvent) 188 189 { 189 p Ctx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u8Vector = uExitIntVector;190 p Ctx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u3Type = iemGetSvmEventType(uExitIntVector, fExitIntFlags);190 pVmcbCtrl->ExitIntInfo.n.u8Vector = uExitIntVector; 191 pVmcbCtrl->ExitIntInfo.n.u3Type = iemGetSvmEventType(uExitIntVector, fExitIntFlags); 191 192 if (fExitIntFlags & IEM_XCPT_FLAGS_ERR) 192 193 { 193 p Ctx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u1ErrorCodeValid = true;194 p Ctx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u32ErrorCode = uExitIntErr;194 pVmcbCtrl->ExitIntInfo.n.u1ErrorCodeValid = true; 195 pVmcbCtrl->ExitIntInfo.n.u32ErrorCode = uExitIntErr; 195 196 } 196 197 } … … 200 201 * Clear event injection in the VMCB. 201 202 */ 202 p Ctx->hwvirt.svm.VmcbCtrl.EventInject.n.u1Valid = 0;203 pVmcbCtrl->EventInject.n.u1Valid = 0; 203 204 204 205 /* 205 206 * Write back the VMCB controls to the guest VMCB in guest physical memory. 206 207 */ 207 VBOXSTRICTRC rcStrict = PGMPhysSimpleWriteGCPhys(pVCpu->CTX_SUFF(pVM), pCtx->hwvirt.svm.GCPhysVmcb, 208 &pCtx->hwvirt.svm.VmcbCtrl, sizeof(pCtx->hwvirt.svm.VmcbCtrl));208 VBOXSTRICTRC rcStrict = PGMPhysSimpleWriteGCPhys(pVCpu->CTX_SUFF(pVM), pCtx->hwvirt.svm.GCPhysVmcb, pVmcbCtrl, 209 sizeof(*pVmcbCtrl)); 209 210 /* 210 211 * Prepare for guest's "host mode" by clearing internal processor state bits. … … 214 215 * back the VMCB controls above. 215 216 */ 216 RT_ZERO(pCtx->hwvirt.svm.VmcbCtrl);217 memset(pVmcbCtrl, 0, sizeof(*pVmcbCtrl)); 217 218 218 219 if (RT_SUCCESS(rcStrict)) … … 328 329 329 330 /* 330 * Save hoststate.331 * Read the guest VMCB state. 331 332 */ 332 333 SVMVMCBSTATESAVE VmcbNstGst; … … 334 335 if (RT_SUCCESS(rc)) 335 336 { 337 /* 338 * Save the host state. 339 */ 336 340 PSVMHOSTSTATE pHostState = &pCtx->hwvirt.svm.HostState; 337 341 pHostState->es = pCtx->es; … … 351 355 352 356 /* 353 * Load theVMCB controls.357 * Read the guest VMCB controls. 354 358 */ 355 rc = PGMPhysSimpleReadGCPhys(pVM, &pCtx->hwvirt.svm.VmcbCtrl, GCPhysVmcb, sizeof(pCtx->hwvirt.svm.VmcbCtrl)); 359 PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl; 360 rc = PGMPhysSimpleReadGCPhys(pVM, pVmcbCtrl, GCPhysVmcb, sizeof(*pVmcbCtrl)); 356 361 if (RT_SUCCESS(rc)) 357 362 { 358 PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.VmcbCtrl;359 360 363 /* 361 364 * Validate guest-state and controls. … … 928 931 AssertReleaseFailedReturn(VERR_IEM_IPE_5); 929 932 #else 933 PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl; 930 934 uint8_t const offOpCode = pVCpu->iem.s.offOpcode; 931 935 uint8_t const cbCurrent = pVCpu->iem.s.cbOpcode - pVCpu->iem.s.offOpcode; 932 936 if ( cbCurrent > 0 933 && cbCurrent < sizeof(p Ctx->hwvirt.svm.VmcbCtrl.abInstr))937 && cbCurrent < sizeof(pVmcbCtrl->abInstr)) 934 938 { 935 939 Assert(cbCurrent <= sizeof(pVCpu->iem.s.abOpcode)); 936 memcpy(&p Ctx->hwvirt.svm.VmcbCtrl.abInstr[0], &pVCpu->iem.s.abOpcode[offOpCode], cbCurrent);940 memcpy(&pVmcbCtrl->abInstr[0], &pVCpu->iem.s.abOpcode[offOpCode], cbCurrent); 937 941 } 938 942 #endif 939 943 } 940 Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept. u32InterceptXcpt=%#RX32 u8Vector=%#x uExitInfo1=%#RX64, uExitInfo2=%#RX64 -> #VMEXIT\n", 941 pCtx->hwvirt.svm.VmcbCtrl.u32InterceptXcpt, u8Vector, uExitInfo1, uExitInfo2)); 944 Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept u32InterceptXcpt=%#RX32 u8Vector=%#x " 945 "uExitInfo1=%#RX64 uExitInfo2=%#RX64 -> #VMEXIT\n", pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl.u32InterceptXcpt, 946 u8Vector, uExitInfo1, uExitInfo2)); 942 947 IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_EXCEPTION_0 + u8Vector, uExitInfo1, uExitInfo2); 943 948 }
Note:
See TracChangeset
for help on using the changeset viewer.