VirtualBox

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


Ignore:
Timestamp:
Jul 12, 2017 11:13:08 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116917
Message:

VMM/IEM: Nested Hw.virt: Fixes for dynamically allocated nested-guest VMCB.

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

Legend:

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

    r67528 r67925  
    50895089        {
    50905090#ifdef VBOX_WITH_NESTED_HWVIRT
    5091             if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking)
    5092             {
    5093                 crX = pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR;
     5091            PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     5092            if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking)
     5093            {
     5094                crX = pVmcbCtrl->IntCtrl.n.u8VTPR;
    50945095                break;
    50955096            }
     
    54635464                }
    54645465
    5465                 pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u8VTPR = u8Tpr;
    5466                 if (pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIntrMasking)
     5466                PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     5467                pVmcbCtrl->IntCtrl.n.u8VTPR = u8Tpr;
     5468                if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking)
    54675469                {
    54685470                    rcStrict = VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplSvmInstr.cpp.h

    r67749 r67925  
    147147        Assert(CPUMGetGuestCPL(pVCpu) == pCtx->ss.Attr.n.u2Dpl);
    148148
     149        PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    149150        /* Save interrupt shadow of the nested-guest instruction if any. */
    150151        if (   VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)
     
    152153        {
    153154            LogFlow(("iemSvmVmexit: Interrupt shadow till %#RX64\n", pCtx->rip));
    154             pCtx->hwvirt.svm.VmcbCtrl.u64IntShadow |= SVM_INTERRUPT_SHADOW_ACTIVE;
     155            pVmcbCtrl->u64IntShadow |= SVM_INTERRUPT_SHADOW_ACTIVE;
    155156        }
    156157
     
    160161        if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST))
    161162        {
    162             Assert(pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIrqPending);
     163            Assert(pVmcbCtrl->IntCtrl.n.u1VIrqPending);
    163164            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST);
    164165        }
    165166        else
    166             pCtx->hwvirt.svm.VmcbCtrl.IntCtrl.n.u1VIrqPending = 0;
     167            pVmcbCtrl->IntCtrl.n.u1VIrqPending = 0;
    167168
    168169        /** @todo Save V_TPR, V_IRQ. */
     
    170171
    171172        /* Save exit information. */
    172         pCtx->hwvirt.svm.VmcbCtrl.u64ExitCode  = uExitCode;
    173         pCtx->hwvirt.svm.VmcbCtrl.u64ExitInfo1 = uExitInfo1;
    174         pCtx->hwvirt.svm.VmcbCtrl.u64ExitInfo2 = uExitInfo2;
     173        pVmcbCtrl->u64ExitCode  = uExitCode;
     174        pVmcbCtrl->u64ExitInfo1 = uExitInfo1;
     175        pVmcbCtrl->u64ExitInfo2 = uExitInfo2;
    175176
    176177        /*
     
    184185            bool const fRaisingEvent = IEMGetCurrentXcpt(pVCpu, &uExitIntVector, &fExitIntFlags, &uExitIntErr,
    185186                                                         NULL /* uExitIntCr2 */);
    186             pCtx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u1Valid = fRaisingEvent;
     187            pVmcbCtrl->ExitIntInfo.n.u1Valid = fRaisingEvent;
    187188            if (fRaisingEvent)
    188189            {
    189                 pCtx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u8Vector = uExitIntVector;
    190                 pCtx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u3Type   = iemGetSvmEventType(uExitIntVector, fExitIntFlags);
     190                pVmcbCtrl->ExitIntInfo.n.u8Vector = uExitIntVector;
     191                pVmcbCtrl->ExitIntInfo.n.u3Type   = iemGetSvmEventType(uExitIntVector, fExitIntFlags);
    191192                if (fExitIntFlags & IEM_XCPT_FLAGS_ERR)
    192193                {
    193                     pCtx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u1ErrorCodeValid = true;
    194                     pCtx->hwvirt.svm.VmcbCtrl.ExitIntInfo.n.u32ErrorCode     = uExitIntErr;
     194                    pVmcbCtrl->ExitIntInfo.n.u1ErrorCodeValid = true;
     195                    pVmcbCtrl->ExitIntInfo.n.u32ErrorCode     = uExitIntErr;
    195196                }
    196197            }
     
    200201         * Clear event injection in the VMCB.
    201202         */
    202         pCtx->hwvirt.svm.VmcbCtrl.EventInject.n.u1Valid = 0;
     203        pVmcbCtrl->EventInject.n.u1Valid = 0;
    203204
    204205        /*
    205206         * Write back the VMCB controls to the guest VMCB in guest physical memory.
    206207         */
    207         VBOXSTRICTRC rcStrict = PGMPhysSimpleWriteGCPhys(pVCpu->CTX_SUFF(pVM), pCtx->hwvirt.svm.GCPhysVmcb,
    208                                                          &pCtx->hwvirt.svm.VmcbCtrl, sizeof(pCtx->hwvirt.svm.VmcbCtrl));
     208        VBOXSTRICTRC rcStrict = PGMPhysSimpleWriteGCPhys(pVCpu->CTX_SUFF(pVM), pCtx->hwvirt.svm.GCPhysVmcb, pVmcbCtrl,
     209                                                         sizeof(*pVmcbCtrl));
    209210        /*
    210211         * Prepare for guest's "host mode" by clearing internal processor state bits.
     
    214215         * back the VMCB controls above.
    215216         */
    216         RT_ZERO(pCtx->hwvirt.svm.VmcbCtrl);
     217        memset(pVmcbCtrl, 0, sizeof(*pVmcbCtrl));
    217218
    218219        if (RT_SUCCESS(rcStrict))
     
    328329
    329330    /*
    330      * Save host state.
     331     * Read the guest VMCB state.
    331332     */
    332333    SVMVMCBSTATESAVE VmcbNstGst;
     
    334335    if (RT_SUCCESS(rc))
    335336    {
     337        /*
     338         * Save the host state.
     339         */
    336340        PSVMHOSTSTATE pHostState = &pCtx->hwvirt.svm.HostState;
    337341        pHostState->es         = pCtx->es;
     
    351355
    352356        /*
    353          * Load the VMCB controls.
     357         * Read the guest VMCB controls.
    354358         */
    355         rc = PGMPhysSimpleReadGCPhys(pVM, &pCtx->hwvirt.svm.VmcbCtrl, GCPhysVmcb, sizeof(pCtx->hwvirt.svm.VmcbCtrl));
     359        PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     360        rc = PGMPhysSimpleReadGCPhys(pVM, pVmcbCtrl, GCPhysVmcb, sizeof(*pVmcbCtrl));
    356361        if (RT_SUCCESS(rc))
    357362        {
    358             PSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.VmcbCtrl;
    359 
    360363            /*
    361364             * Validate guest-state and controls.
     
    928931            AssertReleaseFailedReturn(VERR_IEM_IPE_5);
    929932#else
     933            PSVMVMCBCTRL  pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    930934            uint8_t const offOpCode = pVCpu->iem.s.offOpcode;
    931935            uint8_t const cbCurrent = pVCpu->iem.s.cbOpcode - pVCpu->iem.s.offOpcode;
    932936            if (   cbCurrent > 0
    933                 && cbCurrent < sizeof(pCtx->hwvirt.svm.VmcbCtrl.abInstr))
     937                && cbCurrent < sizeof(pVmcbCtrl->abInstr))
    934938            {
    935939                Assert(cbCurrent <= sizeof(pVCpu->iem.s.abOpcode));
    936                 memcpy(&pCtx->hwvirt.svm.VmcbCtrl.abInstr[0], &pVCpu->iem.s.abOpcode[offOpCode], cbCurrent);
     940                memcpy(&pVmcbCtrl->abInstr[0], &pVCpu->iem.s.abOpcode[offOpCode], cbCurrent);
    937941            }
    938942#endif
    939943        }
    940         Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept. u32InterceptXcpt=%#RX32 u8Vector=%#x uExitInfo1=%#RX64, uExitInfo2=%#RX64 -> #VMEXIT\n",
    941              pCtx->hwvirt.svm.VmcbCtrl.u32InterceptXcpt, u8Vector, uExitInfo1, uExitInfo2));
     944        Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept u32InterceptXcpt=%#RX32 u8Vector=%#x "
     945              "uExitInfo1=%#RX64 uExitInfo2=%#RX64 -> #VMEXIT\n", pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl.u32InterceptXcpt,
     946              u8Vector, uExitInfo1, uExitInfo2));
    942947        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_EXCEPTION_0 + u8Vector, uExitInfo1, uExitInfo2);
    943948    }
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