Changeset 73310 in vbox for trunk/src/VBox/VMM/VMMR0
- Timestamp:
- Jul 23, 2018 6:51:46 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 123917
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r73293 r73310 3466 3466 { 3467 3467 if (pCtx->eflags.Bits.u1IF) 3468 fIntrState = VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI;3468 fIntrState = VMX_VMCS_GUEST_INT_STATE_BLOCK_STI; 3469 3469 else 3470 fIntrState = VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS;3470 fIntrState = VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS; 3471 3471 } 3472 3472 else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)) … … 3491 3491 && (pVCpu->hm.s.vmx.u32PinCtls & VMX_VMCS_CTRL_PIN_EXEC_VIRTUAL_NMI)) 3492 3492 { 3493 fIntrState |= VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_NMI;3493 fIntrState |= VMX_VMCS_GUEST_INT_STATE_BLOCK_NMI; 3494 3494 } 3495 3495 … … 3511 3511 AssertMsg(!(fIntrState & 0xfffffff0), ("%#x\n", fIntrState)); /* Bits 31:4 MBZ. */ 3512 3512 Assert((fIntrState & 0x3) != 0x3); /* Block-by-STI and MOV SS cannot be simultaneously set. */ 3513 return VMXWriteVmcs32(VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE, fIntrState);3513 return VMXWriteVmcs32(VMX_VMCS32_GUEST_INT_STATE, fIntrState); 3514 3514 } 3515 3515 … … 5642 5642 5643 5643 uint32_t cPreemptionTickCount = (uint32_t)RT_MIN(cTicksToDeadline, UINT32_MAX - 16); 5644 int rc = VMXWriteVmcs32(VMX_VMCS32_ GUEST_PREEMPT_TIMER_VALUE, cPreemptionTickCount);5644 int rc = VMXWriteVmcs32(VMX_VMCS32_PREEMPT_TIMER_VALUE, cPreemptionTickCount); 5645 5645 AssertRC(rc); 5646 5646 } … … 5787 5787 DECLINLINE(void) hmR0VmxSetPendingXcptDF(PVMCPU pVCpu) 5788 5788 { 5789 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT ERRUPTION_INFO_VALID;5790 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);5791 u32IntInfo |= VMX_EXIT_INT ERRUPTION_INFO_ERROR_CODE_VALID;5789 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID; 5790 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 5791 u32IntInfo |= VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 5792 5792 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5793 5793 } … … 5812 5812 static VBOXSTRICTRC hmR0VmxCheckExitDueToEventDelivery(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 5813 5813 { 5814 uint32_t const uExitVector = VMX_EXIT_INT ERRUPTION_INFO_VECTOR(pVmxTransient->uExitIntInfo);5814 uint32_t const uExitVector = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo); 5815 5815 5816 5816 int rc2 = hmR0VmxReadIdtVectoringInfoVmcs(pVmxTransient); … … 5842 5842 fRaiseInfo = IEMXCPTRAISEINFO_NONE; 5843 5843 } 5844 else if (VMX_EXIT_INT ERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo))5844 else if (VMX_EXIT_INT_INFO_IS_VALID(pVmxTransient->uExitIntInfo)) 5845 5845 { 5846 5846 uint32_t const uExitVectorType = VMX_IDT_VECTORING_INFO_TYPE(pVmxTransient->uExitIntInfo); … … 5848 5848 uint32_t const fExitVectorFlags = hmR0VmxGetIemXcptFlags(uExitVector, uExitVectorType); 5849 5849 /** @todo Make AssertMsgReturn as just AssertMsg later. */ 5850 AssertMsgReturn(uExitVectorType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT,5850 AssertMsgReturn(uExitVectorType == VMX_EXIT_INT_INFO_TYPE_HW_XCPT, 5851 5851 ("hmR0VmxCheckExitDueToEventDelivery: Unexpected VM-exit interruption info. %#x!\n", 5852 5852 uExitVectorType), VERR_VMX_IPE_5); … … 5975 5975 } 5976 5976 } 5977 else if ( VMX_EXIT_INT ERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo)5978 && VMX_EXIT_INT ERRUPTION_INFO_IS_NMI_UNBLOCK_IRET(pVmxTransient->uExitIntInfo)5977 else if ( VMX_EXIT_INT_INFO_IS_VALID(pVmxTransient->uExitIntInfo) 5978 && VMX_EXIT_INT_INFO_IS_NMI_UNBLOCK_IRET(pVmxTransient->uExitIntInfo) 5979 5979 && uExitVector != X86_XCPT_DF 5980 5980 && (pVCpu->hm.s.vmx.u32PinCtls & VMX_VMCS_CTRL_PIN_EXEC_VIRTUAL_NMI)) … … 5988 5988 { 5989 5989 Log4Func(("Setting VMCPU_FF_BLOCK_NMIS. fValid=%RTbool uExitReason=%u\n", 5990 VMX_EXIT_INT ERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo), pVmxTransient->uExitReason));5990 VMX_EXIT_INT_INFO_IS_VALID(pVmxTransient->uExitIntInfo), pVmxTransient->uExitReason)); 5991 5991 VMCPU_FF_SET(pVCpu, VMCPU_FF_BLOCK_NMIS); 5992 5992 } … … 6160 6160 uint32_t u32Val; 6161 6161 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 6162 int rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE, &u32Val);6162 int rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &u32Val); 6163 6163 if (RT_SUCCESS(rc)) 6164 6164 { … … 6184 6184 rc |= hmR0VmxImportGuestRFlags(pVCpu); 6185 6185 6186 if (u32Val & ( VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS6187 | VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI))6186 if (u32Val & ( VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS 6187 | VMX_VMCS_GUEST_INT_STATE_BLOCK_STI)) 6188 6188 { 6189 6189 EMSetInhibitInterruptsPC(pVCpu, pCtx->rip); … … 6192 6192 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS); 6193 6193 6194 if (u32Val & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_NMI)6194 if (u32Val & VMX_VMCS_GUEST_INT_STATE_BLOCK_NMI) 6195 6195 { 6196 6196 if (!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_BLOCK_NMIS)) … … 6651 6651 6652 6652 /* Refer Intel spec. 24.8.3 "VM-entry Controls for Event Injection" for the format of u32IntInfo. */ 6653 uint32_t u32IntInfo = uVector | VMX_EXIT_INT ERRUPTION_INFO_VALID;6653 uint32_t u32IntInfo = uVector | VMX_EXIT_INT_INFO_VALID; 6654 6654 if (enmTrpmEvent == TRPM_TRAP) 6655 6655 { … … 6657 6657 { 6658 6658 case X86_XCPT_NMI: 6659 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6659 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_NMI << VMX_EXIT_INT_INFO_TYPE_SHIFT); 6660 6660 break; 6661 6661 6662 6662 case X86_XCPT_BP: 6663 6663 case X86_XCPT_OF: 6664 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6664 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 6665 6665 break; 6666 6666 … … 6672 6672 case X86_XCPT_GP: 6673 6673 case X86_XCPT_AC: 6674 u32IntInfo |= VMX_EXIT_INT ERRUPTION_INFO_ERROR_CODE_VALID;6674 u32IntInfo |= VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 6675 6675 RT_FALL_THRU(); 6676 6676 default: 6677 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6677 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 6678 6678 break; 6679 6679 } 6680 6680 } 6681 6681 else if (enmTrpmEvent == TRPM_HARDWARE_INT) 6682 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6682 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_EXT_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 6683 6683 else if (enmTrpmEvent == TRPM_SOFTWARE_INT) 6684 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6684 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 6685 6685 else 6686 6686 AssertMsgFailed(("Invalid TRPM event type %d\n", enmTrpmEvent)); … … 6760 6760 6761 6761 /* Clear any pending events from the VMCS. */ 6762 rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, 0); AssertRC(rc);6763 rc = VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS, 0); AssertRC(rc);6762 VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, 0); 6763 VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS, 0); 6764 6764 6765 6765 /* We're now done converting the pending event. */ … … 7175 7175 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 7176 7176 uint32_t const fIntrState = hmR0VmxGetGuestIntrState(pVCpu); 7177 bool const fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS);7178 bool const fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI);7179 bool const fBlockNmi = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_NMI);7177 bool const fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS); 7178 bool const fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI); 7179 bool const fBlockNmi = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_NMI); 7180 7180 7181 7181 Assert(!fBlockSti || !(ASMAtomicUoReadU64(&pCtx->fExtrn) & CPUMCTX_EXTRN_RFLAGS)); 7182 Assert(!(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_SMI)); /* We don't support block-by-SMI yet.*/7183 Assert(!fBlockSti || pCtx->eflags.Bits.u1IF); /* Cannot set block-by-STI when interrupts are disabled. */7182 Assert(!(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_SMI)); /* We don't support block-by-SMI yet.*/ 7183 Assert(!fBlockSti || pCtx->eflags.Bits.u1IF); /* Cannot set block-by-STI when interrupts are disabled. */ 7184 7184 Assert(!TRPMHasTrap(pVCpu)); 7185 7185 … … 7201 7201 { 7202 7202 Log4Func(("Pending NMI\n")); 7203 uint32_t u32IntInfo = X86_XCPT_NMI | VMX_EXIT_INT ERRUPTION_INFO_VALID;7204 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7203 uint32_t u32IntInfo = X86_XCPT_NMI | VMX_EXIT_INT_INFO_VALID; 7204 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_NMI << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7205 7205 7206 7206 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); … … 7232 7232 Log4Func(("Pending external interrupt u8Interrupt=%#x\n", u8Interrupt)); 7233 7233 uint32_t u32IntInfo = u8Interrupt 7234 | VMX_EXIT_INT ERRUPTION_INFO_VALID7235 | (VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7234 | VMX_EXIT_INT_INFO_VALID 7235 | (VMX_EXIT_INT_INFO_TYPE_EXT_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7236 7236 7237 7237 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrfaultAddress */); … … 7270 7270 Assert(!(ASMAtomicUoReadU64(&pVCpu->cpum.GstCtx.fExtrn) & CPUMCTX_EXTRN_RFLAGS)); 7271 7271 RT_NOREF(pVCpu); 7272 return VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_ EXCEPTIONS, VMX_VMCS_GUEST_DEBUG_EXCEPTIONS_BS);7272 return VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS, VMX_VMCS_GUEST_DEBUG_EXCEPTIONS_BS); 7273 7273 } 7274 7274 … … 7290 7290 Assert(VMMRZCallRing3IsEnabled(pVCpu)); 7291 7291 7292 bool fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS);7293 bool fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI);7292 bool fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS); 7293 bool fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI); 7294 7294 7295 7295 Assert(!fBlockSti || !(ASMAtomicUoReadU64(&pVCpu->cpum.GstCtx.fExtrn) & CPUMCTX_EXTRN_RFLAGS)); 7296 Assert(!(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_SMI));/* We don't support block-by-SMI yet.*/7297 Assert(!fBlockSti || pVCpu->cpum.GstCtx.eflags.Bits.u1IF); /* Cannot set block-by-STI when interrupts are disabled. */7296 Assert(!(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_SMI)); /* We don't support block-by-SMI yet.*/ 7297 Assert(!fBlockSti || pVCpu->cpum.GstCtx.eflags.Bits.u1IF); /* Cannot set block-by-STI when interrupts are disabled. */ 7298 7298 Assert(!TRPMHasTrap(pVCpu)); 7299 7299 … … 7309 7309 * See Intel spec. 26.6.5 "Interrupt-Window Exiting and Virtual-Interrupt Delivery". 7310 7310 */ 7311 uint32_t const uIntType = VMX_EXIT_INT ERRUPTION_INFO_TYPE(pVCpu->hm.s.Event.u64IntInfo);7311 uint32_t const uIntType = VMX_EXIT_INT_INFO_TYPE(pVCpu->hm.s.Event.u64IntInfo); 7312 7312 #ifdef VBOX_STRICT 7313 if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT)7313 if (uIntType == VMX_EXIT_INT_INFO_TYPE_EXT_INT) 7314 7314 { 7315 7315 bool const fBlockInt = !(pCtx->eflags.u32 & X86_EFL_IF); … … 7318 7318 Assert(!fBlockMovSS); 7319 7319 } 7320 else if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI)7321 { 7322 bool const fBlockNmi = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_NMI);7320 else if (uIntType == VMX_EXIT_INT_INFO_TYPE_NMI) 7321 { 7322 bool const fBlockNmi = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_NMI); 7323 7323 Assert(!fBlockSti); 7324 7324 Assert(!fBlockMovSS); … … 7335 7335 /* Update the interruptibility-state as it could have been changed by 7336 7336 hmR0VmxInjectEventVmcs() (e.g. real-on-v86 guest injecting software interrupts) */ 7337 fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS);7338 fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI);7339 7340 if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT)7337 fBlockMovSS = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS); 7338 fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI); 7339 7340 if (uIntType == VMX_EXIT_INT_INFO_TYPE_EXT_INT) 7341 7341 STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectInterrupt); 7342 7342 else … … 7395 7395 DECLINLINE(void) hmR0VmxSetPendingXcptUD(PVMCPU pVCpu) 7396 7396 { 7397 uint32_t u32IntInfo = X86_XCPT_UD | VMX_EXIT_INT ERRUPTION_INFO_VALID;7397 uint32_t u32IntInfo = X86_XCPT_UD | VMX_EXIT_INT_INFO_VALID; 7398 7398 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 7399 7399 } … … 7415 7415 DECLINLINE(VBOXSTRICTRC) hmR0VmxInjectXcptDF(PVMCPU pVCpu, bool fStepping, uint32_t *pfIntrState) 7416 7416 { 7417 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT ERRUPTION_INFO_VALID;7418 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7419 u32IntInfo |= VMX_EXIT_INT ERRUPTION_INFO_ERROR_CODE_VALID;7417 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID; 7418 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7419 u32IntInfo |= VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 7420 7420 return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */, fStepping, 7421 7421 pfIntrState); … … 7430 7430 DECLINLINE(void) hmR0VmxSetPendingXcptDB(PVMCPU pVCpu) 7431 7431 { 7432 uint32_t u32IntInfo = X86_XCPT_DB | VMX_EXIT_INT ERRUPTION_INFO_VALID;7433 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7432 uint32_t u32IntInfo = X86_XCPT_DB | VMX_EXIT_INT_INFO_VALID; 7433 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7434 7434 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 7435 7435 } … … 7445 7445 DECLINLINE(void) hmR0VmxSetPendingXcptOF(PVMCPU pVCpu, uint32_t cbInstr) 7446 7446 { 7447 uint32_t u32IntInfo = X86_XCPT_OF | VMX_EXIT_INT ERRUPTION_INFO_VALID;7448 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7447 uint32_t u32IntInfo = X86_XCPT_OF | VMX_EXIT_INT_INFO_VALID; 7448 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7449 7449 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 7450 7450 } … … 7471 7471 uint32_t *pfIntrState) 7472 7472 { 7473 uint32_t u32IntInfo = X86_XCPT_GP | VMX_EXIT_INT ERRUPTION_INFO_VALID;7474 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7473 uint32_t u32IntInfo = X86_XCPT_GP | VMX_EXIT_INT_INFO_VALID; 7474 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7475 7475 if (fErrorCodeValid) 7476 u32IntInfo |= VMX_EXIT_INT ERRUPTION_INFO_ERROR_CODE_VALID;7476 u32IntInfo |= VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 7477 7477 return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, u32ErrorCode, 0 /* GCPtrFaultAddress */, fStepping, 7478 7478 pfIntrState); … … 7490 7490 DECLINLINE(void) hmR0VmxSetPendingIntN(PVMCPU pVCpu, uint16_t uVector, uint32_t cbInstr) 7491 7491 { 7492 uint32_t u32IntInfo = uVector | VMX_EXIT_INT ERRUPTION_INFO_VALID;7492 uint32_t u32IntInfo = uVector | VMX_EXIT_INT_INFO_VALID; 7493 7493 if ( uVector == X86_XCPT_BP 7494 7494 || uVector == X86_XCPT_OF) 7495 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7495 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7496 7496 else 7497 u32IntInfo |= (VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);7497 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7498 7498 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 7499 7499 } … … 7559 7559 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 7560 7560 uint32_t u32IntInfo = (uint32_t)u64IntInfo; 7561 uint32_t const uVector = VMX_EXIT_INT ERRUPTION_INFO_VECTOR(u32IntInfo);7562 uint32_t const uIntType = VMX_EXIT_INT ERRUPTION_INFO_TYPE(u32IntInfo);7561 uint32_t const uVector = VMX_EXIT_INT_INFO_VECTOR(u32IntInfo); 7562 uint32_t const uIntType = VMX_EXIT_INT_INFO_TYPE(u32IntInfo); 7563 7563 7564 7564 #ifdef VBOX_STRICT … … 7569 7569 * See Intel spec. 20.1.4 "Interrupt and Exception Handling" 7570 7570 */ 7571 if ( uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT7571 if ( uIntType == VMX_EXIT_INT_INFO_TYPE_HW_XCPT 7572 7572 && !CPUMIsGuestInRealModeEx(pCtx)) 7573 7573 { … … 7581 7581 case X86_XCPT_GP: 7582 7582 case X86_XCPT_AC: 7583 AssertMsg(VMX_EXIT_INT ERRUPTION_INFO_IS_ERROR_CODE_VALID(u32IntInfo),7583 AssertMsg(VMX_EXIT_INT_INFO_IS_ERROR_CODE_VALID(u32IntInfo), 7584 7584 ("Error-code-valid bit not set for exception that has an error code uVector=%#x\n", uVector)); 7585 7585 RT_FALL_THRU(); … … 7591 7591 7592 7592 /* Cannot inject an NMI when block-by-MOV SS is in effect. */ 7593 Assert( uIntType != VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI7594 || !(*pfIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS));7593 Assert( uIntType != VMX_EXIT_INT_INFO_TYPE_NMI 7594 || !(*pfIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS)); 7595 7595 7596 7596 STAM_COUNTER_INC(&pVCpu->hm.s.paStatInjectedIrqsR0[uVector & MASK_INJECT_IRQ_STAT]); … … 7614 7614 * See Intel spec. 26.2.1.3 "VM-Entry Control Fields". 7615 7615 */ 7616 u32IntInfo &= ~VMX_EXIT_INT ERRUPTION_INFO_ERROR_CODE_VALID;7616 u32IntInfo &= ~VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 7617 7617 } 7618 7618 else … … 7650 7650 /* Software exceptions (#BP and #OF exceptions thrown as a result of INT3 or INTO) */ 7651 7651 uint16_t uGuestIp = pCtx->ip; 7652 if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_XCPT)7652 if (uIntType == VMX_EXIT_INT_INFO_TYPE_SW_XCPT) 7653 7653 { 7654 7654 Assert(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF); … … 7656 7656 uGuestIp = pCtx->ip + (uint16_t)cbInstr; 7657 7657 } 7658 else if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_INT)7658 else if (uIntType == VMX_EXIT_INT_INFO_TYPE_SW_INT) 7659 7659 uGuestIp = pCtx->ip + (uint16_t)cbInstr; 7660 7660 … … 7681 7681 pCtx->cs.ValidSel = IdtEntry.uSel; 7682 7682 pCtx->cs.u64Base = IdtEntry.uSel << cbIdtEntry; 7683 if ( uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT7683 if ( uIntType == VMX_EXIT_INT_INFO_TYPE_HW_XCPT 7684 7684 && uVector == X86_XCPT_PF) 7685 7685 pCtx->cr2 = GCPtrFaultAddress; … … 7692 7692 7693 7693 /* We're clearing interrupts, which means no block-by-STI interrupt-inhibition. */ 7694 if (*pfIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI)7694 if (*pfIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI) 7695 7695 { 7696 Assert( uIntType != VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI7697 && uIntType != VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT);7696 Assert( uIntType != VMX_EXIT_INT_INFO_TYPE_NMI 7697 && uIntType != VMX_EXIT_INT_INFO_TYPE_EXT_INT); 7698 7698 Log4Func(("Clearing inhibition due to STI\n")); 7699 *pfIntrState &= ~VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI;7699 *pfIntrState &= ~VMX_VMCS_GUEST_INT_STATE_BLOCK_STI; 7700 7700 } 7701 7701 Log4(("Injecting real-mode: u32IntInfo=%#x u32ErrCode=%#x cbInstr=%#x Eflags=%#x CS:EIP=%04x:%04x\n", … … 7717 7717 7718 7718 /* Validate. */ 7719 Assert(VMX_EXIT_INT ERRUPTION_INFO_IS_VALID(u32IntInfo));/* Bit 31 (Valid bit) must be set by caller. */7720 Assert(!VMX_EXIT_INT ERRUPTION_INFO_IS_NMI_UNBLOCK_IRET(u32IntInfo));/* Bit 12 MBZ. */7719 Assert(VMX_EXIT_INT_INFO_IS_VALID(u32IntInfo)); /* Bit 31 (Valid bit) must be set by caller. */ 7720 Assert(!VMX_EXIT_INT_INFO_IS_NMI_UNBLOCK_IRET(u32IntInfo)); /* Bit 12 MBZ. */ 7721 7721 Assert(!(u32IntInfo & 0x7ffff000)); /* Bits 30:12 MBZ. */ 7722 7722 7723 7723 /* Inject. */ 7724 7724 int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, u32IntInfo); 7725 if (VMX_EXIT_INT ERRUPTION_INFO_IS_ERROR_CODE_VALID(u32IntInfo))7725 if (VMX_EXIT_INT_INFO_IS_ERROR_CODE_VALID(u32IntInfo)) 7726 7726 rc |= VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE, u32ErrCode); 7727 7727 rc |= VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH, cbInstr); … … 7729 7729 7730 7730 /* Update CR2. */ 7731 if ( VMX_EXIT_INT ERRUPTION_INFO_TYPE(u32IntInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT7731 if ( VMX_EXIT_INT_INFO_TYPE(u32IntInfo) == VMX_EXIT_INT_INFO_TYPE_HW_XCPT 7732 7732 && uVector == X86_XCPT_PF) 7733 7733 pCtx->cr2 = GCPtrFaultAddress; … … 8556 8556 AssertRC(rc); 8557 8557 pVmxTransient->uExitReason = (uint16_t)VMX_EXIT_REASON_BASIC(uExitReason); 8558 pVmxTransient->fVMEntryFailed = VMX_ENTRY_INT ERRUPTION_INFO_IS_VALID(pVmxTransient->uEntryIntInfo);8558 pVmxTransient->fVMEntryFailed = VMX_ENTRY_INT_INFO_IS_VALID(pVmxTransient->uEntryIntInfo); 8559 8559 8560 8560 if (rcVMRun == VINF_SUCCESS) … … 9240 9240 case VMX_EXIT_XCPT_OR_NMI: 9241 9241 { 9242 uint8_t const idxVector = VMX_EXIT_INT ERRUPTION_INFO_VECTOR(pVmxTransient->uExitIntInfo);9243 switch (VMX_EXIT_INT ERRUPTION_INFO_TYPE(pVmxTransient->uExitIntInfo))9242 uint8_t const idxVector = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo); 9243 switch (VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo)) 9244 9244 { 9245 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT:9246 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_XCPT:9247 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_PRIV_SW_XCPT:9245 case VMX_EXIT_INT_INFO_TYPE_HW_XCPT: 9246 case VMX_EXIT_INT_INFO_TYPE_SW_XCPT: 9247 case VMX_EXIT_INT_INFO_TYPE_PRIV_SW_XCPT: 9248 9248 if (idxVector <= (unsigned)(DBGFEVENT_XCPT_LAST - DBGFEVENT_XCPT_FIRST)) 9249 9249 { 9250 if (VMX_EXIT_INT ERRUPTION_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uExitIntInfo))9250 if (VMX_EXIT_INT_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uExitIntInfo)) 9251 9251 { 9252 9252 hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient); … … 9281 9281 break; 9282 9282 9283 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_INT:9283 case VMX_EXIT_INT_INFO_TYPE_SW_INT: 9284 9284 uEventArg = idxVector; 9285 9285 enmEvent1 = DBGFEVENT_INTERRUPT_SOFTWARE; … … 9609 9609 int rc2 = hmR0VmxReadExitIntInfoVmcs(pVmxTransient); 9610 9610 AssertRCReturn(rc2, rc2); 9611 uint32_t uIntType = VMX_EXIT_INT ERRUPTION_INFO_TYPE(pVmxTransient->uExitIntInfo);9612 if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI)9611 uint32_t uIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo); 9612 if (uIntType == VMX_EXIT_INT_INFO_TYPE_NMI) 9613 9613 return hmR0VmxExitXcptOrNmi(pVCpu, pVmxTransient); 9614 9614 } … … 10362 10362 rc = VMXReadVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, &u32EntryInfo); 10363 10363 AssertRCBreak(rc); 10364 if ( VMX_ENTRY_INT ERRUPTION_INFO_IS_VALID(u32EntryInfo)10365 && VMX_ENTRY_INT ERRUPTION_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT)10364 if ( VMX_ENTRY_INT_INFO_IS_VALID(u32EntryInfo) 10365 && VMX_ENTRY_INT_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INT_INFO_TYPE_EXT_INT) 10366 10366 { 10367 10367 HMVMX_CHECK_BREAK(u32Eflags & X86_EFL_IF, VMX_IGS_RFLAGS_IF_INVALID); … … 10703 10703 || u32ActivityState != VMX_VMCS_GUEST_ACTIVITY_HLT, VMX_IGS_ACTIVITY_STATE_HLT_INVALID); 10704 10704 uint32_t u32IntrState; 10705 rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE, &u32IntrState);10705 rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &u32IntrState); 10706 10706 AssertRCBreak(rc); 10707 if ( u32IntrState == VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS10708 || u32IntrState == VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI)10707 if ( u32IntrState == VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS 10708 || u32IntrState == VMX_VMCS_GUEST_INT_STATE_BLOCK_STI) 10709 10709 { 10710 10710 HMVMX_CHECK_BREAK(u32ActivityState == VMX_VMCS_GUEST_ACTIVITY_ACTIVE, VMX_IGS_ACTIVITY_STATE_ACTIVE_INVALID); … … 10719 10719 /* Guest interruptibility-state. */ 10720 10720 HMVMX_CHECK_BREAK(!(u32IntrState & 0xfffffff0), VMX_IGS_INTERRUPTIBILITY_STATE_RESERVED); 10721 HMVMX_CHECK_BREAK((u32IntrState & ( VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_STI 10722 | VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_MOVSS)) 10723 != ( VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_STI 10724 | VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_MOVSS), 10721 HMVMX_CHECK_BREAK((u32IntrState & (VMX_VMCS_GUEST_INT_STATE_BLOCK_STI | VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS)) 10722 != (VMX_VMCS_GUEST_INT_STATE_BLOCK_STI | VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS), 10725 10723 VMX_IGS_INTERRUPTIBILITY_STATE_STI_MOVSS_INVALID); 10726 10724 HMVMX_CHECK_BREAK( (u32Eflags & X86_EFL_IF) 10727 || !(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI),10725 || !(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI), 10728 10726 VMX_IGS_INTERRUPTIBILITY_STATE_STI_EFL_INVALID); 10729 if (VMX_ENTRY_INT ERRUPTION_INFO_IS_VALID(u32EntryInfo))10730 { 10731 if (VMX_ENTRY_INT ERRUPTION_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT)10727 if (VMX_ENTRY_INT_INFO_IS_VALID(u32EntryInfo)) 10728 { 10729 if (VMX_ENTRY_INT_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INT_INFO_TYPE_EXT_INT) 10732 10730 { 10733 HMVMX_CHECK_BREAK( !(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI)10734 && !(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS),10731 HMVMX_CHECK_BREAK( !(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI) 10732 && !(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS), 10735 10733 VMX_IGS_INTERRUPTIBILITY_STATE_EXT_INT_INVALID); 10736 10734 } 10737 else if (VMX_ENTRY_INT ERRUPTION_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI)10735 else if (VMX_ENTRY_INT_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INT_INFO_TYPE_NMI) 10738 10736 { 10739 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS),10737 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS), 10740 10738 VMX_IGS_INTERRUPTIBILITY_STATE_MOVSS_INVALID); 10741 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI),10739 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI), 10742 10740 VMX_IGS_INTERRUPTIBILITY_STATE_STI_INVALID); 10743 10741 } 10744 10742 } 10745 10743 /** @todo Assumes the processor is not in SMM. */ 10746 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_SMI),10744 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_SMI), 10747 10745 VMX_IGS_INTERRUPTIBILITY_STATE_SMI_INVALID); 10748 10746 HMVMX_CHECK_BREAK( !(pVCpu->hm.s.vmx.u32EntryCtls & VMX_VMCS_CTRL_ENTRY_ENTRY_SMM) 10749 || (u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_SMI),10747 || (u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_SMI), 10750 10748 VMX_IGS_INTERRUPTIBILITY_STATE_SMI_SMM_INVALID); 10751 10749 if ( (pVCpu->hm.s.vmx.u32PinCtls & VMX_VMCS_CTRL_PIN_EXEC_VIRTUAL_NMI) 10752 && VMX_ENTRY_INT ERRUPTION_INFO_IS_VALID(u32EntryInfo)10753 && VMX_ENTRY_INT ERRUPTION_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI)10754 { 10755 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_NMI),10750 && VMX_ENTRY_INT_INFO_IS_VALID(u32EntryInfo) 10751 && VMX_ENTRY_INT_INFO_TYPE(u32EntryInfo) == VMX_EXIT_INT_INFO_TYPE_NMI) 10752 { 10753 HMVMX_CHECK_BREAK(!(u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_NMI), 10756 10754 VMX_IGS_INTERRUPTIBILITY_STATE_NMI_INVALID); 10757 10755 } … … 10759 10757 /* Pending debug exceptions. */ 10760 10758 #if HC_ARCH_BITS == 64 10761 rc = VMXReadVmcs64(VMX_VMCS_GUEST_PENDING_DEBUG_ EXCEPTIONS, &u64Val);10759 rc = VMXReadVmcs64(VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS, &u64Val); 10762 10760 AssertRCBreak(rc); 10763 10761 /* Bits 63:15, Bit 13, Bits 11:4 MBZ. */ … … 10765 10763 u32Val = u64Val; /* For pending debug exceptions checks below. */ 10766 10764 #else 10767 rc = VMXReadVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_ EXCEPTIONS, &u32Val);10765 rc = VMXReadVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_XCPTS, &u32Val); 10768 10766 AssertRCBreak(rc); 10769 10767 /* Bits 31:15, Bit 13, Bits 11:4 MBZ. */ … … 10771 10769 #endif 10772 10770 10773 if ( (u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI)10774 || (u32IntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_MOVSS)10771 if ( (u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI) 10772 || (u32IntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_MOVSS) 10775 10773 || u32ActivityState == VMX_VMCS_GUEST_ACTIVITY_HLT) 10776 10774 { … … 10869 10867 AssertRCReturn(rc, rc); 10870 10868 10871 uint32_t uIntType = VMX_EXIT_INT ERRUPTION_INFO_TYPE(pVmxTransient->uExitIntInfo);10869 uint32_t uIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo); 10872 10870 Assert( !(pVCpu->hm.s.vmx.u32ExitCtls & VMX_VMCS_CTRL_EXIT_ACK_EXT_INT) 10873 && uIntType != VMX_EXIT_INT ERRUPTION_INFO_TYPE_EXT_INT);10874 Assert(VMX_EXIT_INT ERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo));10875 10876 if (uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_NMI)10871 && uIntType != VMX_EXIT_INT_INFO_TYPE_EXT_INT); 10872 Assert(VMX_EXIT_INT_INFO_IS_VALID(pVmxTransient->uExitIntInfo)); 10873 10874 if (uIntType == VMX_EXIT_INT_INFO_TYPE_NMI) 10877 10875 { 10878 10876 /* … … 10903 10901 10904 10902 uint32_t uExitIntInfo = pVmxTransient->uExitIntInfo; 10905 uint32_t uVector = VMX_EXIT_INT ERRUPTION_INFO_VECTOR(uExitIntInfo);10903 uint32_t uVector = VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo); 10906 10904 switch (uIntType) 10907 10905 { 10908 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_PRIV_SW_XCPT: /* Privileged software exception. (#DB from ICEBP) */10906 case VMX_EXIT_INT_INFO_TYPE_PRIV_SW_XCPT: /* Privileged software exception. (#DB from ICEBP) */ 10909 10907 Assert(uVector == X86_XCPT_DB); 10910 10908 RT_FALL_THRU(); 10911 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_SW_XCPT: /* Software exception. (#BP or #OF) */10912 Assert(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF || uIntType == VMX_EXIT_INT ERRUPTION_INFO_TYPE_PRIV_SW_XCPT);10909 case VMX_EXIT_INT_INFO_TYPE_SW_XCPT: /* Software exception. (#BP or #OF) */ 10910 Assert(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF || uIntType == VMX_EXIT_INT_INFO_TYPE_PRIV_SW_XCPT); 10913 10911 RT_FALL_THRU(); 10914 case VMX_EXIT_INT ERRUPTION_INFO_TYPE_HW_XCPT:10912 case VMX_EXIT_INT_INFO_TYPE_HW_XCPT: 10915 10913 { 10916 10914 /* … … 10964 10962 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient); 10965 10963 AssertRCReturn(rc, rc); 10966 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(uExitIntInfo),10964 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(uExitIntInfo), 10967 10965 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 10968 10966 0 /* GCPtrFaultAddress */); … … 10984 10982 pVCpu->hm.s.u32HMError = uExitIntInfo; 10985 10983 rc = VERR_VMX_UNEXPECTED_INTERRUPTION_EXIT_TYPE; 10986 AssertMsgFailed(("Unexpected interruption info %#x\n", VMX_EXIT_INT ERRUPTION_INFO_TYPE(uExitIntInfo)));10984 AssertMsgFailed(("Unexpected interruption info %#x\n", VMX_EXIT_INT_INFO_TYPE(uExitIntInfo))); 10987 10985 break; 10988 10986 } … … 11028 11026 */ 11029 11027 uint32_t fIntrState = 0; 11030 int rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE, &fIntrState);11028 int rc = VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &fIntrState); 11031 11029 AssertRCReturn(rc, rc); 11032 11030 11033 bool const fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT ERRUPTIBILITY_STATE_BLOCK_STI);11031 bool const fBlockSti = RT_BOOL(fIntrState & VMX_VMCS_GUEST_INT_STATE_BLOCK_STI); 11034 11032 if ( fBlockSti 11035 11033 && VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)) … … 11560 11558 rc |= hmR0VmxReadEntryXcptErrorCodeVmcs(pVmxTransient); 11561 11559 rc |= hmR0VmxReadEntryInstrLenVmcs(pVmxTransient); 11562 rc |= VMXReadVmcs32(VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE, &fIntrState);11560 rc |= VMXReadVmcs32(VMX_VMCS32_GUEST_INT_STATE, &fIntrState); 11563 11561 AssertRCReturn(rc, rc); 11564 11562 … … 11567 11565 Log4(("VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE %#RX32\n", pVmxTransient->uEntryXcptErrorCode)); 11568 11566 Log4(("VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH %#RX32\n", pVmxTransient->cbEntryInstr)); 11569 Log4(("VMX_VMCS32_GUEST_INT ERRUPTIBILITY_STATE%#RX32\n", fIntrState));11567 Log4(("VMX_VMCS32_GUEST_INT_STATE %#RX32\n", fIntrState)); 11570 11568 11571 11569 rc = VMXReadVmcs32(VMX_VMCS_GUEST_CR0, &u32Val); AssertRC(rc); … … 12578 12576 */ 12579 12577 RTGCPHYS GCPhys; 12580 int rc = VMXReadVmcs64(VMX_VMCS64_ EXIT_GUEST_PHYS_ADDR_FULL, &GCPhys);12578 int rc = VMXReadVmcs64(VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL, &GCPhys); 12581 12579 rc |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 12582 12580 AssertRCReturn(rc, rc); … … 12656 12654 12657 12655 RTGCPHYS GCPhys; 12658 int rc = VMXReadVmcs64(VMX_VMCS64_ EXIT_GUEST_PHYS_ADDR_FULL, &GCPhys);12656 int rc = VMXReadVmcs64(VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL, &GCPhys); 12659 12657 rc |= hmR0VmxReadExitQualificationVmcs(pVCpu, pVmxTransient); 12660 12658 rc |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); … … 12734 12732 } 12735 12733 12736 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),12734 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 12737 12735 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 12738 12736 return rc; … … 12760 12758 AssertRCReturn(rc, rc); 12761 12759 12762 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),12760 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 12763 12761 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 12764 12762 } … … 12784 12782 Assert(ASMAtomicUoReadU32(&pVmxTransient->fVmcsFieldsRead) & HMVMX_READ_EXIT_INTERRUPTION_INFO); 12785 12783 12786 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),12784 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 12787 12785 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 12788 12786 return VINF_SUCCESS; … … 12858 12856 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVmxTransient); 12859 12857 AssertRCReturn(rc, rc); 12860 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),12858 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 12861 12859 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 12862 12860 return VINF_SUCCESS; … … 12901 12899 Log4Func(("Gst: CS:RIP %04x:%08RX64 ErrorCode=%#x CR0=%#RX64 CPL=%u TR=%#04x\n", pCtx->cs.Sel, pCtx->rip, 12902 12900 pVmxTransient->uExitIntErrorCode, pCtx->cr0, CPUMGetGuestCPL(pVCpu), pCtx->tr.Sel)); 12903 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),12901 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 12904 12902 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 12905 12903 return rc; … … 13203 13201 AssertMsg(pVCpu->hm.s.fUsingDebugLoop || pVCpu->hm.s.vmx.RealMode.fRealOnV86Active, 13204 13202 ("uVector=%#x u32XcptBitmap=%#X32\n", 13205 VMX_EXIT_INT ERRUPTION_INFO_VECTOR(pVmxTransient->uExitIntInfo), pVCpu->hm.s.vmx.u32XcptBitmap));13203 VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo), pVCpu->hm.s.vmx.u32XcptBitmap)); 13206 13204 #endif 13207 13205 … … 13215 13213 #ifdef DEBUG_ramshankar 13216 13214 rc |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_CS | CPUMCTX_EXTRN_RIP); 13217 uint8_t uVector = VMX_EXIT_INT ERRUPTION_INFO_VECTOR(pVmxTransient->uExitIntInfo);13215 uint8_t uVector = VMX_EXIT_INT_INFO_VECTOR(pVmxTransient->uExitIntInfo); 13218 13216 Log(("hmR0VmxExitXcptGeneric: Reinjecting Xcpt. uVector=%#x cs:rip=%#04x:%#RX64\n", uVector, pCtx->cs.Sel, pCtx->rip)); 13219 13217 #endif 13220 13218 13221 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),13219 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 13222 13220 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 13223 13221 return VINF_SUCCESS; … … 13247 13245 if (RT_LIKELY(!pVmxTransient->fVectoringDoublePF)) 13248 13246 { 13249 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),13247 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 13250 13248 0 /* cbInstr */, pVmxTransient->uExitIntErrorCode, pVmxTransient->uExitQualification); 13251 13249 } … … 13300 13298 TRPMResetTrap(pVCpu); 13301 13299 pVCpu->hm.s.Event.fPending = false; /* In case it's a contributory #PF. */ 13302 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),13300 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 13303 13301 0 /* cbInstr */, uGstErrorCode, pVmxTransient->uExitQualification); 13304 13302 }
Note:
See TracChangeset
for help on using the changeset viewer.