VirtualBox

Changeset 73437 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Aug 2, 2018 6:11:26 AM (7 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Fix bug while injecting double-fault exception.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r73422 r73437  
    57885788DECLINLINE(void) hmR0VmxSetPendingXcptDF(PVMCPU pVCpu)
    57895789{
    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;
    57935793    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 */
     5802DECLINLINE(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 */
     5815DECLINLINE(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 */
     5830DECLINLINE(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 */);
    57945835}
    57955836
     
    73907431
    73917432/**
    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 /**
    74047433 * Injects a double-fault (\#DF) exception into the VM.
    74057434 *
     
    74167445DECLINLINE(VBOXSTRICTRC) hmR0VmxInjectXcptDF(PVMCPU pVCpu, bool fStepping, uint32_t *pfIntrState)
    74177446{
    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;
    74217450    return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */, fStepping,
    74227451                                  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 guest
    7444  *                          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 */);
    74517452}
    74527453
     
    74727473                                             uint32_t *pfIntrState)
    74737474{
    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);
    74787478    return hmR0VmxInjectEventVmcs(pVCpu, u32IntInfo, 0 /* cbInstr */, u32ErrorCode, 0 /* GCPtrFaultAddress */, fStepping,
    74797479                                  pfIntrState);
     
    74917491DECLINLINE(void) hmR0VmxSetPendingIntN(PVMCPU pVCpu, uint16_t uVector, uint32_t cbInstr)
    74927492{
    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);
    74997497    hmR0VmxSetPendingEvent(pVCpu, u32IntInfo, cbInstr, 0 /* u32ErrCode */, 0 /* GCPtrFaultAddress */);
    75007498}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette