VirtualBox

Changeset 70000 in vbox


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.

Location:
trunk
Files:
6 edited

Legend:

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

    r69764 r70000  
    12031203/** @name Nested Hardware-Virtualization Helpers.
    12041204 * @{  */
    1205 VMM_INT_DECL(bool)      CPUMCanSvmNstGstTakePhysIntr(PCCPUMCTX pCtx);
     1205VMM_INT_DECL(bool)      CPUMCanSvmNstGstTakePhysIntr(PVMCPU pVCpu, PCCPUMCTX pCtx);
    12061206VMM_INT_DECL(bool)      CPUMCanSvmNstGstTakeVirtIntr(PCCPUMCTX pCtx);
    12071207VMM_INT_DECL(uint8_t)   CPUMGetSvmNstGstInterrupt(PCCPUMCTX pCtx);
     
    13271327 *
    13281328 * @returns @c true if in intercept is set, @c false otherwise.
    1329  * @param   pCtx          Pointer to the context.
    1330  * @param   fIntercept    The SVM control/instruction intercept,
    1331  *                        see SVM_CTRL_INTERCEPT_*.
    1332  */
    1333 DECLINLINE(bool) CPUMIsGuestSvmCtrlInterceptSet(PCCPUMCTX pCtx, uint64_t fIntercept)
    1334 {
    1335     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1329 * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
     1330 * @param   pCtx        Pointer to the context.
     1331 * @param   fIntercept  The SVM control/instruction intercept, see
     1332 *                      SVM_CTRL_INTERCEPT_*.
     1333 */
     1334DECLINLINE(bool) CPUMIsGuestSvmCtrlInterceptSet(PVMCPU pVCpu, PCPUMCTX pCtx, uint64_t fIntercept)
     1335{
    13361336    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1337     return pVmcb && (pVmcb->ctrl.u64InterceptCtrl & fIntercept);
     1337    if (!pVmcb)
     1338        return false;
     1339    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1340        return RT_BOOL(pVmcb->ctrl.u64InterceptCtrl & fIntercept);
     1341    return HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, fIntercept);
    13381342}
    13391343
    13401344/**
    1341  * Checks if the guest VMCB has the specified CR read intercept
    1342  * active.
     1345 * Checks if the guest VMCB has the specified CR read intercept active.
    13431346 *
    13441347 * @returns @c true if in intercept is set, @c false otherwise.
    1345  * @param   pCtx          Pointer to the context.
    1346  * @param   uCr           The CR register number (0 to 15).
    1347  */
    1348 DECLINLINE(bool) CPUMIsGuestSvmReadCRxInterceptSet(PCCPUMCTX pCtx, uint8_t uCr)
    1349 {
    1350     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1348 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     1349 * @param   pCtx    Pointer to the context.
     1350 * @param   uCr     The CR register number (0 to 15).
     1351 */
     1352DECLINLINE(bool) CPUMIsGuestSvmReadCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr)
     1353{
     1354    Assert(uCr < 16);
    13511355    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1352     return pVmcb && (pVmcb->ctrl.u16InterceptRdCRx & (1 << uCr));
     1356    if (!pVmcb)
     1357        return false;
     1358    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1359        return RT_BOOL(pVmcb->ctrl.u16InterceptRdCRx & (UINT16_C(1) << uCr));
     1360    return HMIsGuestSvmReadCRxInterceptSet(pVCpu, pCtx, uCr);
    13531361}
    13541362
    13551363/**
    1356  * Checks if the guest VMCB has the specified CR write intercept
    1357  * active.
     1364 * Checks if the guest VMCB has the specified CR write intercept active.
    13581365 *
    13591366 * @returns @c true if in intercept is set, @c false otherwise.
    1360  * @param   pCtx          Pointer to the context.
    1361  * @param   uCr           The CR register number (0 to 15).
    1362  */
    1363 DECLINLINE(bool) CPUMIsGuestSvmWriteCRxInterceptSet(PCCPUMCTX pCtx, uint8_t uCr)
    1364 {
    1365     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1367 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     1368 * @param   pCtx    Pointer to the context.
     1369 * @param   uCr     The CR register number (0 to 15).
     1370 */
     1371DECLINLINE(bool) CPUMIsGuestSvmWriteCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr)
     1372{
     1373    Assert(uCr < 16);
    13661374    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1367     return pVmcb && (pVmcb->ctrl.u16InterceptWrCRx & (1 << uCr));
     1375    if (!pVmcb)
     1376        return false;
     1377    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1378        return RT_BOOL(pVmcb->ctrl.u16InterceptWrCRx & (UINT16_C(1) << uCr));
     1379    return HMIsGuestSvmWriteCRxInterceptSet(pVCpu, pCtx, uCr);
    13681380}
    13691381
    13701382/**
    1371  * Checks if the guest VMCB has the specified DR read intercept
    1372  * active.
     1383 * Checks if the guest VMCB has the specified DR read intercept active.
    13731384 *
    13741385 * @returns @c true if in intercept is set, @c false otherwise.
     1386 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
    13751387 * @param   pCtx    Pointer to the context.
    13761388 * @param   uDr     The DR register number (0 to 15).
    13771389 */
    1378 DECLINLINE(bool) CPUMIsGuestSvmReadDRxInterceptSet(PCCPUMCTX pCtx, uint8_t uDr)
    1379 {
    1380     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1390DECLINLINE(bool) CPUMIsGuestSvmReadDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr)
     1391{
     1392    Assert(uDr < 16);
    13811393    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1382     return pVmcb && (pVmcb->ctrl.u16InterceptRdDRx & (1 << uDr));
     1394    if (!pVmcb)
     1395        return false;
     1396    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1397        return RT_BOOL(pVmcb->ctrl.u16InterceptRdDRx & (UINT16_C(1) << uDr));
     1398    return HMIsGuestSvmReadDRxInterceptSet(pVCpu, pCtx, uDr);
    13831399}
    13841400
    13851401/**
    1386  * Checks if the guest VMCB has the specified DR write intercept
    1387  * active.
     1402 * Checks if the guest VMCB has the specified DR write intercept active.
    13881403 *
    13891404 * @returns @c true if in intercept is set, @c false otherwise.
     1405 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
    13901406 * @param   pCtx    Pointer to the context.
    13911407 * @param   uDr     The DR register number (0 to 15).
    13921408 */
    1393 DECLINLINE(bool) CPUMIsGuestSvmWriteDRxInterceptSet(PCCPUMCTX pCtx, uint8_t uDr)
    1394 {
    1395     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1409DECLINLINE(bool) CPUMIsGuestSvmWriteDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr)
     1410{
     1411    Assert(uDr < 16);
    13961412    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1397     return pVmcb && (pVmcb->ctrl.u16InterceptWrDRx & (1 << uDr));
     1413    if (!pVmcb)
     1414        return false;
     1415    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1416        return RT_BOOL(pVmcb->ctrl.u16InterceptWrDRx & (UINT16_C(1) << uDr));
     1417    return HMIsGuestSvmWriteDRxInterceptSet(pVCpu, pCtx, uDr);
    13981418}
    13991419
    14001420/**
    1401  * Checks if the guest VMCB has the specified exception
    1402  * intercept active.
    1403  *
    1404  * @returns true if in intercept is active, false otherwise.
     1421 * Checks if the guest VMCB has the specified exception intercept active.
     1422 *
     1423 * @returns @c true if in intercept is active, @c false otherwise.
     1424 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
    14051425 * @param   pCtx        Pointer to the context.
    14061426 * @param   uVector     The exception / interrupt vector.
    14071427 */
    1408 DECLINLINE(bool) CPUMIsGuestSvmXcptInterceptSet(PCCPUMCTX pCtx, uint8_t uVector)
    1409 {
    1410     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
     1428DECLINLINE(bool) CPUMIsGuestSvmXcptInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uVector)
     1429{
    14111430    Assert(uVector < 32);
    14121431    PCSVMVMCB pVmcb = pCtx->hwvirt.svm.CTX_SUFF(pVmcb);
    1413     return pVmcb && (pVmcb->ctrl.u32InterceptXcpt & (UINT32_C(1) << uVector));
     1432    if (!pVmcb)
     1433        return false;
     1434    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     1435        return RT_BOOL(pVmcb->ctrl.u32InterceptXcpt & (UINT32_C(1) << uVector));
     1436    return HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, uVector);
    14141437}
    14151438#endif /* !IN_RC */
     
    14181441 * Checks if we are executing inside an SVM nested hardware-virtualized guest.
    14191442 *
    1420  * @returns true if in SVM nested-guest mode, false otherwise.
     1443 * @returns @c true if in SVM nested-guest mode, @c false otherwise.
    14211444 * @param   pCtx        Pointer to the context.
    14221445 */
     
    14311454    return pVmcb && (pVmcb->ctrl.u64InterceptCtrl & SVM_CTRL_INTERCEPT_VMRUN);
    14321455#else
    1433     RT_NOREF(pCtx);
     1456    NOREF(pCtx);
    14341457    return false;
    14351458#endif
     
    14391462 * Checks if we are executing inside a VMX nested hardware-virtualized guest.
    14401463 *
    1441  * @returns true if in VMX nested-guest mode, false otherwise.
     1464 * @returns @c true if in VMX nested-guest mode, @c false otherwise.
    14421465 * @param   pCtx        Pointer to the context.
    14431466 */
     
    14451468{
    14461469    /** @todo Intel. */
    1447     RT_NOREF(pCtx);
     1470    NOREF(pCtx);
    14481471    return false;
    14491472}
     
    14521475 * Checks if we are executing inside a nested hardware-virtualized guest.
    14531476 *
    1454  * @returns true if in SVM/VMX nested-guest mode, false otherwise.
     1477 * @returns @c true if in SVM/VMX nested-guest mode, @c false otherwise.
    14551478 * @param   pCtx        Pointer to the context.
    14561479 */
  • trunk/include/VBox/vmm/hm_svm.h

    r69996 r70000  
    10851085    } while (0)
    10861086
     1087VMM_INT_DECL(bool) HMIsGuestSvmCtrlInterceptSet(PVMCPU pVCpu, PCPUMCTX pCtx, uint64_t fIntercept);
     1088VMM_INT_DECL(bool) HMIsGuestSvmReadCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr);
     1089VMM_INT_DECL(bool) HMIsGuestSvmWriteCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr);
     1090VMM_INT_DECL(bool) HMIsGuestSvmReadDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr);
     1091VMM_INT_DECL(bool) HMIsGuestSvmWriteDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr);
     1092VMM_INT_DECL(bool) HMIsGuestSvmXcptInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uVector);
     1093VMM_INT_DECL(bool) HMCanSvmNstGstTakePhysIntr(PVMCPU pVCpu, PCCPUMCTX pCtx);
    10871094
    10881095/** @} */
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r69819 r70000  
    25512551 * @retval  true if it's ready, false otherwise.
    25522552 *
    2553  * @param   pCtx        The guest-CPU context.
     2553 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     2554 * @param   pCtx    The guest-CPU context.
    25542555 *
    25552556 * @sa      hmR0SvmCanNstGstTakePhysIntr.
    25562557 */
    2557 VMM_INT_DECL(bool) CPUMCanSvmNstGstTakePhysIntr(PCCPUMCTX pCtx)
     2558VMM_INT_DECL(bool) CPUMCanSvmNstGstTakePhysIntr(PVMCPU pVCpu, PCCPUMCTX pCtx)
    25582559{
    25592560#ifdef IN_RC
    2560     RT_NOREF(pCtx);
     2561    RT_NOREF2(pVCpu, pCtx);
    25612562    AssertReleaseFailedReturn(false);
    25622563#else
    25632564    Assert(CPUMIsGuestInSvmNestedHwVirtMode(pCtx));
    25642565    Assert(pCtx->hwvirt.svm.fGif);
    2565     Assert(!pCtx->hwvirt.svm.fHMCachedVmcb);
    2566 
    2567     PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
    2568     X86EFLAGS fEFlags;
    2569     if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking)
    2570         fEFlags.u = pCtx->hwvirt.svm.HostState.rflags.u;
    2571     else
    2572         fEFlags.u = pCtx->eflags.u;
    2573 
    2574     return fEFlags.Bits.u1IF;
     2566
     2567    if (!pCtx->hwvirt.svm.fHMCachedVmcb)
     2568    {
     2569        PCSVMVMCBCTRL pVmcbCtrl = &pCtx->hwvirt.svm.CTX_SUFF(pVmcb)->ctrl;
     2570        X86EFLAGS fEFlags;
     2571        if (pVmcbCtrl->IntCtrl.n.u1VIntrMasking)
     2572            fEFlags.u = pCtx->hwvirt.svm.HostState.rflags.u;
     2573        else
     2574            fEFlags.u = pCtx->eflags.u;
     2575
     2576        return fEFlags.Bits.u1IF;
     2577    }
     2578
     2579    return HMCanSvmNstGstTakePhysIntr(pVCpu, pCtx);
    25752580#endif
    25762581}
  • trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp

    r69930 r70000  
    374374#endif
    375375
     376
     377/**
     378 * Checks if the guest VMCB has the specified ctrl/instruction intercept active.
     379 *
     380 * @returns @c true if in intercept is set, @c false otherwise.
     381 * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
     382 * @param   pCtx        Pointer to the context.
     383 * @param   fIntercept  The SVM control/instruction intercept, see
     384 *                      SVM_CTRL_INTERCEPT_*.
     385 */
     386VMM_INT_DECL(bool) HMIsGuestSvmCtrlInterceptSet(PVMCPU pVCpu, PCPUMCTX pCtx, uint64_t fIntercept)
     387{
     388    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     389    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     390    return RT_BOOL(pVmcbNstGstCache->u64InterceptCtrl & fIntercept);
     391}
     392
     393
     394/**
     395 * Checks if the guest VMCB has the specified CR read intercept active.
     396 *
     397 * @returns @c true if in intercept is set, @c false otherwise.
     398 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     399 * @param   pCtx    Pointer to the context.
     400 * @param   uCr     The CR register number (0 to 15).
     401 */
     402VMM_INT_DECL(bool) HMIsGuestSvmReadCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr)
     403{
     404    Assert(uCr < 16);
     405    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     406    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     407    return RT_BOOL(pVmcbNstGstCache->u16InterceptRdCRx & (1 << uCr));
     408}
     409
     410
     411/**
     412 * Checks if the guest VMCB has the specified CR write intercept
     413 * active.
     414 *
     415 * @returns @c true if in intercept is set, @c false otherwise.
     416 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     417 * @param   pCtx    Pointer to the context.
     418 * @param   uCr     The CR register number (0 to 15).
     419 */
     420VMM_INT_DECL(bool) HMIsGuestSvmWriteCRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCr)
     421{
     422    Assert(uCr < 16);
     423    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     424    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     425    return RT_BOOL(pVmcbNstGstCache->u16InterceptWrCRx & (1 << uCr));
     426}
     427
     428
     429/**
     430 * Checks if the guest VMCB has the specified DR read intercept
     431 * active.
     432 *
     433 * @returns @c true if in intercept is set, @c false otherwise.
     434 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     435 * @param   pCtx    Pointer to the context.
     436 * @param   uDr     The DR register number (0 to 15).
     437 */
     438VMM_INT_DECL(bool) HMIsGuestSvmReadDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr)
     439{
     440    Assert(uDr < 16);
     441    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     442    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     443    return RT_BOOL(pVmcbNstGstCache->u16InterceptRdDRx & (1 << uDr));
     444}
     445
     446
     447/**
     448 * Checks if the guest VMCB has the specified DR write intercept active.
     449 *
     450 * @returns @c true if in intercept is set, @c false otherwise.
     451 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     452 * @param   pCtx    Pointer to the context.
     453 * @param   uDr     The DR register number (0 to 15).
     454 */
     455VMM_INT_DECL(bool) HMIsGuestSvmWriteDRxInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uDr)
     456{
     457    Assert(uDr < 16);
     458    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     459    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     460    return RT_BOOL(pVmcbNstGstCache->u16InterceptWrDRx & (1 << uDr));
     461}
     462
     463
     464/**
     465 * Checks if the guest VMCB has the specified exception intercept active.
     466 *
     467 * @returns true if in intercept is active, false otherwise.
     468 * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
     469 * @param   pCtx        Pointer to the context.
     470 * @param   uVector     The exception / interrupt vector.
     471 */
     472VMM_INT_DECL(bool) HMIsGuestSvmXcptInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uVector)
     473{
     474    Assert(uVector < 32);
     475    Assert(pCtx->hwvirt.svm.fHMCachedVmcb); NOREF(pCtx);
     476    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     477    return RT_BOOL(pVmcbNstGstCache->u32InterceptXcpt & (1 << uVector));
     478}
     479
     480
     481/**
     482 * Checks whether the SVM nested-guest is in a state to receive physical (APIC)
     483 * interrupts.
     484 *
     485 * @returns true if it's ready, false otherwise.
     486 * @param   pCtx        The guest-CPU context.
     487 *
     488 * @remarks This function looks at the VMCB cache rather than directly at the
     489 *          nested-guest VMCB which may have been suitably modified for executing
     490 *          using hardware-assisted SVM.
     491 *
     492 * @sa      CPUMCanSvmNstGstTakePhysIntr.
     493 */
     494VMM_INT_DECL(bool) HMCanSvmNstGstTakePhysIntr(PVMCPU pVCpu, PCCPUMCTX pCtx)
     495{
     496    Assert(pCtx->hwvirt.svm.fHMCachedVmcb);
     497    PCSVMNESTEDVMCBCACHE pVmcbNstGstCache = &pVCpu->hm.s.svm.NstGstVmcbCache;
     498    X86EFLAGS fEFlags;
     499    if (pVmcbNstGstCache->fVIntrMasking)
     500        fEFlags.u = pCtx->hwvirt.svm.HostState.rflags.u;
     501    else
     502        fEFlags.u = pCtx->eflags.u;
     503
     504    return fEFlags.Bits.u1IF;
     505}
     506
  • 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
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r69142 r70000  
    19731973                {
    19741974                    if (CPUMIsGuestInSvmNestedHwVirtMode(pCtx))
    1975                         fIntrEnabled = CPUMCanSvmNstGstTakePhysIntr(pCtx);
     1975                        fIntrEnabled = CPUMCanSvmNstGstTakePhysIntr(pVCpu, pCtx);
    19761976                    else
    19771977                        fIntrEnabled = pCtx->eflags.Bits.u1IF;
     
    19871987                    {
    19881988#ifdef VBOX_WITH_NESTED_HWVIRT
    1989                         if (CPUMIsGuestSvmCtrlInterceptSet(pCtx, SVM_CTRL_INTERCEPT_INTR))
     1989                        if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_INTR))
    19901990                        {
    19911991                            VBOXSTRICTRC rcStrict = IEMExecSvmVmexit(pVCpu, SVM_EXIT_INTR, 0, 0);
     
    20272027                        if (CPUMCanSvmNstGstTakeVirtIntr(pCtx))
    20282028                        {
    2029                             if (CPUMIsGuestSvmCtrlInterceptSet(pCtx, SVM_CTRL_INTERCEPT_VINTR))
     2029                            if (CPUMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_VINTR))
    20302030                            {
    20312031                                VBOXSTRICTRC rcStrict = IEMExecSvmVmexit(pVCpu, SVM_EXIT_VINTR, 0, 0);
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