VirtualBox

Changeset 67924 in vbox for trunk/include/VBox


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

VMM/CPUM: Nested Hw.virt: Allocate the nested-guest VMCB (controls and state-save area) dynamically.

Location:
trunk/include/VBox/vmm
Files:
3 edited

Legend:

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

    r67258 r67924  
    13151315}
    13161316
     1317#ifndef IN_RC
    13171318/**
    13181319 * Checks if the guest VMCB has the specified ctrl/instruction intercept active.
     
    13251326DECLINLINE(bool) CPUMIsGuestSvmCtrlInterceptSet(PCCPUMCTX pCtx, uint64_t fIntercept)
    13261327{
    1327     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u64InterceptCtrl & fIntercept);
     1328    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1329    return RT_BOOL(pVmcbCtrl->u64InterceptCtrl & fIntercept);
    13281330}
    13291331
     
    13381340DECLINLINE(bool) CPUMIsGuestSvmReadCRxInterceptSet(PCCPUMCTX pCtx, uint8_t uCr)
    13391341{
    1340     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u16InterceptRdCRx & (1 << uCr));
     1342    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1343    return RT_BOOL(pVmcbCtrl->u16InterceptRdCRx & (1 << uCr));
    13411344}
    13421345
     
    13511354DECLINLINE(bool) CPUMIsGuestSvmWriteCRxInterceptSet(PCCPUMCTX pCtx, uint8_t uCr)
    13521355{
    1353     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u16InterceptWrCRx & (1 << uCr));
     1356    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1357    return RT_BOOL(pVmcbCtrl->u16InterceptWrCRx & (1 << uCr));
    13541358}
    13551359
     
    13641368DECLINLINE(bool) CPUMIsGuestSvmReadDRxInterceptSet(PCCPUMCTX pCtx, uint8_t uDr)
    13651369{
    1366     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u16InterceptRdDRx & (1 << uDr));
     1370    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1371    return RT_BOOL(pVmcbCtrl->u16InterceptRdDRx & (1 << uDr));
    13671372}
    13681373
     
    13771382DECLINLINE(bool) CPUMIsGuestSvmWriteDRxInterceptSet(PCCPUMCTX pCtx, uint8_t uDr)
    13781383{
    1379     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u16InterceptWrDRx & (1 << uDr));
     1384    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1385    return RT_BOOL(pVmcbCtrl->u16InterceptWrDRx & (1 << uDr));
    13801386}
    13811387
     
    13911397{
    13921398    Assert(uVector < 32);
    1393     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u32InterceptXcpt & (UINT32_C(1) << uVector));
     1399    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1400    return RT_BOOL(pVmcbCtrl->u32InterceptXcpt & (UINT32_C(1) << uVector));
    13941401}
     1402#endif /* !IN_RC */
    13951403
    13961404/**
     
    14061414     * See AMD spec. 15.5 "VMRUN instruction" subsection "Canonicalization and Consistency Checks".
    14071415     */
    1408     return RT_BOOL(pCtx->hwvirt.svm.VmcbCtrl.u64InterceptCtrl & SVM_CTRL_INTERCEPT_VMRUN);
     1416#ifndef IN_RC
     1417    PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     1418    return RT_BOOL(pVmcbCtrl->u64InterceptCtrl & SVM_CTRL_INTERCEPT_VMRUN);
     1419#else
     1420    RT_NOREF(pCtx);
     1421    return false;
     1422#endif
    14091423}
    14101424
     
    14171431DECLINLINE(bool) CPUMIsGuestInVmxNestedHwVirtMode(PCCPUMCTX pCtx)
    14181432{
    1419     RT_NOREF1(pCtx);
    14201433    /** @todo Intel. */
     1434    RT_NOREF(pCtx);
    14211435    return false;
    14221436}
  • trunk/include/VBox/vmm/cpum.mac

    r66667 r67924  
    258258    .abPadding          resb    12
    259259%endif
    260     .hwvirt.svm.uMsrHSavePa              resq    1
    261     .hwvirt.svm.GCPhysVmcb               resq    1
    262     .hwvirt.svm.VmcbCtrl                 resb  256
    263     .hwvirt.svm.HostState                resb  184
    264     .hwvirt.svm.fGif                     resb    1
    265     .hwvirt.svm.cPauseFilter             resw    1
    266     .hwvirt.svm.cPauseFilterThreshold    resw    1
    267     .hwvirt.svm.fInterceptEvents         resb    1
    268     .hwvirt.svm.abPadding0               resb    2
    269     .hwvirt.svm.pvMsrBitmapR0            RTR0PTR_RES 1
    270     .hwvirt.svm.pvMsrBitmapR3            RTR3PTR_RES 1
    271     .hwvirt.svm.pvIoBitmapR0             RTR0PTR_RES 1
    272     .hwvirt.svm.pvIoBitmapR3             RTR3PTR_RES 1
     260    .hwvirt.svm.uMsrHSavePa            resq          1
     261    .hwvirt.svm.GCPhysVmcb             resq          1
     262    .hwvirt.svm.pVmcbR0                RTR0PTR_RES   1
     263    .hwvirt.svm.pVmcbR3                RTR3PTR_RES   1
    273264%if HC_ARCH_BITS == 32
    274     .hwvirt.svm.abPadding1               resb   16
    275 %endif
    276     .hwvirt.fLocalForcedActions          resd    1
     265    .hwvirt.svm.abPadding0             resb          8
     266%endif
     267    .hwvirt.svm.HostState              resb        184
     268    .hwvirt.svm.fGif                   resb          1
     269    .hwvirt.svm.cPauseFilter           resw          1
     270    .hwvirt.svm.cPauseFilterThreshold  resw          1
     271    .hwvirt.svm.fInterceptEvents       resb          1
     272    .hwvirt.svm.abPadding1             resb          2
     273    .hwvirt.svm.pvMsrBitmapR0          RTR0PTR_RES   1
     274    .hwvirt.svm.pvMsrBitmapR3          RTR3PTR_RES   1
     275    .hwvirt.svm.pvIoBitmapR0           RTR0PTR_RES   1
     276    .hwvirt.svm.pvIoBitmapR3           RTR3PTR_RES   1
     277%if HC_ARCH_BITS == 32
     278    .hwvirt.svm.abPadding2             resb          16
     279%endif
     280    .hwvirt.fLocalForcedActions        resd          1
    277281    alignb 64
    278282endstruc
  • trunk/include/VBox/vmm/cpumctx.h

    r66667 r67924  
    479479                /** 736 - Guest physical address of the nested-guest VMCB. */
    480480                RTGCPHYS            GCPhysVmcb;
    481                 /** 744 - Cache of the nested-guest VMCB control area. */
    482                 SVMVMCBCTRL         VmcbCtrl;
    483                 /** 1000 - Guest's host-state save area. */
     481                /** 744 - Cache of the nested-guest VMCB - R0 ptr. */
     482                R0PTRTYPE(PSVMVMCB) pVmcbR0;
     483                /** 752 / 748 - Cache of the nested-guest VMCB - R3 ptr. */
     484                R3PTRTYPE(PSVMVMCB) pVmcbR3;
     485#if HC_ARCH_BITS == 32
     486                /** NA / 752 - Padding. */
     487                uint8_t             abPadding0[8];
     488#endif
     489                /** 760 - Guest's host-state save area. */
    484490                SVMHOSTSTATE        HostState;
    485                 /** 1184 - Global interrupt flag. */
     491                /** 944 - Global interrupt flag. */
    486492                uint8_t             fGif;
    487                 /** 1185 - Pause filter count. */
     493                /** 945 - Pause filter count. */
    488494                uint16_t            cPauseFilter;
    489                 /** 1187 - Pause filter count. */
     495                /** 947 - Pause filter count. */
    490496                uint16_t            cPauseFilterThreshold;
    491                 /** 1189 - Whether the injected event is subject to event intercepts. */
     497                /** 949 - Whether the injected event is subject to event intercepts. */
    492498                uint8_t             fInterceptEvents;
    493                 /** 1190 - Padding. */
    494                 uint8_t             abPadding0[2];
    495                 /** 1192 - MSR permission bitmap - R0 ptr. */
     499                /** 950 - Padding. */
     500                uint8_t             abPadding1[2];
     501                /** 952 - MSR permission bitmap - R0 ptr. */
    496502                R0PTRTYPE(void *)   pvMsrBitmapR0;
    497                 /** 1200 / 1196 - MSR permission bitmap - R3 ptr. */
     503                /** 960 / 956 - MSR permission bitmap - R3 ptr. */
    498504                R3PTRTYPE(void *)   pvMsrBitmapR3;
    499                 /** 1208 / 1200 - IO permission bitmap - R0 ptr. */
     505                /** 968 / 960 - IO permission bitmap - R0 ptr. */
    500506                R0PTRTYPE(void *)   pvIoBitmapR0;
    501                 /** 1216 / 1204 - IO permission bitmap - R3 ptr. */
     507                /** 976 / 964 - IO permission bitmap - R3 ptr. */
    502508                R3PTRTYPE(void *)   pvIoBitmapR3;
    503509#if HC_ARCH_BITS == 32
    504                 /** NA / 1200 - Padding. */
    505                 uint8_t             abPadding1[16];
     510                /** NA / 968 - Padding. */
     511                uint8_t             abPadding2[16];
    506512#endif
    507513            } svm;
     
    513519        } CPUM_UNION_NM(s);
    514520
    515         /** 1224 - A subset of force flags that are preserved while running
     521        /** 984 - A subset of force flags that are preserved while running
    516522         *  the nested-guest. */
    517523        uint32_t                fLocalForcedActions;
    518524        /** 1212 - Padding. */
    519         uint8_t                 abPadding1[52];
     525        uint8_t                 abPadding1[36];
    520526    } hwvirt;
    521527    /** @} */
     
    575581AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.uMsrHSavePa,            728);
    576582AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.GCPhysVmcb,             736);
    577 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.VmcbCtrl,               744);
    578 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HostState,             1000);
    579 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.fGif,                  1184);
    580 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilter,          1185);
    581 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilterThreshold, 1187);
    582 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.fInterceptEvents,      1189);
    583 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0,         1192);
    584 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR3,         HC_ARCH_BITS == 64 ? 1200 : 1196);
    585 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0,          HC_ARCH_BITS == 64 ? 1208 : 1200);
    586 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3,          HC_ARCH_BITS == 64 ? 1216 : 1204);
    587 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) fLocalForcedActions,       1224);
     583AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0,                744);
     584AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR3,                HC_ARCH_BITS == 64 ? 752 : 748);
     585AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HostState,              760);
     586AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.fGif,                   944);
     587AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilter,           945);
     588AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilterThreshold,  947);
     589AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.fInterceptEvents,       949);
     590AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0,          952);
     591AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR3,          HC_ARCH_BITS == 64 ? 960 : 956);
     592AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0,           HC_ARCH_BITS == 64 ? 968 : 960);
     593AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3,           HC_ARCH_BITS == 64 ? 976 : 964);
     594AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) fLocalForcedActions,        984);
     595AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0,       8);
     596AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 8);
     597AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0,  8);
    588598
    589599AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_NM(g.) aGRegs);
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