VirtualBox

Changeset 72643 in vbox for trunk/include


Ignore:
Timestamp:
Jun 21, 2018 4:02:03 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123151
Message:

VMM: Make SVM R0 code use CPUMCTX_EXTRN_xxx flags and cleanups. bugref:9193

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

Legend:

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

    r72522 r72643  
    13761376 * @param   pCtx    Current CPU context.
    13771377 */
    1378 DECLINLINE(bool) CPUMIsGuestInLongModeEx(PCPUMCTX pCtx)
     1378DECLINLINE(bool) CPUMIsGuestInLongModeEx(PCCPUMCTX pCtx)
    13791379{
    13801380    return (pCtx->msrEFER & MSR_K6_EFER_LMA) == MSR_K6_EFER_LMA;
     
    14521452    if (!pVmcb)
    14531453        return false;
    1454     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1455         return RT_BOOL(pVmcb->ctrl.u64InterceptCtrl & fIntercept);
    1456     return HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, fIntercept);
     1454    if (HMHasGuestSvmVmcbCached(pVCpu))
     1455        return HMIsGuestSvmCtrlInterceptSet(pVCpu, fIntercept);
     1456    return RT_BOOL(pVmcb->ctrl.u64InterceptCtrl & fIntercept);
    14571457}
    14581458
     
    14711471    if (!pVmcb)
    14721472        return false;
    1473     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1474         return RT_BOOL(pVmcb->ctrl.u16InterceptRdCRx & (UINT16_C(1) << uCr));
    1475     return HMIsGuestSvmReadCRxInterceptSet(pVCpu, pCtx, uCr);
     1473    if (HMHasGuestSvmVmcbCached(pVCpu))
     1474        return HMIsGuestSvmReadCRxInterceptSet(pVCpu, uCr);
     1475    return RT_BOOL(pVmcb->ctrl.u16InterceptRdCRx & (UINT16_C(1) << uCr));
    14761476}
    14771477
     
    14901490    if (!pVmcb)
    14911491        return false;
    1492     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1493         return RT_BOOL(pVmcb->ctrl.u16InterceptWrCRx & (UINT16_C(1) << uCr));
    1494     return HMIsGuestSvmWriteCRxInterceptSet(pVCpu, pCtx, uCr);
     1492    if (HMHasGuestSvmVmcbCached(pVCpu))
     1493        return HMIsGuestSvmWriteCRxInterceptSet(pVCpu, uCr);
     1494    return RT_BOOL(pVmcb->ctrl.u16InterceptWrCRx & (UINT16_C(1) << uCr));
    14951495}
    14961496
     
    15091509    if (!pVmcb)
    15101510        return false;
    1511     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1512         return RT_BOOL(pVmcb->ctrl.u16InterceptRdDRx & (UINT16_C(1) << uDr));
    1513     return HMIsGuestSvmReadDRxInterceptSet(pVCpu, pCtx, uDr);
     1511    if (HMHasGuestSvmVmcbCached(pVCpu))
     1512        return HMIsGuestSvmReadDRxInterceptSet(pVCpu, uDr);
     1513    return RT_BOOL(pVmcb->ctrl.u16InterceptRdDRx & (UINT16_C(1) << uDr));
    15141514}
    15151515
     
    15281528    if (!pVmcb)
    15291529        return false;
    1530     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1531         return RT_BOOL(pVmcb->ctrl.u16InterceptWrDRx & (UINT16_C(1) << uDr));
    1532     return HMIsGuestSvmWriteDRxInterceptSet(pVCpu, pCtx, uDr);
     1530    if (HMHasGuestSvmVmcbCached(pVCpu))
     1531        return HMIsGuestSvmWriteDRxInterceptSet(pVCpu, uDr);
     1532    return RT_BOOL(pVmcb->ctrl.u16InterceptWrDRx & (UINT16_C(1) << uDr));
    15331533}
    15341534
     
    15471547    if (!pVmcb)
    15481548        return false;
    1549     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1550         return RT_BOOL(pVmcb->ctrl.u32InterceptXcpt & (UINT32_C(1) << uVector));
    1551     return HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, uVector);
     1549    if (HMHasGuestSvmVmcbCached(pVCpu))
     1550        return HMIsGuestSvmXcptInterceptSet(pVCpu, uVector);
     1551    return RT_BOOL(pVmcb->ctrl.u32InterceptXcpt & (UINT32_C(1) << uVector));
    15521552}
    15531553
     
    15641564{
    15651565    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1566     Assert(pVmcb);
    1567     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1568         return pVmcb->ctrl.IntCtrl.n.u1VIntrMasking;
    1569     return HMIsGuestSvmVirtIntrMasking(pVCpu, pCtx);
     1566    if (!pVmcb)
     1567        return false;
     1568    if (HMHasGuestSvmVmcbCached(pVCpu))
     1569        return HMIsGuestSvmVirtIntrMasking(pVCpu);
     1570    return pVmcb->ctrl.IntCtrl.n.u1VIntrMasking;
    15701571}
    15711572
     
    15821583{
    15831584    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1584     Assert(pVmcb);
    1585     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1586         return pVmcb->ctrl.NestedPagingCtrl.n.u1NestedPaging;
    1587     return HMIsGuestSvmNestedPagingEnabled(pVCpu, pCtx);
     1585    if (!pVmcb)
     1586        return false;
     1587    if (HMHasGuestSvmVmcbCached(pVCpu))
     1588        return HMIsGuestSvmNestedPagingEnabled(pVCpu);
     1589    return pVmcb->ctrl.NestedPagingCtrl.n.u1NestedPaging;
    15881590}
    15891591
     
    16001602{
    16011603    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1602     Assert(pVmcb);
    1603     if (!pCtx->hwvirt.svm.fHMCachedVmcb)
    1604         return pVmcb->ctrl.u16PauseFilterCount;
    1605     return HMGetGuestSvmPauseFilterCount(pVCpu, pCtx);
     1604    if (!pVmcb)
     1605        return false;
     1606    if (HMHasGuestSvmVmcbCached(pVCpu))
     1607        return HMGetGuestSvmPauseFilterCount(pVCpu);
     1608    return pVmcb->ctrl.u16PauseFilterCount;
    16061609}
    16071610
  • trunk/include/VBox/vmm/cpum.mac

    r71833 r72643  
    270270    .hwvirt.svm.cPauseFilterThreshold  resw          1
    271271    .hwvirt.svm.fInterceptEvents       resb          1
    272     .hwvirt.svm.fHMCachedVmcb          resb          1
    273272    alignb 8
    274273    .hwvirt.svm.pvMsrBitmapR0          RTR0PTR_RES   1
  • trunk/include/VBox/vmm/cpumctx.h

    r72510 r72643  
    511511                /** 0x3c4 - Whether the injected event is subject to event intercepts. */
    512512                bool                fInterceptEvents;
    513                 /** 0x3c5 - Whether parts of the VMCB are cached (and potentially modified) by HM. */
    514                 bool                fHMCachedVmcb;
    515                 /** 0x3c6 - Padding. */
    516                 bool                afPadding[2];
     513                /** 0x3c5 - Padding. */
     514                bool                afPadding[3];
    517515                /** 0x3c8 - MSR permission bitmap - R0 ptr. */
    518516                R0PTRTYPE(void *)   pvMsrBitmapR0;
     
    764762
    765763/** @name CPUMCTX_EXTRN_XXX
    766  * Used to parts of the CPUM state that is externalized and needs fetching
     764 * Used for parts of the CPUM state that is externalized and needs fetching
    767765 * before use.
    768766 *
     
    893891                                                 | CPUMCTX_EXTRN_SYSENTER_MSRS | CPUMCTX_EXTRN_TSC_AUX | CPUMCTX_EXTRN_OTHER_MSRS)
    894892
     893/** Hardware-virtualization (SVM or VMX) state is kept externally. */
     894#define CPUMCTX_EXTRN_HWVIRT                    UINT64_C(0x0000020000000000)
     895
    895896/** Mask of bits the keepers can use for state tracking. */
    896897#define CPUMCTX_EXTRN_KEEPER_STATE_MASK         UINT64_C(0xffff000000000000)
     
    905906#define CPUMCTX_EXTRN_NEM_WIN_MASK              UINT64_C(0x0007000000000000)
    906907
     908/** HM/SVM: Inhibit maskable interrupts (VMCPU_FF_INHIBIT_INTERRUPTS). */
     909#define CPUMCTX_EXTRN_HM_SVM_INT_SHADOW         UINT64_C(0x0001000000000000)
     910/** HM/SVM: Nested-guest interrupt pending (VMCPU_FF_INTERRUPT_NESTED_GUEST). */
     911#define CPUMCTX_EXTRN_HM_SVM_HWVIRT_VIRQ        UINT64_C(0x0002000000000000)
     912/** HM/SVM: Mask. */
     913#define CPUMCTX_EXTRN_HM_SVM_MASK               UINT64_C(0x0003000000000000)
     914
     915/** HM/VMX: Guest-interruptibility state (VMCPU_FF_INHIBIT_INTERRUPTS,
     916 *  VMCPU_FF_BLOCK_NMIS). */
     917#define CPUMCTX_EXTRN_HM_VMX_INT_STATE          UINT64_C(0x0001000000000000)
     918/** HM/VMX: Mask. */
     919#define CPUMCTX_EXTRN_HM_VMX_MASK               UINT64_C(0x0001000000000000)
     920
    907921/** All CPUM state bits, not including keeper specific ones. */
    908 #define CPUMCTX_EXTRN_ALL                       UINT64_C(0x000001fffffffffc)
     922#define CPUMCTX_EXTRN_ALL                       UINT64_C(0x000003fffffffffc)
    909923/** @} */
    910924
  • trunk/include/VBox/vmm/hm.h

    r72599 r72643  
    216216VMMR0_INT_DECL(void)            HMR0NotifyCpumModifiedHostCr0(PVMCPU VCpu);
    217217VMMR0_INT_DECL(bool)            HMR0SuspendPending(void);
     218VMMR0_INT_DECL(int)             HMR0InvalidatePage(PVMCPU pVCpu, RTGCPTR GCVirt);
     219VMMR0_INT_DECL(int)             HMR0ImportStateOnDemand(PVMCPU pVCpu, PCPUMCTX pCtx, uint64_t fWhat);
    218220
    219221# if HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS)
  • trunk/include/VBox/vmm/hm_svm.h

    r72065 r72643  
    10671067    /** Cache of the LBR virtualization bit. */
    10681068    bool                fLbrVirt;
     1069    /** Whether the VMCB is cached by HM.  */
     1070    bool                fCacheValid;
    10691071    /** Alignment. */
    1070     bool                afPadding0[5];
     1072    bool                afPadding0[4];
    10711073} SVMNESTEDVMCBCACHE;
    10721074#pragma pack()
     
    10761078typedef const SVMNESTEDVMCBCACHE *PCSVMNESTEDVMCBCACHE;
    10771079AssertCompileSizeAlignment(SVMNESTEDVMCBCACHE, 8);
    1078 
    1079 #ifdef IN_RING0
    1080 VMMR0DECL(int) SVMR0InvalidatePage(PVM pVM, PVMCPU pVCpu, RTGCPTR GCVirt);
    1081 #endif /* IN_RING0 */
    10821080
    10831081/**
     
    11401138 * Don't add any more functions here unless there is no other option.
    11411139 */
    1142 VMM_INT_DECL(bool)     HMIsGuestSvmCtrlInterceptSet(PVMCPU pVCpu, PCPUMCTX pCtx, uint64_t fIntercept);
    1143 VMM_INT_DECL(bool)     HMIsGuestSvmReadCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr);
    1144 VMM_INT_DECL(bool)     HMIsGuestSvmWriteCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr);
    1145 VMM_INT_DECL(bool)     HMIsGuestSvmReadDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr);
    1146 VMM_INT_DECL(bool)     HMIsGuestSvmWriteDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr);
    1147 VMM_INT_DECL(bool)     HMIsGuestSvmXcptInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uVector);
    1148 VMM_INT_DECL(bool)     HMIsGuestSvmVirtIntrMasking(PVMCPU pVCpu, PCCPUMCTX pCtx);
    1149 VMM_INT_DECL(bool)     HMIsGuestSvmNestedPagingEnabled(PVMCPU pVCpu, PCCPUMCTX pCtx);
    1150 VMM_INT_DECL(uint16_t) HMGetGuestSvmPauseFilterCount(PVMCPU pVCpu, PCCPUMCTX pCtx);
     1140VMM_INT_DECL(bool)     HMHasGuestSvmVmcbCached(PVMCPU pVCpu);
     1141VMM_INT_DECL(bool)     HMIsGuestSvmCtrlInterceptSet(PVMCPU pVCpu, uint64_t fIntercept);
     1142VMM_INT_DECL(bool)     HMIsGuestSvmReadCRxInterceptSet(PVMCPU pVCpu, uint8_t uCr);
     1143VMM_INT_DECL(bool)     HMIsGuestSvmWriteCRxInterceptSet(PVMCPU pVCpu, uint8_t uCr);
     1144VMM_INT_DECL(bool)     HMIsGuestSvmReadDRxInterceptSet(PVMCPU pVCpu, uint8_t uDr);
     1145VMM_INT_DECL(bool)     HMIsGuestSvmWriteDRxInterceptSet(PVMCPU pVCpu, uint8_t uDr);
     1146VMM_INT_DECL(bool)     HMIsGuestSvmXcptInterceptSet(PVMCPU pVCpu, uint8_t uVector);
     1147VMM_INT_DECL(bool)     HMIsGuestSvmVirtIntrMasking(PVMCPU pVCpu);
     1148VMM_INT_DECL(bool)     HMIsGuestSvmNestedPagingEnabled(PVMCPU pVCpu);
     1149VMM_INT_DECL(uint16_t) HMGetGuestSvmPauseFilterCount(PVMCPU pVCpu);
     1150
    11511151/** @} */
    11521152
  • trunk/include/VBox/vmm/hm_vmx.h

    r69107 r72643  
    25352535}
    25362536
    2537 #ifdef IN_RING0
    2538 VMMR0DECL(int) VMXR0InvalidatePage(PVM pVM, PVMCPU pVCpu, RTGCPTR GCVirt);
    2539 VMMR0DECL(int) VMXR0InvalidatePhysPage(PVM pVM, PVMCPU pVCpu, RTGCPHYS GCPhys);
    2540 #endif /* IN_RING0 */
    2541 
    25422537/** @} */
    25432538
  • trunk/include/VBox/vmm/iem.h

    r72592 r72643  
    218218                                                    | CPUMCTX_EXTRN_DR7 /* for memory breakpoints */ )
    219219
     220#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
     221/** The CPUMCTX_EXTRN_XXX mask needed when calling IEMExecSvmVmexit().
     222 * IEM will ASSUME the caller has ensured these are already present. */
     223# define IEM_CPUMCTX_EXTRN_SVM_VMEXIT_MASK   (  CPUMCTX_EXTRN_RSP \
     224                                              | CPUMCTX_EXTRN_RAX \
     225                                              | CPUMCTX_EXTRN_RIP \
     226                                              | CPUMCTX_EXTRN_RFLAGS \
     227                                              | CPUMCTX_EXTRN_CS \
     228                                              | CPUMCTX_EXTRN_SS \
     229                                              | CPUMCTX_EXTRN_DS \
     230                                              | CPUMCTX_EXTRN_ES \
     231                                              | CPUMCTX_EXTRN_GDTR \
     232                                              | CPUMCTX_EXTRN_IDTR \
     233                                              | CPUMCTX_EXTRN_CR_MASK \
     234                                              | CPUMCTX_EXTRN_EFER \
     235                                              | CPUMCTX_EXTRN_DR6 \
     236                                              | CPUMCTX_EXTRN_DR7 \
     237                                              | CPUMCTX_EXTRN_OTHER_MSRS \
     238                                              | CPUMCTX_EXTRN_HWVIRT)
     239#endif
    220240
    221241VMMDECL(VBOXSTRICTRC)       IEMExecOne(PVMCPU pVCpu);
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