Changeset 49000 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Oct 9, 2013 12:22:39 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 89723
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r48723 r49000 2229 2229 Assert(pEvent->n.u1Valid); 2230 2230 2231 pVCpu->hm.s.Event.u64Int rInfo= pEvent->u;2231 pVCpu->hm.s.Event.u64IntInfo = pEvent->u; 2232 2232 pVCpu->hm.s.Event.fPending = true; 2233 2233 pVCpu->hm.s.Event.GCPtrFaultAddress = GCPtrFaultAddress; … … 2343 2343 2344 2344 SVMEVENT Event; 2345 Event.u = pVCpu->hm.s.Event.u64Int rInfo;2345 Event.u = pVCpu->hm.s.Event.u64IntInfo; 2346 2346 2347 2347 uint8_t uVector = Event.n.u8Vector; … … 2537 2537 { 2538 2538 SVMEVENT Event; 2539 Event.u = pVCpu->hm.s.Event.u64Int rInfo;2539 Event.u = pVCpu->hm.s.Event.u64IntInfo; 2540 2540 Assert(Event.n.u1Valid); 2541 2541 #ifdef VBOX_STRICT … … 3765 3765 { 3766 3766 enmReflect = SVMREFLECTXCPT_DF; 3767 Log4(("IDT: Pending vectoring #DF %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->hm.s.Event.u64Int rInfo,3767 Log4(("IDT: Pending vectoring #DF %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->hm.s.Event.u64IntInfo, 3768 3768 uIdtVector, uExitVector)); 3769 3769 } … … 3771 3771 { 3772 3772 enmReflect = SVMREFLECTXCPT_TF; 3773 Log4(("IDT: Pending vectoring triple-fault %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->hm.s.Event.u64IntrInfo,3774 uIdtVector, uExitVector));3773 Log4(("IDT: Pending vectoring triple-fault %#RX64 uIdtVector=%#x uExitVector=%#x\n", 3774 pVCpu->hm.s.Event.u64IntInfo, uIdtVector, uExitVector)); 3775 3775 } 3776 3776 else … … 4654 4654 { 4655 4655 /* 4656 * AMD-V does not provide us with the original exception but we have it in u64Int rInfo since we4656 * AMD-V does not provide us with the original exception but we have it in u64IntInfo since we 4657 4657 * injected the event during VM-entry. Software interrupts and exceptions will be regenerated 4658 4658 * when the recompiler restarts the instruction. 4659 4659 */ 4660 4660 SVMEVENT Event; 4661 Event.u = pVCpu->hm.s.Event.u64Int rInfo;4661 Event.u = pVCpu->hm.s.Event.u64IntInfo; 4662 4662 if ( Event.n.u3Type == SVM_EVENT_EXCEPTION 4663 4663 || Event.n.u3Type == SVM_EVENT_SOFTWARE_INT) -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r48998 r49000 221 221 uint16_t u16Alignment0; 222 222 /** The VM-exit interruption error code. */ 223 uint32_t uExitInt rErrorCode;223 uint32_t uExitIntErrorCode; 224 224 /** The VM-exit exit qualification. */ 225 225 uint64_t uExitQualification; 226 226 227 227 /** The VM-exit interruption-information field. */ 228 uint32_t uExitInt rInfo;228 uint32_t uExitIntInfo; 229 229 /** The VM-exit instruction-length field. */ 230 230 uint32_t cbInstr; … … 252 252 253 253 /** The VM-entry interruption-information field. */ 254 uint32_t uEntryInt rInfo;254 uint32_t uEntryIntInfo; 255 255 /** The VM-entry exception error code field. */ 256 256 uint32_t uEntryXcptErrorCode; … … 279 279 } VMXTRANSIENT; 280 280 AssertCompileMemberAlignment(VMXTRANSIENT, uExitReason, sizeof(uint64_t)); 281 AssertCompileMemberAlignment(VMXTRANSIENT, uExitInt rInfo,sizeof(uint64_t));282 AssertCompileMemberAlignment(VMXTRANSIENT, uEntryInt rInfo,sizeof(uint64_t));281 AssertCompileMemberAlignment(VMXTRANSIENT, uExitIntInfo, sizeof(uint64_t)); 282 AssertCompileMemberAlignment(VMXTRANSIENT, uEntryIntInfo, sizeof(uint64_t)); 283 283 AssertCompileMemberAlignment(VMXTRANSIENT, fWasGuestFPUStateActive, sizeof(uint64_t)); 284 284 AssertCompileMemberSize(VMXTRANSIENT, ExitInstrInfo, sizeof(uint32_t)); … … 334 334 static void hmR0VmxFlushVpid(PVM pVM, PVMCPU pVCpu, VMX_FLUSH_VPID enmFlush, RTGCPTR GCPtr); 335 335 static void hmR0VmxClearEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx); 336 static int hmR0VmxInjectEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint64_t u64Int rInfo, uint32_t cbInstr,337 uint32_t u32ErrCode, RTGCUINTREG GCPtrFaultAddress, uint32_t *puInt rState);336 static int hmR0VmxInjectEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint64_t u64IntInfo, uint32_t cbInstr, 337 uint32_t u32ErrCode, RTGCUINTREG GCPtrFaultAddress, uint32_t *puIntState); 338 338 #if HC_ARCH_BITS == 32 && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL) 339 339 static int hmR0VmxInitVmcsReadCache(PVM pVM, PVMCPU pVCpu); … … 547 547 * @remarks No-long-jump zone!!! 548 548 */ 549 DECLINLINE(int) hmR0VmxReadEntryInt rInfoVmcs(PVMXTRANSIENT pVmxTransient)550 { 551 int rc = VMXReadVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, &pVmxTransient->uEntryInt rInfo);549 DECLINLINE(int) hmR0VmxReadEntryIntInfoVmcs(PVMXTRANSIENT pVmxTransient) 550 { 551 int rc = VMXReadVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, &pVmxTransient->uEntryIntInfo); 552 552 AssertRCReturn(rc, rc); 553 553 return VINF_SUCCESS; … … 598 598 * @param pVmxTransient Pointer to the VMX transient structure. 599 599 */ 600 DECLINLINE(int) hmR0VmxReadExitInt rInfoVmcs(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)600 DECLINLINE(int) hmR0VmxReadExitIntInfoVmcs(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 601 601 { 602 602 if (!(pVmxTransient->fVmcsFieldsRead & HMVMX_UPDATED_TRANSIENT_EXIT_INTERRUPTION_INFO)) 603 603 { 604 int rc = VMXReadVmcs32(VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO, &pVmxTransient->uExitInt rInfo);604 int rc = VMXReadVmcs32(VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO, &pVmxTransient->uExitIntInfo); 605 605 AssertRCReturn(rc, rc); 606 606 pVmxTransient->fVmcsFieldsRead |= HMVMX_UPDATED_TRANSIENT_EXIT_INTERRUPTION_INFO; … … 618 618 * @param pVmxTransient Pointer to the VMX transient structure. 619 619 */ 620 DECLINLINE(int) hmR0VmxReadExitInt rErrorCodeVmcs(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)620 DECLINLINE(int) hmR0VmxReadExitIntErrorCodeVmcs(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 621 621 { 622 622 if (!(pVmxTransient->fVmcsFieldsRead & HMVMX_UPDATED_TRANSIENT_EXIT_INTERRUPTION_ERROR_CODE)) 623 623 { 624 int rc = VMXReadVmcs32(VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitInt rErrorCode);624 int rc = VMXReadVmcs32(VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode); 625 625 AssertRCReturn(rc, rc); 626 626 pVmxTransient->fVmcsFieldsRead |= HMVMX_UPDATED_TRANSIENT_EXIT_INTERRUPTION_ERROR_CODE; … … 4987 4987 * 4988 4988 * @param pVCpu Pointer to the VMCPU. 4989 * @param u32Int rInfoThe VM-entry interruption-information field.4989 * @param u32IntInfo The VM-entry interruption-information field. 4990 4990 * @param cbInstr The VM-entry instruction length in bytes (for software 4991 4991 * interrupts, exceptions and privileged software … … 4999 4999 * always incremented. 5000 5000 */ 5001 DECLINLINE(void) hmR0VmxSetPendingEvent(PVMCPU pVCpu, uint32_t u32Int rInfo, uint32_t cbInstr, uint32_t u32ErrCode,5001 DECLINLINE(void) hmR0VmxSetPendingEvent(PVMCPU pVCpu, uint32_t u32IntInfo, uint32_t cbInstr, uint32_t u32ErrCode, 5002 5002 RTGCUINTPTR GCPtrFaultAddress) 5003 5003 { 5004 5004 Assert(!pVCpu->hm.s.Event.fPending); 5005 5005 pVCpu->hm.s.Event.fPending = true; 5006 pVCpu->hm.s.Event.u64Int rInfo = u32IntrInfo;5006 pVCpu->hm.s.Event.u64IntInfo = u32IntInfo; 5007 5007 pVCpu->hm.s.Event.u32ErrCode = u32ErrCode; 5008 5008 pVCpu->hm.s.Event.cbInstr = cbInstr; … … 5023 5023 DECLINLINE(void) hmR0VmxSetPendingXcptDF(PVMCPU pVCpu, PCPUMCTX pMixedCtx) 5024 5024 { 5025 uint32_t u32Int rInfo= X86_XCPT_DF | VMX_EXIT_INTERRUPTION_INFO_VALID;5026 u32Int rInfo|= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);5027 u32Int rInfo|= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID;5028 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);5025 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INTERRUPTION_INFO_VALID; 5026 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 5027 u32IntInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID; 5028 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5029 5029 } 5030 5030 … … 5054 5054 if (VMX_IDT_VECTORING_INFO_VALID(pVmxTransient->uIdtVectoringInfo)) 5055 5055 { 5056 rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);5056 rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 5057 5057 AssertRCReturn(rc, rc); 5058 5058 5059 5059 uint32_t uIntType = VMX_IDT_VECTORING_INFO_TYPE(pVmxTransient->uIdtVectoringInfo); 5060 uint32_t uExitVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(pVmxTransient->uExitInt rInfo);5060 uint32_t uExitVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(pVmxTransient->uExitIntInfo); 5061 5061 uint32_t uIdtVector = VMX_IDT_VECTORING_INFO_VECTOR(pVmxTransient->uIdtVectoringInfo); 5062 5062 … … 5071 5071 /* See Intel spec. 30.7.1.1 "Reflecting Exceptions to Guest Software". */ 5072 5072 VMXREFLECTXCPT enmReflect = VMXREFLECTXCPT_NONE; 5073 if (VMX_EXIT_INTERRUPTION_INFO_IS_VALID(pVmxTransient->uExitInt rInfo))5073 if (VMX_EXIT_INTERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo)) 5074 5074 { 5075 5075 if (uIntType == VMX_IDT_VECTORING_INFO_TYPE_HW_XCPT) … … 5142 5142 5143 5143 /* If uExitVector is #PF, CR2 value will be updated from the VMCS if it's a guest #PF. See hmR0VmxExitXcptPF(). */ 5144 hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT R_INFO_FROM_EXIT_IDT_INFO(pVmxTransient->uIdtVectoringInfo),5144 hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_IDT_INFO(pVmxTransient->uIdtVectoringInfo), 5145 5145 0 /* cbInstr */, u32ErrCode, pMixedCtx->cr2); 5146 5146 rc = VINF_SUCCESS; 5147 5147 Log4(("IDT: vcpu[%RU32] Pending vectoring event %#RX64 Err=%#RX32\n", pVCpu->idCpu, 5148 pVCpu->hm.s.Event.u64Int rInfo, pVCpu->hm.s.Event.u32ErrCode));5148 pVCpu->hm.s.Event.u64IntInfo, pVCpu->hm.s.Event.u32ErrCode)); 5149 5149 5150 5150 break; … … 5156 5156 rc = VINF_HM_DOUBLE_FAULT; 5157 5157 Log4(("IDT: vcpu[%RU32] Pending vectoring #DF %#RX64 uIdtVector=%#x uExitVector=%#x\n", pVCpu->idCpu, 5158 pVCpu->hm.s.Event.u64Int rInfo, uIdtVector, uExitVector));5158 pVCpu->hm.s.Event.u64IntInfo, uIdtVector, uExitVector)); 5159 5159 5160 5160 break; … … 6066 6066 AssertRC(rc); 6067 6067 6068 /* Refer Intel spec. 24.8.3 "VM-entry Controls for Event Injection" for the format of u32Int rInfo. */6069 uint32_t u32Int rInfo = uVector | VMX_EXIT_INTERRUPTION_INFO_VALID;6068 /* Refer Intel spec. 24.8.3 "VM-entry Controls for Event Injection" for the format of u32IntInfo. */ 6069 uint32_t u32IntInfo = uVector | VMX_EXIT_INTERRUPTION_INFO_VALID; 6070 6070 if (enmTrpmEvent == TRPM_TRAP) 6071 6071 { … … 6074 6074 case X86_XCPT_BP: 6075 6075 case X86_XCPT_OF: 6076 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6076 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6077 6077 break; 6078 6078 … … 6084 6084 case X86_XCPT_GP: 6085 6085 case X86_XCPT_AC: 6086 u32Int rInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID;6086 u32IntInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID; 6087 6087 /* no break! */ 6088 6088 default: 6089 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6089 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6090 6090 break; 6091 6091 } … … 6094 6094 { 6095 6095 if (uVector == X86_XCPT_NMI) 6096 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6096 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6097 6097 else 6098 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6098 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6099 6099 } 6100 6100 else if (enmTrpmEvent == TRPM_SOFTWARE_INT) 6101 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6101 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6102 6102 else 6103 6103 AssertMsgFailed(("Invalid TRPM event type %d\n", enmTrpmEvent)); … … 6105 6105 rc = TRPMResetTrap(pVCpu); 6106 6106 AssertRC(rc); 6107 Log4(("TRPM->HM event: u32Int rInfo=%#RX32 enmTrpmEvent=%d cbInstr=%u uErrCode=%#RX32 GCPtrFaultAddress=%#RGv\n",6108 u32Int rInfo, enmTrpmEvent, cbInstr, uErrCode, GCPtrFaultAddress));6109 6110 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, cbInstr, uErrCode, GCPtrFaultAddress);6107 Log4(("TRPM->HM event: u32IntInfo=%#RX32 enmTrpmEvent=%d cbInstr=%u uErrCode=%#RX32 GCPtrFaultAddress=%#RGv\n", 6108 u32IntInfo, enmTrpmEvent, cbInstr, uErrCode, GCPtrFaultAddress)); 6109 6110 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, uErrCode, GCPtrFaultAddress); 6111 6111 STAM_COUNTER_DEC(&pVCpu->hm.s.StatInjectPendingReflect); 6112 6112 } … … 6123 6123 Assert(pVCpu->hm.s.Event.fPending); 6124 6124 6125 uint32_t uVectorType = VMX_IDT_VECTORING_INFO_TYPE(pVCpu->hm.s.Event.u64Int rInfo);6126 uint32_t uVector = VMX_IDT_VECTORING_INFO_VECTOR(pVCpu->hm.s.Event.u64Int rInfo);6127 bool fErrorCodeValid = !!VMX_IDT_VECTORING_INFO_ERROR_CODE_IS_VALID(pVCpu->hm.s.Event.u64Int rInfo);6125 uint32_t uVectorType = VMX_IDT_VECTORING_INFO_TYPE(pVCpu->hm.s.Event.u64IntInfo); 6126 uint32_t uVector = VMX_IDT_VECTORING_INFO_VECTOR(pVCpu->hm.s.Event.u64IntInfo); 6127 bool fErrorCodeValid = !!VMX_IDT_VECTORING_INFO_ERROR_CODE_IS_VALID(pVCpu->hm.s.Event.u64IntInfo); 6128 6128 uint32_t uErrorCode = pVCpu->hm.s.Event.u32ErrCode; 6129 6129 … … 6549 6549 /* On some CPUs block-by-STI also blocks NMIs. See Intel spec. 26.3.1.5 "Checks On Guest Non-Register State". */ 6550 6550 Log4(("Pending NMI vcpu[%RU32]\n", pVCpu->idCpu)); 6551 uint32_t u32Int rInfo = X86_XCPT_NMI | VMX_EXIT_INTERRUPTION_INFO_VALID;6552 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6553 6554 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddres */);6551 uint32_t u32IntInfo = X86_XCPT_NMI | VMX_EXIT_INTERRUPTION_INFO_VALID; 6552 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6553 6554 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddres */); 6555 6555 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NMI); 6556 6556 } … … 6578 6578 { 6579 6579 Log4(("Pending interrupt vcpu[%RU32] u8Interrupt=%#x \n", pVCpu->idCpu, u8Interrupt)); 6580 uint32_t u32Int rInfo = u8Interrupt | VMX_EXIT_INTERRUPTION_INFO_VALID;6581 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6582 6583 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrfaultAddress */);6580 uint32_t u32IntInfo = u8Interrupt | VMX_EXIT_INTERRUPTION_INFO_VALID; 6581 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6582 6583 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrfaultAddress */); 6584 6584 } 6585 6585 else … … 6626 6626 { 6627 6627 #if defined(VBOX_STRICT) || defined(VBOX_WITH_STATISTICS) 6628 uint32_t uInt rType = VMX_EXIT_INTERRUPTION_INFO_TYPE(pVCpu->hm.s.Event.u64IntrInfo);6629 if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT)6628 uint32_t uIntType = VMX_EXIT_INTERRUPTION_INFO_TYPE(pVCpu->hm.s.Event.u64IntInfo); 6629 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT) 6630 6630 { 6631 6631 rc = hmR0VmxSaveGuestRflags(pVCpu, pMixedCtx); … … 6636 6636 Assert(!fBlockMovSS); 6637 6637 } 6638 else if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI)6638 else if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI) 6639 6639 { 6640 6640 Assert(!fBlockSti); … … 6642 6642 } 6643 6643 #endif 6644 Log4(("Injecting pending event vcpu[%RU32] u64Int rInfo=%#RX64\n", pVCpu->idCpu, pVCpu->hm.s.Event.u64IntrInfo));6645 rc = hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, pVCpu->hm.s.Event.u64Int rInfo, pVCpu->hm.s.Event.cbInstr,6644 Log4(("Injecting pending event vcpu[%RU32] u64IntInfo=%#RX64\n", pVCpu->idCpu, pVCpu->hm.s.Event.u64IntInfo)); 6645 rc = hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, pVCpu->hm.s.Event.u64IntInfo, pVCpu->hm.s.Event.cbInstr, 6646 6646 pVCpu->hm.s.Event.u32ErrCode, pVCpu->hm.s.Event.GCPtrFaultAddress, &uIntrState); 6647 6647 AssertRCReturn(rc, rc); … … 6653 6653 6654 6654 #ifdef VBOX_WITH_STATISTICS 6655 if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT)6655 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT) 6656 6656 STAM_COUNTER_INC(&pVCpu->hm.s.StatInjectInterrupt); 6657 6657 else … … 6709 6709 DECLINLINE(void) hmR0VmxSetPendingXcptUD(PVMCPU pVCpu, PCPUMCTX pMixedCtx) 6710 6710 { 6711 uint32_t u32Int rInfo = X86_XCPT_UD | VMX_EXIT_INTERRUPTION_INFO_VALID;6712 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);6711 uint32_t u32IntInfo = X86_XCPT_UD | VMX_EXIT_INTERRUPTION_INFO_VALID; 6712 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 6713 6713 } 6714 6714 … … 6725 6725 DECLINLINE(int) hmR0VmxInjectXcptDF(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint32_t *puIntrState) 6726 6726 { 6727 uint32_t u32Int rInfo= X86_XCPT_DF | VMX_EXIT_INTERRUPTION_INFO_VALID;6728 u32Int rInfo|= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6729 u32Int rInfo|= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID;6730 return hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */,6727 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INTERRUPTION_INFO_VALID; 6728 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6729 u32IntInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID; 6730 return hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */, 6731 6731 puIntrState); 6732 6732 } … … 6743 6743 DECLINLINE(void) hmR0VmxSetPendingXcptDB(PVMCPU pVCpu, PCPUMCTX pMixedCtx) 6744 6744 { 6745 uint32_t u32Int rInfo= X86_XCPT_DB | VMX_EXIT_INTERRUPTION_INFO_VALID;6746 u32Int rInfo|= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6747 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);6745 uint32_t u32IntInfo = X86_XCPT_DB | VMX_EXIT_INTERRUPTION_INFO_VALID; 6746 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6747 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 6748 6748 } 6749 6749 … … 6761 6761 DECLINLINE(void) hmR0VmxSetPendingXcptOF(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint32_t cbInstr) 6762 6762 { 6763 uint32_t u32Int rInfo= X86_XCPT_OF | VMX_EXIT_INTERRUPTION_INFO_VALID;6764 u32Int rInfo|= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6765 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);6763 uint32_t u32IntInfo = X86_XCPT_OF | VMX_EXIT_INTERRUPTION_INFO_VALID; 6764 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6765 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 6766 6766 } 6767 6767 … … 6780 6780 uint32_t *puIntrState) 6781 6781 { 6782 uint32_t u32Int rInfo= X86_XCPT_GP | VMX_EXIT_INTERRUPTION_INFO_VALID;6783 u32Int rInfo|= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6782 uint32_t u32IntInfo = X86_XCPT_GP | VMX_EXIT_INTERRUPTION_INFO_VALID; 6783 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6784 6784 if (fErrorCodeValid) 6785 u32Int rInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID;6786 return hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, u32Int rInfo, 0 /* cbInstr */, u32ErrorCode, 0 /* GCPtrFaultAddress */,6785 u32IntInfo |= VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID; 6786 return hmR0VmxInjectEventVmcs(pVCpu, pMixedCtx, u32IntInfo, 0 /* cbInstr */, u32ErrorCode, 0 /* GCPtrFaultAddress */, 6787 6787 puIntrState); 6788 6788 } … … 6802 6802 DECLINLINE(void) hmR0VmxSetPendingIntN(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint16_t uVector, uint32_t cbInstr) 6803 6803 { 6804 uint32_t u32Int rInfo = uVector | VMX_EXIT_INTERRUPTION_INFO_VALID;6804 uint32_t u32IntInfo = uVector | VMX_EXIT_INTERRUPTION_INFO_VALID; 6805 6805 if ( uVector == X86_XCPT_BP 6806 6806 || uVector == X86_XCPT_OF) 6807 6807 { 6808 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6808 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6809 6809 } 6810 6810 else 6811 u32Int rInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT);6812 hmR0VmxSetPendingEvent(pVCpu, u32Int rInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);6811 u32IntInfo |= (VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT << VMX_EXIT_INTERRUPTION_INFO_TYPE_SHIFT); 6812 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 6813 6813 } 6814 6814 … … 6852 6852 * be out-of-sync. Make sure to update the required 6853 6853 * fields before using them. 6854 * @param u64Int rInfoThe VM-entry interruption-information field.6854 * @param u64IntInfo The VM-entry interruption-information field. 6855 6855 * @param cbInstr The VM-entry instruction length in bytes (for 6856 6856 * software interrupts, exceptions and privileged … … 6865 6865 * @remarks No-long-jump zone!!! 6866 6866 */ 6867 static int hmR0VmxInjectEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint64_t u64Int rInfo, uint32_t cbInstr,6867 static int hmR0VmxInjectEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint64_t u64IntInfo, uint32_t cbInstr, 6868 6868 uint32_t u32ErrCode, RTGCUINTREG GCPtrFaultAddress, uint32_t *puIntrState) 6869 6869 { 6870 6870 /* Intel spec. 24.8.3 "VM-Entry Controls for Event Injection" specifies the interruption-information field to be 32-bits. */ 6871 AssertMsg(u64Int rInfo >> 32 == 0, ("%#RX64\n", u64IntrInfo));6871 AssertMsg(u64IntInfo >> 32 == 0, ("%#RX64\n", u64IntInfo)); 6872 6872 Assert(puIntrState); 6873 uint32_t u32Int rInfo = (uint32_t)u64IntrInfo;6874 6875 const uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(u32IntrInfo);6876 const uint32_t uInt rType = VMX_EXIT_INTERRUPTION_INFO_TYPE(u32IntrInfo);6873 uint32_t u32IntInfo = (uint32_t)u64IntInfo; 6874 6875 const uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(u32IntInfo); 6876 const uint32_t uIntType = VMX_EXIT_INTERRUPTION_INFO_TYPE(u32IntInfo); 6877 6877 6878 6878 #ifdef VBOX_STRICT 6879 6879 /* Validate the error-code-valid bit for hardware exceptions. */ 6880 if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT)6880 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT) 6881 6881 { 6882 6882 switch (uVector) … … 6889 6889 case X86_XCPT_GP: 6890 6890 case X86_XCPT_AC: 6891 AssertMsg(VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_IS_VALID(u32Int rInfo),6891 AssertMsg(VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_IS_VALID(u32IntInfo), 6892 6892 ("Error-code-valid bit not set for exception that has an error code uVector=%#x\n", uVector)); 6893 6893 /* fallthru */ … … 6899 6899 6900 6900 /* Cannot inject an NMI when block-by-MOV SS is in effect. */ 6901 Assert( uInt rType != VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI6901 Assert( uIntType != VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI 6902 6902 || !(*puIntrState & VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_MOVSS)); 6903 6903 … … 6949 6949 /* Software exceptions (#BP and #OF exceptions thrown as a result of INT3 or INTO) */ 6950 6950 uint16_t uGuestIp = pMixedCtx->ip; 6951 if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT)6951 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT) 6952 6952 { 6953 6953 Assert(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF); … … 6955 6955 uGuestIp = pMixedCtx->ip + (uint16_t)cbInstr; 6956 6956 } 6957 else if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT)6957 else if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT) 6958 6958 uGuestIp = pMixedCtx->ip + (uint16_t)cbInstr; 6959 6959 … … 6977 6977 pMixedCtx->cs.Sel = IdtEntry.uSel; 6978 6978 pMixedCtx->cs.u64Base = IdtEntry.uSel << cbIdtEntry; 6979 if ( uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT6980 && uVector 6979 if ( uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT 6980 && uVector == X86_XCPT_PF) 6981 6981 { 6982 6982 pMixedCtx->cr2 = GCPtrFaultAddress; … … 6993 6993 if (*puIntrState & VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_STI) 6994 6994 { 6995 Assert( uInt rType != VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI6996 && uInt rType != VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT);6995 Assert( uIntType != VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI 6996 && uIntType != VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT); 6997 6997 Log4(("Clearing inhibition due to STI.\n")); 6998 6998 *puIntrState &= ~VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE_BLOCK_STI; 6999 6999 } 7000 Log4(("Injecting real-mode: u32Int rInfo=%#x u32ErrCode=%#x instrlen=%#x\n", u32IntrInfo, u32ErrCode, cbInstr));7000 Log4(("Injecting real-mode: u32IntInfo=%#x u32ErrCode=%#x instrlen=%#x\n", u32IntInfo, u32ErrCode, cbInstr)); 7001 7001 7002 7002 /* The event has been truly dispatched. Mark it as no longer pending so we don't attempt to 'undo' … … 7013 7013 * See Intel spec. 26.2.1.3 "VM-Entry Control Fields". 7014 7014 */ 7015 u32Int rInfo &= ~VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID;7015 u32IntInfo &= ~VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_VALID; 7016 7016 } 7017 7017 } 7018 7018 7019 7019 /* Validate. */ 7020 Assert(VMX_EXIT_INTERRUPTION_INFO_IS_VALID(u32Int rInfo));/* Bit 31 (Valid bit) must be set by caller. */7021 Assert(!VMX_EXIT_INTERRUPTION_INFO_NMI_UNBLOCK(u32Int rInfo));/* Bit 12 MBZ. */7022 Assert(!(u32Int rInfo & 0x7ffff000));/* Bits 30:12 MBZ. */7020 Assert(VMX_EXIT_INTERRUPTION_INFO_IS_VALID(u32IntInfo)); /* Bit 31 (Valid bit) must be set by caller. */ 7021 Assert(!VMX_EXIT_INTERRUPTION_INFO_NMI_UNBLOCK(u32IntInfo)); /* Bit 12 MBZ. */ 7022 Assert(!(u32IntInfo & 0x7ffff000)); /* Bits 30:12 MBZ. */ 7023 7023 7024 7024 /* Inject. */ 7025 rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, u32Int rInfo);7026 if (VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_IS_VALID(u32Int rInfo))7025 rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO, u32IntInfo); 7026 if (VMX_EXIT_INTERRUPTION_INFO_ERROR_CODE_IS_VALID(u32IntInfo)) 7027 7027 rc |= VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE, u32ErrCode); 7028 7028 rc |= VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH, cbInstr); 7029 7029 7030 if ( VMX_EXIT_INTERRUPTION_INFO_TYPE(u32Int rInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT7030 if ( VMX_EXIT_INTERRUPTION_INFO_TYPE(u32IntInfo) == VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT 7031 7031 && uVector == X86_XCPT_PF) 7032 7032 { … … 7034 7034 } 7035 7035 7036 Log4(("Injecting vcpu[%RU32] u32Int rInfo=%#x u32ErrCode=%#x cbInstr=%#x pMixedCtx->uCR2=%#RX64\n", pVCpu->idCpu,7037 u32Int rInfo, u32ErrCode, cbInstr, pMixedCtx->cr2));7036 Log4(("Injecting vcpu[%RU32] u32IntInfo=%#x u32ErrCode=%#x cbInstr=%#x pMixedCtx->uCR2=%#RX64\n", pVCpu->idCpu, 7037 u32IntInfo, u32ErrCode, cbInstr, pMixedCtx->cr2)); 7038 7038 7039 7039 AssertRCReturn(rc, rc); … … 7765 7765 uint32_t uExitReason; 7766 7766 int rc = VMXReadVmcs32(VMX_VMCS32_RO_EXIT_REASON, &uExitReason); 7767 rc |= hmR0VmxReadEntryInt rInfoVmcs(pVmxTransient);7767 rc |= hmR0VmxReadEntryIntInfoVmcs(pVmxTransient); 7768 7768 AssertRC(rc); 7769 7769 pVmxTransient->uExitReason = (uint16_t)VMX_EXIT_REASON_BASIC(uExitReason); 7770 pVmxTransient->fVMEntryFailed = !!VMX_ENTRY_INTERRUPTION_INFO_VALID(pVmxTransient->uEntryInt rInfo);7770 pVmxTransient->fVMEntryFailed = !!VMX_ENTRY_INTERRUPTION_INFO_VALID(pVmxTransient->uEntryIntInfo); 7771 7771 7772 7772 /* If the VMLAUNCH/VMRESUME failed, we can bail out early. This does -not- cover VMX_EXIT_ERR_*. */ … … 8774 8774 STAM_PROFILE_ADV_START(&pVCpu->hm.s.StatExitXcptNmi, y3); 8775 8775 8776 int rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);8776 int rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 8777 8777 AssertRCReturn(rc, rc); 8778 8778 8779 uint32_t uInt rType = VMX_EXIT_INTERRUPTION_INFO_TYPE(pVmxTransient->uExitIntrInfo);8779 uint32_t uIntType = VMX_EXIT_INTERRUPTION_INFO_TYPE(pVmxTransient->uExitIntInfo); 8780 8780 Assert( !(pVCpu->hm.s.vmx.u32ExitCtls & VMX_VMCS_CTRL_EXIT_ACK_EXT_INT) 8781 && uInt rType != VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT);8782 Assert(VMX_EXIT_INTERRUPTION_INFO_IS_VALID(pVmxTransient->uExitInt rInfo));8783 8784 if (uInt rType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI)8781 && uIntType != VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT); 8782 Assert(VMX_EXIT_INTERRUPTION_INFO_IS_VALID(pVmxTransient->uExitIntInfo)); 8783 8784 if (uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI) 8785 8785 { 8786 8786 /* … … 8810 8810 } 8811 8811 8812 uint32_t uExitInt rInfo = pVmxTransient->uExitIntrInfo;8813 uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(uExitInt rInfo);8814 switch (uInt rType)8812 uint32_t uExitIntInfo = pVmxTransient->uExitIntInfo; 8813 uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(uExitIntInfo); 8814 switch (uIntType) 8815 8815 { 8816 8816 case VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT: /* Software exception. (#BP or #OF) */ … … 8852 8852 8853 8853 rc = hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8854 rc |= hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);8854 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 8855 8855 AssertRCReturn(rc, rc); 8856 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(uExitInt rInfo),8857 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode,8856 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(uExitIntInfo), 8857 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 8858 8858 0 /* GCPtrFaultAddress */); 8859 8859 AssertRCReturn(rc, rc); … … 8873 8873 default: 8874 8874 { 8875 pVCpu->hm.s.u32HMError = uExitInt rInfo;8875 pVCpu->hm.s.u32HMError = uExitIntInfo; 8876 8876 rc = VERR_VMX_UNEXPECTED_INTERRUPTION_EXIT_TYPE; 8877 AssertMsgFailed(("Unexpected interruption info %#x\n", VMX_EXIT_INTERRUPTION_INFO_TYPE(uExitInt rInfo)));8877 AssertMsgFailed(("Unexpected interruption info %#x\n", VMX_EXIT_INTERRUPTION_INFO_TYPE(uExitIntInfo))); 8878 8878 break; 8879 8879 } … … 9336 9336 uint32_t u32Val; 9337 9337 9338 rc = hmR0VmxReadEntryInt rInfoVmcs(pVmxTransient);9338 rc = hmR0VmxReadEntryIntInfoVmcs(pVmxTransient); 9339 9339 rc |= hmR0VmxReadEntryXcptErrorCodeVmcs(pVmxTransient); 9340 9340 rc |= hmR0VmxReadEntryInstrLenVmcs(pVCpu, pVmxTransient); … … 9343 9343 9344 9344 Log4(("uInvalidReason %u\n", uInvalidReason)); 9345 Log4(("VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO %#RX32\n", pVmxTransient->uEntryInt rInfo));9345 Log4(("VMX_VMCS32_CTRL_ENTRY_INTERRUPTION_INFO %#RX32\n", pVmxTransient->uEntryIntInfo)); 9346 9346 Log4(("VMX_VMCS32_CTRL_ENTRY_EXCEPTION_ERRCODE %#RX32\n", pVmxTransient->uEntryXcptErrorCode)); 9347 9347 Log4(("VMX_VMCS32_CTRL_ENTRY_INSTR_LENGTH %#RX32\n", pVmxTransient->cbEntryInstr)); … … 9771 9771 * interpreting the instruction. 9772 9772 */ 9773 #if 0 /* Not quite ready, seem iSegReg assertion trigger once... Do we perhaps need to always read that in longjmp / preempt scenario? */ 9773 9774 Log4(("CS:RIP=%04x:%#RX64 %#06x/%u %c str\n", pMixedCtx->cs.Sel, pMixedCtx->rip, uIOPort, cbValue, fIOWrite ? 'w' : 'r')); 9774 #if 0 /* Not quite ready, seem iSegReg assertion trigger once... Do we perhaps need to always read that in longjmp / preempt scenario? */9775 9775 AssertReturn(pMixedCtx->dx == uIOPort, VERR_HMVMX_IPE_2); 9776 9776 if (MSR_IA32_VMX_BASIC_INFO_VMCS_INS_OUTS(pVM->hm.s.vmx.Msrs.u64BasicInfo)) … … 9974 9974 Assert(!pVCpu->hm.s.Event.fPending); 9975 9975 pVCpu->hm.s.Event.fPending = true; 9976 pVCpu->hm.s.Event.u64Int rInfo = pVmxTransient->uIdtVectoringInfo;9976 pVCpu->hm.s.Event.u64IntInfo = pVmxTransient->uIdtVectoringInfo; 9977 9977 rc = hmR0VmxReadIdtVectoringErrorCodeVmcs(pVmxTransient); 9978 9978 AssertRCReturn(rc, rc); … … 10335 10335 } 10336 10336 10337 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10338 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode, 0 /* GCPtrFaultAddress */);10337 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10338 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 10339 10339 return rc; 10340 10340 } … … 10358 10358 if (rc == VINF_EM_RAW_GUEST_TRAP) 10359 10359 { 10360 rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);10360 rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10361 10361 rc |= hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10362 rc |= hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);10362 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10363 10363 AssertRCReturn(rc, rc); 10364 10364 10365 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10366 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode, 0 /* GCPtrFaultAddress */);10365 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10366 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 10367 10367 } 10368 10368 … … 10428 10428 * Raise #DB in the guest. 10429 10429 */ 10430 rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);10430 rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10431 10431 rc |= hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10432 rc |= hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);10432 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10433 10433 AssertRCReturn(rc, rc); 10434 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10435 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode, 0 /* GCPtrFaultAddress */);10434 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10435 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 10436 10436 return VINF_SUCCESS; 10437 10437 } … … 10493 10493 /* Forward #NM to the guest. */ 10494 10494 Assert(rc == VINF_EM_RAW_GUEST_TRAP); 10495 rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);10495 rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10496 10496 AssertRCReturn(rc, rc); 10497 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10497 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10498 10498 pVmxTransient->cbInstr, 0 /* error code */, 0 /* GCPtrFaultAddress */); 10499 10499 STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestNM); … … 10507 10507 * VM-exit exception handler for #GP (General-protection exception). 10508 10508 * 10509 * @remarks Requires pVmxTransient->uExitInt rInfo to be up-to-date.10509 * @remarks Requires pVmxTransient->uExitIntInfo to be up-to-date. 10510 10510 */ 10511 10511 static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient) … … 10519 10519 #ifdef HMVMX_ALWAYS_TRAP_ALL_XCPTS 10520 10520 /* If the guest is not in real-mode or we have unrestricted execution support, reflect #GP to the guest. */ 10521 rc = hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);10522 rc |= hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);10521 rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10522 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10523 10523 rc |= hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10524 10524 rc |= hmR0VmxSaveGuestState(pVCpu, pMixedCtx); 10525 10525 AssertRCReturn(rc, rc); 10526 Log4(("#GP Gst: RIP %#RX64 ErrorCode=%#x CR0=%#RX64 CPL=%u\n", pMixedCtx->rip, pVmxTransient->uExitInt rErrorCode,10526 Log4(("#GP Gst: RIP %#RX64 ErrorCode=%#x CR0=%#RX64 CPL=%u\n", pMixedCtx->rip, pVmxTransient->uExitIntErrorCode, 10527 10527 pMixedCtx->cr0, CPUMGetGuestCPL(pVCpu))); 10528 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10529 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode, 0 /* GCPtrFaultAddress */);10528 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10529 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 10530 10530 return rc; 10531 10531 #else … … 10754 10754 * the exception reported in the VMX transient structure back into the VM. 10755 10755 * 10756 * @remarks Requires uExitInt rInfo in the VMX transient structure to be10756 * @remarks Requires uExitIntInfo in the VMX transient structure to be 10757 10757 * up-to-date. 10758 10758 */ … … 10763 10763 /* Re-inject the exception into the guest. This cannot be a double-fault condition which would have been handled in 10764 10764 hmR0VmxCheckExitDueToEventDelivery(). */ 10765 int rc = hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);10765 int rc = hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10766 10766 rc |= hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10767 10767 AssertRCReturn(rc, rc); 10768 10768 Assert(pVmxTransient->fVmcsFieldsRead & HMVMX_UPDATED_TRANSIENT_EXIT_INTERRUPTION_INFO); 10769 10769 10770 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10771 pVmxTransient->cbInstr, pVmxTransient->uExitInt rErrorCode, 0 /* GCPtrFaultAddress */);10770 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10771 pVmxTransient->cbInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */); 10772 10772 return VINF_SUCCESS; 10773 10773 } … … 10782 10782 PVM pVM = pVCpu->CTX_SUFF(pVM); 10783 10783 int rc = hmR0VmxReadExitQualificationVmcs(pVCpu, pVmxTransient); 10784 rc |= hmR0VmxReadExitInt rInfoVmcs(pVCpu, pVmxTransient);10785 rc |= hmR0VmxReadExitInt rErrorCodeVmcs(pVCpu, pVmxTransient);10784 rc |= hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10785 rc |= hmR0VmxReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10786 10786 AssertRCReturn(rc, rc); 10787 10787 … … 10793 10793 { 10794 10794 pMixedCtx->cr2 = pVmxTransient->uExitQualification; /* Update here in case we go back to ring-3 before injection. */ 10795 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10796 0 /* cbInstr */, pVmxTransient->uExitInt rErrorCode, pVmxTransient->uExitQualification);10795 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10796 0 /* cbInstr */, pVmxTransient->uExitIntErrorCode, pVmxTransient->uExitQualification); 10797 10797 } 10798 10798 else … … 10813 10813 10814 10814 Log4(("#PF: cr2=%#RX64 cs:rip=%#04x:%#RX64 uErrCode %#RX32 cr3=%#RX64\n", pVmxTransient->uExitQualification, 10815 pMixedCtx->cs.Sel, pMixedCtx->rip, pVmxTransient->uExitInt rErrorCode, pMixedCtx->cr3));10816 10817 TRPMAssertXcptPF(pVCpu, pVmxTransient->uExitQualification, (RTGCUINT)pVmxTransient->uExitInt rErrorCode);10818 rc = PGMTrap0eHandler(pVCpu, pVmxTransient->uExitInt rErrorCode, CPUMCTX2CORE(pMixedCtx),10815 pMixedCtx->cs.Sel, pMixedCtx->rip, pVmxTransient->uExitIntErrorCode, pMixedCtx->cr3)); 10816 10817 TRPMAssertXcptPF(pVCpu, pVmxTransient->uExitQualification, (RTGCUINT)pVmxTransient->uExitIntErrorCode); 10818 rc = PGMTrap0eHandler(pVCpu, pVmxTransient->uExitIntErrorCode, CPUMCTX2CORE(pMixedCtx), 10819 10819 (RTGCPTR)pVmxTransient->uExitQualification); 10820 10820 … … 10842 10842 pVCpu->hm.s.Event.fPending = false; /* In case it's a contributory #PF. */ 10843 10843 pMixedCtx->cr2 = pVmxTransient->uExitQualification; /* Update here in case we go back to ring-3 before injection. */ 10844 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitInt rInfo),10844 hmR0VmxSetPendingEvent(pVCpu, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo), 10845 10845 0 /* cbInstr */, uGstErrorCode, pVmxTransient->uExitQualification); 10846 10846 } -
trunk/src/VBox/VMM/VMMR3/HM.cpp
r48998 r49000 2981 2981 rc = SSMR3PutU32(pSSM, pVM->aCpus[i].hm.s.Event.u32ErrCode); 2982 2982 AssertRCReturn(rc, rc); 2983 rc = SSMR3PutU64(pSSM, pVM->aCpus[i].hm.s.Event.u64Int rInfo);2983 rc = SSMR3PutU64(pSSM, pVM->aCpus[i].hm.s.Event.u64IntInfo); 2984 2984 AssertRCReturn(rc, rc); 2985 /** @todo Shouldn't we be saving GCPtrFaultAddress too? */ 2985 2986 2986 2987 /** @todo We only need to save pVM->aCpus[i].hm.s.vmx.fWasInRealMode and … … 3079 3080 rc = SSMR3GetU32(pSSM, &pVM->aCpus[i].hm.s.Event.u32ErrCode); 3080 3081 AssertRCReturn(rc, rc); 3081 rc = SSMR3GetU64(pSSM, &pVM->aCpus[i].hm.s.Event.u64Int rInfo);3082 rc = SSMR3GetU64(pSSM, &pVM->aCpus[i].hm.s.Event.u64IntInfo); 3082 3083 AssertRCReturn(rc, rc); 3083 3084 -
trunk/src/VBox/VMM/include/HMInternal.h
r48570 r49000 695 695 uint32_t cbInstr; 696 696 uint32_t u32Padding; /**< Explicit alignment padding. */ 697 uint64_t u64Int rInfo;697 uint64_t u64IntInfo; 698 698 RTGCUINTPTR GCPtrFaultAddress; 699 699 } Event; -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r48216 r49000 412 412 CHECK_MEMBER_ALIGNMENT(HMCPU, vmx.u32PinCtls, 8); 413 413 CHECK_MEMBER_ALIGNMENT(HMCPU, DisState, 8); 414 CHECK_MEMBER_ALIGNMENT(HMCPU, Event.u64Int rInfo, 8);414 CHECK_MEMBER_ALIGNMENT(HMCPU, Event.u64IntInfo, 8); 415 415 416 416 /* Make sure the set is large enough and has the correct size. */
Note:
See TracChangeset
for help on using the changeset viewer.