VirtualBox

Ignore:
Timestamp:
Dec 8, 2017 5:57:18 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119524
Message:

VMM: Nested Hw.virt: Make SVM intercept functions smarter. Avoids swapping of modified VMCB state in a lot of
tricky to detect situations and makes it a lot cleaner that the VMCB is only finally restored before the
#VMEXIT is done.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r69975 r70000  
    2121*********************************************************************************************************************************/
    2222#define LOG_GROUP LOG_GROUP_HM
     23#define VMCPU_INCL_CPUM_GST_CTX
    2324#include <iprt/asm-amd64-x86.h>
    2425#include <iprt/thread.h>
     
    21982199static void hmR0SvmVmRunSetupVmcb(PVMCPU pVCpu, PCPUMCTX pCtx)
    21992200{
    2200     RT_NOREF(pVCpu);
    22012201    PSVMVMCB     pVmcbNstGst     = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    22022202    PSVMVMCBCTRL pVmcbNstGstCtrl = &pVmcbNstGst->ctrl;
     
    22532253    Assert(pVmcbNstGst);
    22542254
     2255    hmR0SvmVmRunSetupVmcb(pVCpu, pCtx);
    22552256    hmR0SvmLoadGuestSegmentRegs(pVCpu, pVmcbNstGst, pCtx);
    22562257    hmR0SvmLoadGuestMsrs(pVCpu, pVmcbNstGst, pCtx);
     
    27092710        HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
    27102711
    2711 #ifdef VBOX_WITH_NESTED_HWVIRT
    2712     /*
    2713      * We may inspect the nested-guest VMCB state in ring-3 (e.g. for injecting interrupts)
    2714      * and thus we need to restore any modifications we may have made to it here if we're
    2715      * still executing the nested-guest.
    2716      */
    2717     if (CPUMIsGuestInSvmNestedHwVirtMode(pCtx))
    2718         HMSvmNstGstVmExitNotify(pVCpu, pCtx);
    2719 #endif
    2720 
    27212712    STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchExitToR3);
    27222713
     
    31703161
    31713162#ifdef VBOX_WITH_NESTED_HWVIRT
    3172 /**
    3173  * Checks whether the SVM nested-guest is in a state to receive physical (APIC)
    3174  * interrupts.
    3175  *
    3176  * @returns true if it's ready, false otherwise.
    3177  * @param   pCtx        The guest-CPU context.
    3178  *
    3179  * @remarks This function looks at the VMCB cache rather than directly at the
    3180  *          nested-guest VMCB which may have been suitably modified for executing
    3181  *          using hardware-assisted SVM.
    3182  *
    3183  * @sa      CPUMCanSvmNstGstTakePhysIntr.
    3184  */
    3185 static bool hmR0SvmCanNstGstTakePhysIntr(PVMCPU pVCpu, PCCPUMCTX pCtx)
    3186 {
    3187     Assert(pCtx->hwvirt.svm.fHMCachedVmcb);
    3188     PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
    3189     X86EFLAGS fEFlags;
    3190     if (pVmcbNstGstCache->fVIntrMasking)
    3191         fEFlags.u = pCtx->hwvirt.svm.HostState.rflags.u;
    3192     else
    3193         fEFlags.u = pCtx->eflags.u;
    3194 
    3195     return fEFlags.Bits.u1IF;
    3196 }
    31973163
    31983164
     
    32653231         */
    32663232        PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
    3267         Assert(pCtx->hwvirt.svm.fHMCachedVmcb);
    32683233        if (   VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
    32693234            && !fIntShadow
    32703235            && !pVCpu->hm.s.fSingleInstruction
    3271             && hmR0SvmCanNstGstTakePhysIntr(pVCpu, pCtx))
     3236            && CPUMCanSvmNstGstTakePhysIntr(pVCpu, pCtx))
    32723237        {
    32733238            if (pVmcbNstGstCache->u64InterceptCtrl & SVM_CTRL_INTERCEPT_INTR)
     
    37533718        return rc;
    37543719
    3755     hmR0SvmVmRunSetupVmcb(pVCpu, pCtx);
    3756 
    37573720    if (TRPMHasTrap(pVCpu))
    37583721        hmR0SvmTrpmTrapToPendingEvent(pVCpu);
     
    37813744    rc = hmR0SvmLoadGuestStateNested(pVCpu, pCtx);
    37823745    AssertRCReturn(rc, rc);
    3783     /** @todo Get new STAM counter for this? */
    3784     STAM_COUNTER_INC(&pVCpu->hm.s.StatLoadFull);
    3785 
     3746    STAM_COUNTER_INC(&pVCpu->hm.s.StatLoadFull);    /** @todo Get new STAM counter for this? */
     3747
     3748    /* Ensure we've cached (and hopefully modified) the VMCB for execution using hardware SVM. */
    37863749    Assert(pCtx->hwvirt.svm.fHMCachedVmcb);
    37873750
     
    43114274    hmR0SvmSaveGuestState(pVCpu, pMixedCtx, pVmcbNstGst);       /* Save the nested-guest state from the VMCB to the
    43124275                                                                   guest-CPU context. */
    4313 
    4314     HMSvmNstGstVmExitNotify(pVCpu, pMixedCtx);                  /* Restore modified VMCB fields for now, see @bugref{7243#c52} .*/
    43154276}
    43164277#endif
     
    47524713#define HM_SVM_VMEXIT_NESTED(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2) \
    47534714            VBOXSTRICTRC_TODO(IEMExecSvmVmexit(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2))
    4754 #define HM_SVM_IS_CTRL_INTERCEPT_SET(a_pCtx, a_Intercept)       CPUMIsGuestSvmCtrlInterceptSet(a_pCtx, (a_Intercept))
    4755 #define HM_SVM_IS_XCPT_INTERCEPT_SET(a_pCtx, a_Xcpt)            CPUMIsGuestSvmXcptInterceptSet(a_pCtx, (a_Xcpt))
    4756 #define HM_SVM_IS_READ_CR_INTERCEPT_SET(a_pCtx, a_uCr)          CPUMIsGuestSvmReadCRxInterceptSet(a_pCtx, (a_uCr))
    4757 #define HM_SVM_IS_READ_DR_INTERCEPT_SET(a_pCtx, a_uDr)          CPUMIsGuestSvmReadDRxInterceptSet(a_pCtx, (a_uDr))
    4758 #define HM_SVM_IS_WRITE_CR_INTERCEPT_SET(a_pCtx, a_uCr)         CPUMIsGuestSvmWriteCRxInterceptSet(a_pCtx, (a_uCr))
    4759 #define HM_SVM_IS_WRITE_DR_INTERCEPT_SET(a_pCtx, a_uDr)         CPUMIsGuestSvmWriteDRxInterceptSet(a_pCtx, (a_uDr))
    47604715
    47614716    /*
     
    47744729        case SVM_EXIT_CPUID:
    47754730        {
    4776             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_CPUID))
     4731            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_CPUID))
    47774732                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    47784733            return hmR0SvmExitCpuid(pVCpu, pCtx, pSvmTransient);
     
    47814736        case SVM_EXIT_RDTSC:
    47824737        {
    4783             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_RDTSC))
     4738            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_RDTSC))
    47844739                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    47854740            return hmR0SvmExitRdtsc(pVCpu, pCtx, pSvmTransient);
     
    47884743        case SVM_EXIT_RDTSCP:
    47894744        {
    4790             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_RDTSCP))
     4745            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_RDTSCP))
    47914746                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    47924747            return hmR0SvmExitRdtscp(pVCpu, pCtx, pSvmTransient);
     
    47964751        case SVM_EXIT_MONITOR:
    47974752        {
    4798             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_MONITOR))
     4753            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_MONITOR))
    47994754                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    48004755            return hmR0SvmExitMonitor(pVCpu, pCtx, pSvmTransient);
     
    48034758        case SVM_EXIT_MWAIT:
    48044759        {
    4805             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_MWAIT))
     4760            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_MWAIT))
    48064761                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    48074762            return hmR0SvmExitMwait(pVCpu, pCtx, pSvmTransient);
     
    48104765        case SVM_EXIT_HLT:
    48114766        {
    4812             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_HLT))
     4767            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_HLT))
    48134768                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    48144769            return hmR0SvmExitHlt(pVCpu, pCtx, pSvmTransient);
     
    48174772        case SVM_EXIT_MSR:
    48184773        {
    4819             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_MSR_PROT))
     4774            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_MSR_PROT))
    48204775            {
    48214776                uint32_t const idMsr = pCtx->ecx;
     
    48534808             * Figure out if the IO port access is intercepted by the nested-guest.
    48544809             */
    4855             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_IOIO_PROT))
     4810            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_IOIO_PROT))
    48564811            {
    48574812                void *pvIoBitmap = pCtx->hwvirt.svm.CTX_SUFF(pvIoBitmap);
     
    48744829
    48754830                /* If the nested-guest is intercepting #PFs, cause a #PF #VMEXIT. */
    4876                 if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_PF))
     4831                if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_PF))
    48774832                    return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, u32ErrCode, uFaultAddress);
    48784833
     
    48864841        case SVM_EXIT_EXCEPTION_7:   /* X86_XCPT_NM */
    48874842        {
    4888             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_NM))
     4843            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_NM))
    48894844                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    48904845            hmR0SvmSetPendingXcptNM(pVCpu);
     
    48944849        case SVM_EXIT_EXCEPTION_6:   /* X86_XCPT_UD */
    48954850        {
    4896             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_UD))
     4851            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_UD))
    48974852                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    48984853            hmR0SvmSetPendingXcptUD(pVCpu);
     
    49024857        case SVM_EXIT_EXCEPTION_16:  /* X86_XCPT_MF */
    49034858        {
    4904             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_MF))
     4859            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_MF))
    49054860                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49064861            hmR0SvmSetPendingXcptMF(pVCpu);
     
    49104865        case SVM_EXIT_EXCEPTION_1:   /* X86_XCPT_DB */
    49114866        {
    4912             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_DB))
     4867            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_DB))
    49134868                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49144869            return hmR0SvmNestedExitXcptDB(pVCpu, pCtx, pSvmTransient);
     
    49174872        case SVM_EXIT_EXCEPTION_17:  /* X86_XCPT_AC */
    49184873        {
    4919             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_AC))
     4874            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_AC))
    49204875                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49214876            return hmR0SvmExitXcptAC(pVCpu, pCtx, pSvmTransient);
     
    49244879        case SVM_EXIT_EXCEPTION_3:   /* X86_XCPT_BP */
    49254880        {
    4926             if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, X86_XCPT_BP))
     4881            if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, X86_XCPT_BP))
    49274882                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49284883            return hmR0SvmNestedExitXcptBP(pVCpu, pCtx, pSvmTransient);
     
    49334888        case SVM_EXIT_READ_CR4:
    49344889        {
    4935             if (HM_SVM_IS_READ_CR_INTERCEPT_SET(pCtx, (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_READ_CR0))))
     4890            uint8_t const uCr = uExitCode - SVM_EXIT_READ_CR0;
     4891            if (HMIsGuestSvmReadCRxInterceptSet(pVCpu, pCtx, uCr))
    49364892                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49374893            return hmR0SvmExitReadCRx(pVCpu, pCtx, pSvmTransient);
     
    49434899        case SVM_EXIT_WRITE_CR8:   /** @todo Shouldn't writes to CR8 go to V_TPR instead since we run with V_INTR_MASKING set?? */
    49444900        {
     4901            uint8_t const uCr = uExitCode - SVM_EXIT_WRITE_CR0;
    49454902            Log4(("hmR0SvmHandleExitNested: Write CRx: u16InterceptWrCRx=%#x u64ExitCode=%#RX64 %#x\n",
    4946                   pVmcbNstGstCtrl->u16InterceptWrCRx, pSvmTransient->u64ExitCode,
    4947                   (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_WRITE_CR0))));
    4948 
    4949             if (HM_SVM_IS_WRITE_CR_INTERCEPT_SET(pCtx, (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_WRITE_CR0))))
     4903                  pVmcbNstGstCtrl->u16InterceptWrCRx, pSvmTransient->u64ExitCode, uCr));
     4904
     4905            if (HMIsGuestSvmWriteCRxInterceptSet(pVCpu, pCtx, uCr))
    49504906                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49514907            return hmR0SvmExitWriteCRx(pVCpu, pCtx, pSvmTransient);
     
    49544910        case SVM_EXIT_PAUSE:
    49554911        {
    4956             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_PAUSE))
     4912            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_PAUSE))
    49574913                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49584914            return hmR0SvmExitPause(pVCpu, pCtx, pSvmTransient);
     
    49614917        case SVM_EXIT_VINTR:
    49624918        {
    4963             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_VINTR))
     4919            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VINTR))
    49644920                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49654921            return hmR0SvmExitUnexpected(pVCpu, pCtx, pSvmTransient);
     
    49744930        case SVM_EXIT_FERR_FREEZE:
    49754931        {
    4976             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_FERR_FREEZE))
     4932            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_FERR_FREEZE))
    49774933                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49784934            return hmR0SvmExitIntr(pVCpu, pCtx, pSvmTransient);
     
    49814937        case SVM_EXIT_NMI:
    49824938        {
    4983             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_NMI))
     4939            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_NMI))
    49844940                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49854941            return hmR0SvmExitIntr(pVCpu, pCtx, pSvmTransient);
     
    49884944        case SVM_EXIT_INVLPG:
    49894945        {
    4990             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_INVLPG))
     4946            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_INVLPG))
    49914947                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49924948            return hmR0SvmExitInvlpg(pVCpu, pCtx, pSvmTransient);
     
    49954951        case SVM_EXIT_WBINVD:
    49964952        {
    4997             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_WBINVD))
     4953            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_WBINVD))
    49984954                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    49994955            return hmR0SvmExitWbinvd(pVCpu, pCtx, pSvmTransient);
     
    50024958        case SVM_EXIT_INVD:
    50034959        {
    5004             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_INVD))
     4960            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_INVD))
    50054961                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50064962            return hmR0SvmExitInvd(pVCpu, pCtx, pSvmTransient);
     
    50094965        case SVM_EXIT_RDPMC:
    50104966        {
    5011             if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_RDPMC))
     4967            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_RDPMC))
    50124968                return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50134969            return hmR0SvmExitRdpmc(pVCpu, pCtx, pSvmTransient);
     
    50234979                case SVM_EXIT_READ_DR14:    case SVM_EXIT_READ_DR15:
    50244980                {
    5025                     if (HM_SVM_IS_READ_DR_INTERCEPT_SET(pCtx, (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_READ_DR0))))
     4981                    uint8_t const uDr = uExitCode - SVM_EXIT_READ_DR0;
     4982                    if (HMIsGuestSvmReadDRxInterceptSet(pVCpu, pCtx, uDr))
    50264983                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50274984                    return hmR0SvmExitReadDRx(pVCpu, pCtx, pSvmTransient);
     
    50334990                case SVM_EXIT_WRITE_DR14:   case SVM_EXIT_WRITE_DR15:
    50344991                {
    5035                     if (HM_SVM_IS_WRITE_DR_INTERCEPT_SET(pCtx, (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_WRITE_DR0))))
     4992                    uint8_t const uDr = uExitCode - SVM_EXIT_WRITE_DR0;
     4993                    if (HMIsGuestSvmWriteDRxInterceptSet(pVCpu, pCtx, uDr))
    50364994                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50374995                    return hmR0SvmExitWriteDRx(pVCpu, pCtx, pSvmTransient);
     
    50515009                case SVM_EXIT_EXCEPTION_30:      case SVM_EXIT_EXCEPTION_31:
    50525010                {
    5053                     if (HM_SVM_IS_XCPT_INTERCEPT_SET(pCtx, (uint32_t)(pSvmTransient->u64ExitCode - SVM_EXIT_EXCEPTION_0)))
     5011                    uint8_t const uVector = uExitCode - SVM_EXIT_EXCEPTION_0;
     5012                    if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, uVector))
    50545013                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50555014                    /** @todo Write hmR0SvmExitXcptGeneric! */
     
    50595018                case SVM_EXIT_XSETBV:
    50605019                {
    5061                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_XSETBV))
     5020                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_XSETBV))
    50625021                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50635022                    return hmR0SvmExitXsetbv(pVCpu, pCtx, pSvmTransient);
     
    50665025                case SVM_EXIT_TASK_SWITCH:
    50675026                {
    5068                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_TASK_SWITCH))
     5027                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_TASK_SWITCH))
    50695028                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50705029                    return hmR0SvmExitTaskSwitch(pVCpu, pCtx, pSvmTransient);
     
    50735032                case SVM_EXIT_IRET:
    50745033                {
    5075                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_IRET))
     5034                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_IRET))
    50765035                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50775036                    return hmR0SvmExitIret(pVCpu, pCtx, pSvmTransient);
     
    50805039                case SVM_EXIT_SHUTDOWN:
    50815040                {
    5082                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_SHUTDOWN))
     5041                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_SHUTDOWN))
    50835042                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50845043                    return hmR0SvmExitShutdown(pVCpu, pCtx, pSvmTransient);
     
    50875046                case SVM_EXIT_SMI:
    50885047                {
    5089                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_SMI))
     5048                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_SMI))
    50905049                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50915050                    return hmR0SvmExitUnexpected(pVCpu, pCtx, pSvmTransient);
     
    50945053                case SVM_EXIT_INIT:
    50955054                {
    5096                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_INIT))
     5055                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_INIT))
    50975056                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    50985057                    return hmR0SvmExitUnexpected(pVCpu, pCtx, pSvmTransient);
     
    51015060                case SVM_EXIT_VMMCALL:
    51025061                {
    5103                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_VMMCALL))
     5062                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VMMCALL))
    51045063                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51055064                    return hmR0SvmExitVmmCall(pVCpu, pCtx, pSvmTransient);
     
    51085067                case SVM_EXIT_CLGI:
    51095068                {
    5110                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_CLGI))
     5069                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_CLGI))
    51115070                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51125071                     return hmR0SvmExitClgi(pVCpu, pCtx, pSvmTransient);
     
    51155074                case SVM_EXIT_STGI:
    51165075                {
    5117                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_STGI))
     5076                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_STGI))
    51185077                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51195078                     return hmR0SvmExitStgi(pVCpu, pCtx, pSvmTransient);
     
    51225081                case SVM_EXIT_VMLOAD:
    51235082                {
    5124                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_VMLOAD))
     5083                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VMLOAD))
    51255084                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51265085                    return hmR0SvmExitVmload(pVCpu, pCtx, pSvmTransient);
     
    51295088                case SVM_EXIT_VMSAVE:
    51305089                {
    5131                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_VMSAVE))
     5090                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VMSAVE))
    51325091                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51335092                    return hmR0SvmExitVmsave(pVCpu, pCtx, pSvmTransient);
     
    51365095                case SVM_EXIT_INVLPGA:
    51375096                {
    5138                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_INVLPGA))
     5097                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_INVLPGA))
    51395098                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51405099                    return hmR0SvmExitInvlpga(pVCpu, pCtx, pSvmTransient);
     
    51435102                case SVM_EXIT_VMRUN:
    51445103                {
    5145                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_VMRUN))
     5104                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VMRUN))
    51465105                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51475106                    return hmR0SvmExitVmrun(pVCpu, pCtx, pSvmTransient);
     
    51505109                case SVM_EXIT_RSM:
    51515110                {
    5152                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_RSM))
     5111                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_RSM))
    51535112                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51545113                    hmR0SvmSetPendingXcptUD(pVCpu);
     
    51585117                case SVM_EXIT_SKINIT:
    51595118                {
    5160                     if (HM_SVM_IS_CTRL_INTERCEPT_SET(pCtx, SVM_CTRL_INTERCEPT_SKINIT))
     5119                    if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_SKINIT))
    51615120                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    51625121                    hmR0SvmSetPendingXcptUD(pVCpu);
     
    51825141
    51835142#undef HM_SVM_VMEXIT_NESTED
    5184 #undef HM_SVM_IS_CTRL_INTERCEPT_SET
    5185 #undef HM_SVM_IS_XCPT_INTERCEPT_SET
    5186 #undef HM_SVM_IS_READ_CR_INTERCEPT_SET
    5187 #undef HM_SVM_IS_READ_DR_INTERCEPT_SET
    5188 #undef HM_SVM_IS_WRITE_CR_INTERCEPT_SET
    5189 #undef HM_SVM_IS_WRITE_DR_INTERCEPT_SET
    51905143}
    51915144#endif
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