VirtualBox

Changeset 91287 in vbox


Ignore:
Timestamp:
Sep 16, 2021 9:30:45 PM (3 years ago)
Author:
vboxsync
Message:

VMM/CPUM,++: Moved the nested SVM VMCB allocation into CPUMCTX. bugref:10093

Location:
trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.h

    r91275 r91287  
    18211821#ifndef IN_RC
    18221822    if (   pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM
    1823         || !(pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl.u64InterceptCtrl & SVM_CTRL_INTERCEPT_VMRUN))
     1823        || !(pCtx->hwvirt.svm.Vmcb.ctrl.u64InterceptCtrl & SVM_CTRL_INTERCEPT_VMRUN))
    18241824        return false;
    18251825    return true;
     
    18951895    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    18961896        return false;
    1897     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1898     Assert(pVmcb);
    18991897    uint64_t u64Intercepts;
    19001898    if (!HMGetGuestSvmCtrlIntercepts(pVCpu, &u64Intercepts))
    1901         u64Intercepts = pVmcb->ctrl.u64InterceptCtrl;
     1899        u64Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u64InterceptCtrl;
    19021900    return RT_BOOL(u64Intercepts & fIntercept);
    19031901}
     
    19161914    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    19171915        return false;
    1918     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1919     Assert(pVmcb);
    19201916    uint16_t u16Intercepts;
    19211917    if (!HMGetGuestSvmReadCRxIntercepts(pVCpu, &u16Intercepts))
    1922         u16Intercepts = pVmcb->ctrl.u16InterceptRdCRx;
     1918        u16Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u16InterceptRdCRx;
    19231919    return RT_BOOL(u16Intercepts & (UINT16_C(1) << uCr));
    19241920}
     
    19371933    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    19381934        return false;
    1939     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1940     Assert(pVmcb);
    19411935    uint16_t u16Intercepts;
    19421936    if (!HMGetGuestSvmWriteCRxIntercepts(pVCpu, &u16Intercepts))
    1943         u16Intercepts = pVmcb->ctrl.u16InterceptWrCRx;
     1937        u16Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u16InterceptWrCRx;
    19441938    return RT_BOOL(u16Intercepts & (UINT16_C(1) << uCr));
    19451939}
     
    19581952    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    19591953        return false;
    1960     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1961     Assert(pVmcb);
    19621954    uint16_t u16Intercepts;
    19631955    if (!HMGetGuestSvmReadDRxIntercepts(pVCpu, &u16Intercepts))
    1964         u16Intercepts = pVmcb->ctrl.u16InterceptRdDRx;
     1956        u16Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u16InterceptRdDRx;
    19651957    return RT_BOOL(u16Intercepts & (UINT16_C(1) << uDr));
    19661958}
     
    19791971    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    19801972        return false;
    1981     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1982     Assert(pVmcb);
    19831973    uint16_t u16Intercepts;
    19841974    if (!HMGetGuestSvmWriteDRxIntercepts(pVCpu, &u16Intercepts))
    1985         u16Intercepts = pVmcb->ctrl.u16InterceptWrDRx;
     1975        u16Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u16InterceptWrDRx;
    19861976    return RT_BOOL(u16Intercepts & (UINT16_C(1) << uDr));
    19871977}
     
    20001990    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    20011991        return false;
    2002     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2003     Assert(pVmcb);
    20041992    uint32_t u32Intercepts;
    20051993    if (!HMGetGuestSvmXcptIntercepts(pVCpu, &u32Intercepts))
    2006         u32Intercepts = pVmcb->ctrl.u32InterceptXcpt;
     1994        u32Intercepts = pCtx->hwvirt.svm.Vmcb.ctrl.u32InterceptXcpt;
    20071995    return RT_BOOL(u32Intercepts & RT_BIT(uVector));
    20081996}
     
    20212009    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    20222010        return false;
    2023     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2024     Assert(pVmcb);
    20252011    bool fVIntrMasking;
    20262012    if (!HMGetGuestSvmVirtIntrMasking(pVCpu, &fVIntrMasking))
    2027         fVIntrMasking = pVmcb->ctrl.IntCtrl.n.u1VIntrMasking;
     2013        fVIntrMasking = pCtx->hwvirt.svm.Vmcb.ctrl.IntCtrl.n.u1VIntrMasking;
    20282014    return fVIntrMasking;
    20292015}
     
    20422028    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    20432029        return false;
    2044     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2045     Assert(pVmcb);
    20462030    bool fNestedPaging;
    20472031    if (!HMGetGuestSvmNestedPaging(pVCpu, &fNestedPaging))
    2048         fNestedPaging = pVmcb->ctrl.NestedPagingCtrl.n.u1NestedPaging;
     2032        fNestedPaging = pCtx->hwvirt.svm.Vmcb.ctrl.NestedPagingCtrl.n.u1NestedPaging;
    20492033    return fNestedPaging;
    20502034}
     
    20632047    if (pCtx->hwvirt.enmHwvirt != CPUMHWVIRT_SVM)
    20642048        return false;
    2065     PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2066     Assert(pVmcb);
    20672049    uint16_t u16PauseFilterCount;
    20682050    if (!HMGetGuestSvmPauseFilterCount(pVCpu, &u16PauseFilterCount))
    2069         u16PauseFilterCount = pVmcb->ctrl.u16PauseFilterCount;
     2051        u16PauseFilterCount = pCtx->hwvirt.svm.Vmcb.ctrl.u16PauseFilterCount;
    20702052    return u16PauseFilterCount;
    20712053}
     
    20802062 * @remarks Should only be called when SVM feature is exposed to the guest.
    20812063 */
    2082 DECLINLINE(void) CPUMGuestSvmUpdateNRip(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t cbInstr)
     2064DECLINLINE(void) CPUMGuestSvmUpdateNRip(PVMCPU pVCpu, PCPUMCTX pCtx, uint8_t cbInstr)
    20832065{
    20842066    RT_NOREF(pVCpu);
    20852067    Assert(pCtx->hwvirt.enmHwvirt == CPUMHWVIRT_SVM);
    2086     PSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2087     Assert(pVmcb);
    2088     pVmcb->ctrl.u64NextRIP = pCtx->rip + cbInstr;
     2068    pCtx->hwvirt.svm.Vmcb.ctrl.u64NextRIP = pCtx->rip + cbInstr;
    20892069}
    20902070
  • trunk/include/VBox/vmm/cpum.mac

    r91281 r91287  
    265265
    266266    alignb 4096
     267    .hwvirt.svm.Vmcb                   resb          4096
    267268    .hwvirt.svm.uMsrHSavePa            resq          1
    268269    .hwvirt.svm.GCPhysVmcb             resq          1
    269     .hwvirt.svm.pVmcbR0                RTR0PTR_RES   1
    270     alignb 8
    271     .hwvirt.svm.pVmcbR3                RTR3PTR_RES   1
    272270    alignb 8
    273271    .hwvirt.svm.HostState              resb        184
     
    285283    .hwvirt.svm.pvIoBitmapR3           RTR3PTR_RES   1
    286284    alignb 8
    287     .hwvirt.svm.HCPhysVmcb             RTHCPHYS_RES  1
    288     .hwvirt.svm.abPadding0             resb        272
    289285    .hwvirt.enmHwvirt                  resd          1
    290286    .hwvirt.fGif                       resb          1
  • trunk/include/VBox/vmm/cpumctx.h

    r91286 r91287  
    500500            struct
    501501            {
     502                /** 0x4000 - Cache of the nested-guest VMCB. */
     503                SVMVMCB                 Vmcb;
     504
    502505                /** 0x300 - MSR holding physical address of the Guest's Host-state. */
    503506                uint64_t                uMsrHSavePa;
    504507                /** 0x308 - Guest physical address of the nested-guest VMCB. */
    505508                RTGCPHYS                GCPhysVmcb;
    506                 /** 0x310 - Cache of the nested-guest VMCB - R0 ptr. */
    507                 R0PTRTYPE(PSVMVMCB)     pVmcbR0;
    508                 /** 0x318 - Cache of the nested-guest VMCB - R3 ptr. */
    509                 R3PTRTYPE(PSVMVMCB)     pVmcbR3;
    510509                /** 0x320 - Guest's host-state save area. */
    511510                SVMHOSTSTATE            HostState;
     
    528527                /** 0x400 - IO permission bitmap - R3 ptr. */
    529528                R3PTRTYPE(void *)       pvIoBitmapR3;
    530                 /** 0x408 - Host physical address of the nested-guest VMCB.  */
    531                 RTHCPHYS                HCPhysVmcb;
    532                 /** 0x410 - Padding. */
    533                 uint8_t                 abPadding0[272];
    534529            } svm;
    535530
     
    634629#endif
    635630        /** 0x530 - Pad to 64 byte boundary. */
    636         uint8_t                 abPadding0[16];
     631        uint8_t                 abPadding0[8+16+32];
    637632    } hwvirt;
    638633} CPUMCTX;
     
    640635
    641636#ifndef VBOX_FOR_DTRACE_LIB
     637AssertCompileSizeAlignment(CPUMCTX, 8);
     638AssertCompileSizeAlignment(CPUMCTX, 16);
     639AssertCompileSizeAlignment(CPUMCTX, 32);
    642640AssertCompileSizeAlignment(CPUMCTX, 64);
    643641AssertCompileMemberOffset(CPUMCTX, CPUM_UNION_NM(g.) CPUM_STRUCT_NM(qw.) rax,   0);
     
    837835AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(s,n.) gs,   CPUMCTX, CPUM_UNION_NM(s.) aSRegs[X86_SREG_GS]);
    838836# endif
    839 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0,               8);
     837AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.Vmcb,                  4096);
    840838AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0,         8);
    841839AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0,          8);
  • trunk/include/VBox/vmm/gvmm.h

    r90597 r91287  
    189189GVMMR0DECL(PGVMCPU) GVMMR0GetGVCpuByEMT(RTNATIVETHREAD hEMT);
    190190GVMMR0DECL(PGVMCPU) GVMMR0GetGVCpuByGVMandEMT(PGVM pGVM, RTNATIVETHREAD hEMT);
     191GVMMR0DECL(RTHCPHYS) GVMMR0ConvertGVMPtr2HCPhys(PGVM pGVM, void *pv);
    191192GVMMR0DECL(int)     GVMMR0SchedHalt(PGVM pGVM, PGVMCPU pGVCpu, uint64_t u64ExpireGipTime);
    192193GVMMR0DECL(int)     GVMMR0SchedHaltReq(PGVM pGVM, VMCPUID idCpu, uint64_t u64ExpireGipTime);
  • trunk/include/VBox/vmm/vm.h

    r91283 r91287  
    305305        CPUMCTX             GstCtx;
    306306#endif
    307         uint8_t             padding[36864];      /* multiple of 4096 */
     307        uint8_t             padding[40960];      /* multiple of 4096 */
    308308    } cpum;
    309309
  • trunk/include/VBox/vmm/vm.mac

    r91283 r91287  
    9191    .pgm                    resb 4096+28672
    9292    alignb 4096
    93     .cpum                   resb 36864
     93    .cpum                   resb 40960
    9494%define VMCPU.cpum.GstCtx   VMCPU.cpum
    9595    alignb 4096
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r91281 r91287  
    20972097    Assert(CPUMIsGuestInSvmNestedHwVirtMode(pCtx));
    20982098
    2099     PCSVMVMCBCTRL pVmcbCtrl    = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     2099    PCSVMVMCBCTRL pVmcbCtrl    = &pCtx->hwvirt.svm.Vmcb.ctrl;
    21002100    PCSVMINTCTRL  pVmcbIntCtrl = &pVmcbCtrl->IntCtrl;
    21012101    Assert(!pVmcbIntCtrl->n.u1VGifEnable);      /* We don't support passing virtual-GIF feature to the guest yet. */
     
    21162116VMM_INT_DECL(uint8_t) CPUMGetGuestSvmVirtIntrVector(PCCPUMCTX pCtx)
    21172117{
    2118     PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    2119     return pVmcbCtrl->IntCtrl.n.u8VIntrVector;
     2118    return pCtx->hwvirt.svm.Vmcb.ctrl.IntCtrl.n.u8VIntrVector;
    21202119}
    21212120
     
    22122211        uint64_t offTsc;
    22132212        if (!HMGetGuestSvmTscOffset(pVCpu, &offTsc))
    2214         {
    2215             PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2216             Assert(pVmcb);
    2217             offTsc = pVmcb->ctrl.u64TSCOffset;
    2218         }
     2213            offTsc = pCtx->hwvirt.svm.Vmcb.ctrl.u64TSCOffset;
    22192214        return uTscValue + offTsc;
    22202215    }
     
    22512246        uint64_t offTsc;
    22522247        if (!HMGetGuestSvmTscOffset(pVCpu, &offTsc))
    2253         {
    2254             PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    2255             Assert(pVmcb);
    2256             offTsc = pVmcb->ctrl.u64TSCOffset;
    2257         }
     2248            offTsc = pCtx->hwvirt.svm.Vmcb.ctrl.u64TSCOffset;
    22582249        return uTscValue - offTsc;
    22592250    }
  • trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp

    r87563 r91287  
    139139         * by a physical CPU on #VMEXIT.
    140140         */
    141         PSVMVMCBCTRL pVmcbNstGstCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     141        PSVMVMCBCTRL pVmcbNstGstCtrl = &pCtx->hwvirt.svm.Vmcb.ctrl;
    142142        pVmcbNstGstCtrl->u16InterceptRdCRx                 = pVmcbNstGstCache->u16InterceptRdCRx;
    143143        pVmcbNstGstCtrl->u16InterceptWrCRx                 = pVmcbNstGstCache->u16InterceptWrCRx;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r91281 r91287  
    55625562            if (CPUMIsGuestInSvmNestedHwVirtMode(IEM_GET_CTX(pVCpu)))
    55635563            {
    5564                 PCSVMVMCBCTRL pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     5564                PCSVMVMCBCTRL pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl;
    55655565                if (CPUMIsGuestSvmVirtIntrMasking(pVCpu, IEM_GET_CTX(pVCpu)))
    55665566                {
     
    60986098                }
    60996099
    6100                 PSVMVMCBCTRL pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    6101                 pVmcbCtrl->IntCtrl.n.u8VTPR = uNewCrX;
     6100                pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl.IntCtrl.n.u8VTPR = uNewCrX;
    61026101                if (CPUMIsGuestSvmVirtIntrMasking(pVCpu, IEM_GET_CTX(pVCpu)))
    61036102                {
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplSvmInstr.cpp.h

    r82968 r91287  
    150150        PSVMVMCB       pVmcbMem;
    151151        PGMPAGEMAPLOCK PgLockMem;
    152         PSVMVMCBCTRL   pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     152        PSVMVMCBCTRL   pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl;
    153153        rcStrict = iemMemPageMap(pVCpu, pVCpu->cpum.GstCtx.hwvirt.svm.GCPhysVmcb, IEM_ACCESS_DATA_RW, (void **)&pVmcbMem,
    154154                                 &PgLockMem);
     
    380380     */
    381381    PVMCC pVM = pVCpu->CTX_SUFF(pVM);
    382     int rc = PGMPhysSimpleReadGCPhys(pVM, pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb), GCPhysVmcb, sizeof(SVMVMCB));
     382    int rc = PGMPhysSimpleReadGCPhys(pVM, &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb, GCPhysVmcb, sizeof(SVMVMCB));
    383383    if (RT_SUCCESS(rc))
    384384    {
     
    395395         * typically enter hardware-assisted SVM soon anyway, see @bugref{7243#c113}.
    396396         */
    397         PSVMVMCBCTRL      pVmcbCtrl   = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    398         PSVMVMCBSTATESAVE pVmcbNstGst = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->guest;
     397        PSVMVMCBCTRL      pVmcbCtrl   = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl;
     398        PSVMVMCBSTATESAVE pVmcbNstGst = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.guest;
    399399
    400400        RT_ZERO(pVmcbCtrl->u8Reserved0);
     
    916916            && !(uErr & X86_TRAP_PF_ID))
    917917        {
    918             PSVMVMCBCTRL  pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     918            PSVMVMCBCTRL  pVmcbCtrl = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl;
    919919# ifdef IEM_WITH_CODE_TLB
    920920            uint8_t const *pbInstrBuf = pVCpu->iem.s.pbInstrBuf;
     
    934934            IEM_SVM_UPDATE_NRIP(pVCpu);
    935935        Log2(("iemHandleSvmNstGstEventIntercept: Xcpt intercept u32InterceptXcpt=%#RX32 u8Vector=%#x "
    936               "uExitInfo1=%#RX64 uExitInfo2=%#RX64 -> #VMEXIT\n", pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb)->ctrl.u32InterceptXcpt,
     936              "uExitInfo1=%#RX64 uExitInfo2=%#RX64 -> #VMEXIT\n", pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb.ctrl.u32InterceptXcpt,
    937937              u8Vector, uExitInfo1, uExitInfo2));
    938938        IEM_SVM_VMEXIT_RET(pVCpu, SVM_EXIT_XCPT_0 + u8Vector, uExitInfo1, uExitInfo2);
  • trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp

    r91015 r91287  
    19671967
    19681968/**
     1969 * Converts a pointer with the GVM structure to a host physical address.
     1970 *
     1971 * @returns Host physical address.
     1972 * @param   pGVM    The global (ring-0) VM structure.
     1973 * @param   pv      The address to convert.
     1974 * @thread  EMT
     1975 */
     1976GVMMR0DECL(RTHCPHYS) GVMMR0ConvertGVMPtr2HCPhys(PGVM pGVM, void *pv)
     1977{
     1978    AssertPtr(pGVM);
     1979    Assert(pGVM->u32Magic == GVM_MAGIC);
     1980    uintptr_t const off = (uintptr_t)pv - (uintptr_t)pGVM;
     1981    Assert(off < RT_UOFFSETOF_DYN(GVM, aCpus[pGVM->cCpus]));
     1982    return RTR0MemObjGetPagePhysAddr(pGVM->gvmm.s.VMMemObj, off >> PAGE_SHIFT) | ((uintptr_t)pv & PAGE_OFFSET_MASK);
     1983}
     1984
     1985
     1986/**
    19691987 * This is will wake up expired and soon-to-be expired VMs.
    19701988 *
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r91271 r91287  
    12191219#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    12201220    if (CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.GstCtx))
    1221         return pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb);
     1221        return &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb;
    12221222#endif
    12231223    return pVCpu->hmr0.s.svm.pVmcb;
     
    22332233    PVMCC        pVM             = pVCpu->CTX_SUFF(pVM);
    22342234    PCSVMVMCB    pVmcb           = pVCpu->hmr0.s.svm.pVmcb;
    2235     PSVMVMCB     pVmcbNstGst     = pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb);
     2235    PSVMVMCB     pVmcbNstGst     = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb;
    22362236    PSVMVMCBCTRL pVmcbNstGstCtrl = &pVmcbNstGst->ctrl;
    22372237
     
    25422542    if (!fWasCached)
    25432543    {
    2544         PCSVMVMCB      pVmcbNstGst    = pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb);
     2544        PCSVMVMCB      pVmcbNstGst    = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb;
    25452545        PCSVMVMCBCTRL pVmcbNstGstCtrl = &pVmcbNstGst->ctrl;
    25462546        pVmcbNstGstCache->u16InterceptRdCRx       = pVmcbNstGstCtrl->u16InterceptRdCRx;
     
    25752575static void hmR0SvmSetupVmcbNested(PVMCPUCC pVCpu)
    25762576{
    2577     PSVMVMCB     pVmcbNstGst     = pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb);
     2577    PSVMVMCB     pVmcbNstGst     = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb;
    25782578    PSVMVMCBCTRL pVmcbNstGstCtrl = &pVmcbNstGst->ctrl;
    25792579
     
    46744674    Assert(pcLoops);
    46754675    Assert(*pcLoops <= pVCpu->CTX_SUFF(pVM)->hmr0.s.cMaxResumeLoops);
     4676    RTHCPHYS const HCPhysVmcb = GVMMR0ConvertGVMPtr2HCPhys(pVCpu->pGVM, &pCtx->hwvirt.svm.Vmcb);
    46764677
    46774678    SVMTRANSIENT SvmTransient;
    46784679    RT_ZERO(SvmTransient);
    46794680    SvmTransient.fUpdateTscOffsetting = true;
    4680     SvmTransient.pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
     4681    SvmTransient.pVmcb = &pCtx->hwvirt.svm.Vmcb;
    46814682    SvmTransient.fIsNestedGuest = true;
    46824683
     
    47034704        hmR0SvmPreRunGuestCommitted(pVCpu, &SvmTransient);
    47044705
    4705         rc = hmR0SvmRunGuest(pVCpu, pCtx->hwvirt.svm.HCPhysVmcb);
     4706        rc = hmR0SvmRunGuest(pVCpu, HCPhysVmcb);
    47064707
    47074708        /* Restore any residual host-state and save any bits shared between host and guest
     
    47284729        HMSVM_NESTED_EXITCODE_STAM_COUNTER_INC(SvmTransient.u64ExitCode);
    47294730        STAM_PROFILE_ADV_STOP_START(&pVCpu->hm.s.StatPreExit, &pVCpu->hm.s.StatExitHandling, x);
    4730         VBOXVMM_R0_HMSVM_VMEXIT(pVCpu, pCtx, SvmTransient.u64ExitCode, pCtx->hwvirt.svm.CTX_SUFF(pVmcb));
     4731        VBOXVMM_R0_HMSVM_VMEXIT(pVCpu, pCtx, SvmTransient.u64ExitCode, &pCtx->hwvirt.svm.Vmcb);
    47314732        rc = hmR0SvmHandleExitNested(pVCpu, &SvmTransient);
    47324733        STAM_PROFILE_ADV_STOP(&pVCpu->hm.s.StatExitHandling, x);
     
    48724873     * nested-guest. If it isn't, it should be handled by the (outer) guest.
    48734874     */
    4874     PSVMVMCB       pVmcbNstGst     = pVCpu->cpum.GstCtx.hwvirt.svm.CTX_SUFF(pVmcb);
     4875    PSVMVMCB       pVmcbNstGst     = &pVCpu->cpum.GstCtx.hwvirt.svm.Vmcb;
    48754876    PCCPUMCTX      pCtx            = &pVCpu->cpum.GstCtx;
    48764877    PSVMVMCBCTRL   pVmcbNstGstCtrl = &pVmcbNstGst->ctrl;
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91286 r91287  
    10211021    {
    10221022        PVMCPU pVCpu = pVM->apCpusR3[i];
    1023         if (pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3)
    1024         {
    1025             SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3, SVM_VMCB_PAGES);
    1026             pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3 = NULL;
    1027         }
    1028         pVCpu->cpum.s.Guest.hwvirt.svm.HCPhysVmcb = NIL_RTHCPHYS;
    10291023
    10301024        if (pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3)
     
    10611055        pVCpu->cpum.s.Guest.hwvirt.enmHwvirt = CPUMHWVIRT_SVM;
    10621056
    1063         /*
    1064          * Allocate the nested-guest VMCB.
    1065          */
    1066         SUPPAGE SupNstGstVmcbPage;
    1067         RT_ZERO(SupNstGstVmcbPage);
    1068         SupNstGstVmcbPage.Phys = NIL_RTHCPHYS;
    1069         Assert(SVM_VMCB_PAGES == 1);
    1070         Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3);
    1071         rc = SUPR3PageAllocEx(SVM_VMCB_PAGES, 0 /* fFlags */, (void **)&pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3,
    1072                               &pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR0, &SupNstGstVmcbPage);
    1073         if (RT_FAILURE(rc))
    1074         {
    1075             Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pVmcbR3);
    1076             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's VMCB\n", pVCpu->idCpu, SVM_VMCB_PAGES));
    1077             break;
    1078         }
    1079         pVCpu->cpum.s.Guest.hwvirt.svm.HCPhysVmcb = SupNstGstVmcbPage.Phys;
     1057        AssertCompile(SVM_VMCB_PAGES * PAGE_SIZE == sizeof(pVCpu->cpum.s.Guest.hwvirt.svm.Vmcb));
    10801058
    10811059        /*
     
    11361114    PCPUMCTX pCtx = &pVCpu->cpum.s.Guest;
    11371115    Assert(pCtx->hwvirt.enmHwvirt == CPUMHWVIRT_SVM);
    1138     Assert(pCtx->hwvirt.svm.CTX_SUFF(pVmcb));
    1139 
    1140     memset(pCtx->hwvirt.svm.CTX_SUFF(pVmcb), 0, SVM_VMCB_PAGES << PAGE_SHIFT);
     1116
     1117    RT_ZERO(pCtx->hwvirt.svm.Vmcb);
    11411118    pCtx->hwvirt.svm.uMsrHSavePa    = 0;
    11421119    pCtx->hwvirt.svm.uPrevPauseTick = 0;
     
    26672644        if (pVM->cpum.s.GuestFeatures.fSvm)
    26682645        {
    2669             Assert(pGstCtx->hwvirt.svm.CTX_SUFF(pVmcb));
    26702646            SSMR3PutU64(pSSM,    pGstCtx->hwvirt.svm.uMsrHSavePa);
    26712647            SSMR3PutGCPhys(pSSM, pGstCtx->hwvirt.svm.GCPhysVmcb);
     
    26762652            SSMR3PutStructEx(pSSM, &pGstCtx->hwvirt.svm.HostState, sizeof(pGstCtx->hwvirt.svm.HostState), 0 /* fFlags */,
    26772653                             g_aSvmHwvirtHostState, NULL /* pvUser */);
    2678             SSMR3PutMem(pSSM,    pGstCtx->hwvirt.svm.pVmcbR3,       SVM_VMCB_PAGES  << X86_PAGE_4K_SHIFT);
     2654            SSMR3PutMem(pSSM,   &pGstCtx->hwvirt.svm.Vmcb,          sizeof(pGstCtx->hwvirt.svm.Vmcb));
    26792655            SSMR3PutMem(pSSM,    pGstCtx->hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES << X86_PAGE_4K_SHIFT);
    26802656            SSMR3PutMem(pSSM,    pGstCtx->hwvirt.svm.pvIoBitmapR3,  SVM_IOPM_PAGES  << X86_PAGE_4K_SHIFT);
     
    29542930                    if (pVM->cpum.s.GuestFeatures.fSvm)
    29552931                    {
    2956                         Assert(pGstCtx->hwvirt.svm.CTX_SUFF(pVmcb));
    29572932                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.svm.uMsrHSavePa);
    29582933                        SSMR3GetGCPhys(pSSM,   &pGstCtx->hwvirt.svm.GCPhysVmcb);
     
    29632938                        SSMR3GetStructEx(pSSM, &pGstCtx->hwvirt.svm.HostState, sizeof(pGstCtx->hwvirt.svm.HostState),
    29642939                                         0 /* fFlags */, g_aSvmHwvirtHostState, NULL /* pvUser */);
    2965                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.svm.pVmcbR3,       SVM_VMCB_PAGES  << X86_PAGE_4K_SHIFT);
     2940                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.svm.Vmcb,          sizeof(pGstCtx->hwvirt.svm.Vmcb));
    29662941                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES << X86_PAGE_4K_SHIFT);
    29672942                        SSMR3GetMem(pSSM,       pGstCtx->hwvirt.svm.pvIoBitmapR3,  SVM_IOPM_PAGES  << X86_PAGE_4K_SHIFT);
     
    41514126        pHlp->pfnPrintf(pHlp, "  GCPhysVmcb                 = %#RGp\n",     pCtx->hwvirt.svm.GCPhysVmcb);
    41524127        pHlp->pfnPrintf(pHlp, "  VmcbCtrl:\n");
    4153         cpumR3InfoSvmVmcbCtrl(pHlp, &pCtx->hwvirt.svm.pVmcbR3->ctrl,       "    " /* pszPrefix */);
     4128        cpumR3InfoSvmVmcbCtrl(pHlp, &pCtx->hwvirt.svm.Vmcb.ctrl,       "    " /* pszPrefix */);
    41544129        pHlp->pfnPrintf(pHlp, "  VmcbStateSave:\n");
    4155         cpumR3InfoSvmVmcbStateSave(pHlp, &pCtx->hwvirt.svm.pVmcbR3->guest, "    " /* pszPrefix */);
     4130        cpumR3InfoSvmVmcbStateSave(pHlp, &pCtx->hwvirt.svm.Vmcb.guest, "    " /* pszPrefix */);
    41564131        pHlp->pfnPrintf(pHlp, "  HostState:\n");
    41574132        pHlp->pfnPrintf(pHlp, "    uEferMsr                   = %#RX64\n",  pCtx->hwvirt.svm.HostState.uEferMsr);
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91283 r91287  
    231231
    232232    alignb 4096
     233    .Guest.hwvirt.svm.Vmcb                  resb            4096
    233234    .Guest.hwvirt.svm.uMsrHSavePa            resq         1
    234235    .Guest.hwvirt.svm.GCPhysVmcb             resq         1
    235     .Guest.hwvirt.svm.pVmcbR0                RTR0PTR_RES  1
    236     alignb 8
    237     .Guest.hwvirt.svm.pVmcbR3                RTR3PTR_RES  1
    238236    alignb 8
    239237    .Guest.hwvirt.svm.HostState              resb         184
     
    250248    alignb 8
    251249    .Guest.hwvirt.svm.pvIoBitmapR3           RTR3PTR_RES  1
    252     alignb 8
    253     .Guest.hwvirt.svm.HCPhysVmcb             RTHCPHYS_RES 1
    254     .Guest.hwvirt.svm.abPadding0             resb       272
     250
     251    ;.unnamed_padding.1 resb 0
     252    alignb 8
    255253    .Guest.hwvirt.enmHwvirt                  resd         1
    256254    .Guest.hwvirt.fGif                       resb         1
  • trunk/src/VBox/VMM/testcase/tstAsmStructsAsm-lst.sed

    r91281 r91287  
    3131/^\.data$/d
    3232/^\.bss$/d
     33/ *\.unnamed_padding\./d
    3334s/[[:space:]][[:space:]]*/ /g
    3435
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91286 r91287  
    128128    GEN_CHECK_SIZE(CPUMCTX);
    129129    GEN_CHECK_OFF(CPUMCTX, hwvirt);
     130    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.Vmcb);
    130131    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.uMsrHSavePa);
    131132    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.GCPhysVmcb);
    132     GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.pVmcbR0);
    133     GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.pVmcbR3);
    134133    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.HostState);
    135134    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.uPrevPauseTick);
     
    141140    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.pvIoBitmapR0);
    142141    GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.pvIoBitmapR3);
    143     GEN_CHECK_OFF(CPUMCTX, hwvirt.svm.HCPhysVmcb);
    144142    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.GCPhysVmxon);
    145143    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.GCPhysVmcs);
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