Changeset 73437 in vbox for trunk/src/VBox/VMM/VMMR0
- Timestamp:
- Aug 2, 2018 6:11:26 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r73422 r73437 5788 5788 DECLINLINE(void) hmR0VmxSetPendingXcptDF(PVMCPU pVCpu) 5789 5789 { 5790 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID;5791 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT);5792 u32IntInfo |=VMX_EXIT_INT_INFO_ERROR_CODE_VALID;5790 uint32_t const u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID 5791 | (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT) 5792 | VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 5793 5793 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5794 } 5795 5796 5797 /** 5798 * Sets an invalid-opcode (\#UD) exception as pending-for-injection into the VM. 5799 * 5800 * @param pVCpu The cross context virtual CPU structure. 5801 */ 5802 DECLINLINE(void) hmR0VmxSetPendingXcptUD(PVMCPU pVCpu) 5803 { 5804 uint32_t const u32IntInfo = X86_XCPT_UD | VMX_EXIT_INT_INFO_VALID 5805 | (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 5806 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5807 } 5808 5809 5810 /** 5811 * Sets a debug (\#DB) exception as pending-for-injection into the VM. 5812 * 5813 * @param pVCpu The cross context virtual CPU structure. 5814 */ 5815 DECLINLINE(void) hmR0VmxSetPendingXcptDB(PVMCPU pVCpu) 5816 { 5817 uint32_t const u32IntInfo = X86_XCPT_DB | VMX_EXIT_INT_INFO_VALID 5818 | (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 5819 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5820 } 5821 5822 5823 /** 5824 * Sets an overflow (\#OF) exception as pending-for-injection into the VM. 5825 * 5826 * @param pVCpu The cross context virtual CPU structure. 5827 * @param cbInstr The value of RIP that is to be pushed on the guest 5828 * stack. 5829 */ 5830 DECLINLINE(void) hmR0VmxSetPendingXcptOF(PVMCPU pVCpu, uint32_t cbInstr) 5831 { 5832 uint32_t const u32IntInfo = X86_XCPT_OF | VMX_EXIT_INT_INFO_VALID 5833 | (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 5834 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 5794 5835 } 5795 5836 … … 7390 7431 7391 7432 /** 7392 * Sets an invalid-opcode (\#UD) exception as pending-for-injection into the VM.7393 *7394 * @param pVCpu The cross context virtual CPU structure.7395 */7396 DECLINLINE(void) hmR0VmxSetPendingXcptUD(PVMCPU pVCpu)7397 {7398 uint32_t u32IntInfo = X86_XCPT_UD | VMX_EXIT_INT_INFO_VALID;7399 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);7400 }7401 7402 7403 /**7404 7433 * Injects a double-fault (\#DF) exception into the VM. 7405 7434 * … … 7416 7445 DECLINLINE(VBOXSTRICTRC) hmR0VmxInjectXcptDF(PVMCPU pVCpu, bool fStepping, uint32_t *pfIntrState) 7417 7446 { 7418 uint32_t u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID;7419 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT);7420 u32IntInfo |=VMX_EXIT_INT_INFO_ERROR_CODE_VALID;7447 uint32_t const u32IntInfo = X86_XCPT_DF | VMX_EXIT_INT_INFO_VALID 7448 | (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT) 7449 | VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 7421 7450 return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */, fStepping, 7422 7451 pfIntrState); 7423 }7424 7425 7426 /**7427 * Sets a debug (\#DB) exception as pending-for-injection into the VM.7428 *7429 * @param pVCpu The cross context virtual CPU structure.7430 */7431 DECLINLINE(void) hmR0VmxSetPendingXcptDB(PVMCPU pVCpu)7432 {7433 uint32_t u32IntInfo = X86_XCPT_DB | VMX_EXIT_INT_INFO_VALID;7434 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT);7435 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);7436 }7437 7438 7439 /**7440 * Sets an overflow (\#OF) exception as pending-for-injection into the VM.7441 *7442 * @param pVCpu The cross context virtual CPU structure.7443 * @param cbInstr The value of RIP that is to be pushed on the guest7444 * stack.7445 */7446 DECLINLINE(void) hmR0VmxSetPendingXcptOF(PVMCPU pVCpu, uint32_t cbInstr)7447 {7448 uint32_t u32IntInfo = X86_XCPT_OF | VMX_EXIT_INT_INFO_VALID;7449 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT);7450 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);7451 7452 } 7452 7453 … … 7472 7473 uint32_t *pfIntrState) 7473 7474 { 7474 uint32_t u32IntInfo = X86_XCPT_GP | VMX_EXIT_INT_INFO_VALID; 7475 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7476 if (fErrorCodeValid) 7477 u32IntInfo |= VMX_EXIT_INT_INFO_ERROR_CODE_VALID; 7475 uint32_t const u32IntInfo = X86_XCPT_GP | VMX_EXIT_INT_INFO_VALID 7476 | (VMX_EXIT_INT_INFO_TYPE_HW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT) 7477 | (fErrorCodeValid ? VMX_EXIT_INT_INFO_ERROR_CODE_VALID : 0); 7478 7478 return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, u32ErrorCode, 0 /* GCPtrFaultAddress */, fStepping, 7479 7479 pfIntrState); … … 7491 7491 DECLINLINE(void) hmR0VmxSetPendingIntN(PVMCPU pVCpu, uint16_t uVector, uint32_t cbInstr) 7492 7492 { 7493 uint32_t u32IntInfo = uVector | VMX_EXIT_INT_INFO_VALID; 7494 if ( uVector == X86_XCPT_BP 7495 || uVector == X86_XCPT_OF) 7496 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_XCPT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7497 else 7498 u32IntInfo |= (VMX_EXIT_INT_INFO_TYPE_SW_INT << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7493 bool const fIsSwXcpt = RT_BOOL(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF); 7494 uint32_t const u32IntType = fIsSwXcpt ? VMX_EXIT_INT_INFO_TYPE_SW_XCPT : VMX_EXIT_INT_INFO_TYPE_SW_INT; 7495 uint32_t const u32IntInfo = uVector | VMX_EXIT_INT_INFO_VALID 7496 | (u32IntType << VMX_EXIT_INT_INFO_TYPE_SHIFT); 7499 7497 hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */); 7500 7498 }
Note:
See TracChangeset
for help on using the changeset viewer.