VirtualBox

Changeset 67159 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
May 31, 2017 9:30:28 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115835
Message:

VMM/IEM: Nested Hw.virt: Fixes.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r67057 r67159  
    924924{
    925925    Assert(IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT));
    926     Assert(cAddrSizeBits == 16 || cAddrSizeBits == 32 || cAddrSizeBits == 64);
     926    Assert(cAddrSizeBits == 0 || cAddrSizeBits == 16 || cAddrSizeBits == 32 || cAddrSizeBits == 64);
    927927    Assert(cbReg == 1 || cbReg == 2 || cbReg == 4 || cbReg == 8);
    928928
     
    33783378                                                         uint32_t uErr, uint64_t uCr2)
    33793379{
    3380     Assert(IEM_IS_SVM_ENABLED(pVCpu));
     3380    Assert(CPUMIsGuestInSvmNestedHwVirtMode(pCtx));
    33813381
    33823382    /*
     
    34323432#endif
    34333433        }
    3434         Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept. u8Vector=%#x uExitInfo1=%#RX64, uExitInfo2=%#RX64 -> #VMEXIT\n",
    3435              u8Vector, uExitInfo1, uExitInfo2));
     3434        Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept. u32InterceptXcpt=%#RX32 u8Vector=%#x uExitInfo1=%#RX64, uExitInfo2=%#RX64 -> #VMEXIT\n",
     3435             pCtx->hwvirt.svm.VmcbCtrl.u32InterceptXcpt, u8Vector, uExitInfo1, uExitInfo2));
    34363436        IEM_RETURN_SVM_NST_GST_VMEXIT(pVCpu, SVM_EXIT_EXCEPTION_0 + u8Vector, uExitInfo1, uExitInfo2);
    34373437    }
     
    54675467
    54685468#ifdef VBOX_WITH_NESTED_HWVIRT
    5469     if (IEM_IS_SVM_ENABLED(pVCpu))
     5469    if (CPUMIsGuestInSvmNestedHwVirtMode(pCtx))
    54705470    {
    54715471        /*
     
    1604716047#ifdef VBOX_WITH_NESTED_HWVIRT
    1604816048/**
    16049  * Interface for HM and EM to emulate the STGI instruction.
     16049 * Interface for HM and EM to emulate the CLGI instruction.
    1605016050 *
    1605116051 * @returns Strict VBox status code.
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r66848 r67159  
    50655065    if (IEM_IS_SVM_READ_CR_INTERCEPT_SET(pVCpu, iCrReg))
    50665066    {
    5067         Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5067        Log(("iemCImpl_mov_Rd_Cd%#x: Guest intercept -> #VMEXIT\n", iCrReg));
    50685068        IEM_RETURN_SVM_NST_GST_CRX_VMEXIT(pVCpu, SVM_EXIT_READ_CR0 + iCrReg, IEMACCESSCRX_MOV_CRX, iGReg);
    50695069    }
     
    50835083        case 8:
    50845084        {
     5085#ifdef VBOX_WITH_NESTED_HWVIRT
     5086            if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking)
     5087            {
     5088                crX = pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR;
     5089                break;
     5090            }
     5091#endif
    50855092            uint8_t uTpr;
    50865093            int rc = APICGetTpr(pVCpu, &uTpr, NULL, NULL);
     
    54345441         */
    54355442        case 8:
     5443        {
    54365444            if (uNewCrX & ~(uint64_t)0xf)
    54375445            {
     
    54405448            }
    54415449
    5442             if (IEM_IS_SVM_WRITE_CR_INTERCEPT_SET(pVCpu, /*cr*/ 8))
    5443             {
    5444                 Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
    5445                 IEM_RETURN_SVM_NST_GST_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR8, enmAccessCrX, iGReg);
    5446             }
    5447 
     5450            uint8_t const u8Tpr = (uint8_t)uNewCrX << 4;
     5451#ifdef VBOX_WITH_NESTED_HWVIRT
     5452            if (CPUMIsGuestInSvmNestedHwVirtMode(pCtx))
     5453            {
     5454                if (IEM_IS_SVM_WRITE_CR_INTERCEPT_SET(pVCpu, /*cr*/ 8))
     5455                {
     5456                    Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5457                    IEM_RETURN_SVM_NST_GST_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR8, enmAccessCrX, iGReg);
     5458                }
     5459
     5460                pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR = u8Tpr;
     5461                if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking)
     5462                {
     5463                    rcStrict = VINF_SUCCESS;
     5464                    break;
     5465                }
     5466            }
     5467#endif
    54485468            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    5449                 APICSetTpr(pVCpu, (uint8_t)uNewCrX << 4);
     5469                APICSetTpr(pVCpu, u8Tpr);
    54505470            rcStrict = VINF_SUCCESS;
    54515471            break;
     5472        }
    54525473
    54535474        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* call checks */
     
    61946215    }
    61956216
    6196     VBOXSTRICTRC rcStrict = HMSvmVmrun(pVCpu, pCtx, GCPhysVmcb);
     6217    VBOXSTRICTRC rcStrict = HMSvmVmrun(pVCpu, pCtx, cbInstr, GCPhysVmcb);
    61976218    /* If VMRUN execution causes a #VMEXIT, we continue executing the instruction following the VMRUN. */
    61986219    if (rcStrict == VINF_SVM_VMEXIT)
Note: See TracChangeset for help on using the changeset viewer.

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