VirtualBox

Changeset 97286 in vbox for trunk/include


Ignore:
Timestamp:
Oct 24, 2022 10:15:44 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154277
Message:

VMM/CPUM,IEM: Moved the CPUMCTX_INHIBIT_XXX flags into reserved EFLAGS space.

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

Legend:

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

    r97262 r97286  
    19311931 * @param   pCtx    Current guest CPU context.
    19321932 * @note    Requires pCtx->rip to be up to date.
    1933  * @note    Does not clear fInhibit when CPUMCTX::uRipInhibitInt differs
    1934  *          from CPUMCTX::rip.
     1933 * @note    Does NOT clear CPUMCTX_INHIBIT_SHADOW when CPUMCTX::uRipInhibitInt
     1934 *          differs from CPUMCTX::rip.
    19351935 */
    19361936DECLINLINE(bool) CPUMIsInInterruptShadow(PCCPUMCTX pCtx)
    19371937{
    1938     if (!(pCtx->fInhibit & CPUMCTX_INHIBIT_SHADOW))
     1938    if (!(pCtx->eflags.uBoth & CPUMCTX_INHIBIT_SHADOW))
    19391939        return false;
    19401940
     
    19561956DECLINLINE(bool) CPUMIsInInterruptShadowWithUpdate(PCPUMCTX pCtx)
    19571957{
    1958     if (!(pCtx->fInhibit & CPUMCTX_INHIBIT_SHADOW))
     1958    if (!(pCtx->eflags.uBoth & CPUMCTX_INHIBIT_SHADOW))
    19591959        return false;
    19601960
     
    19631963        return true;
    19641964
    1965     pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_SHADOW;
     1965    pCtx->eflags.uBoth &= ~CPUMCTX_INHIBIT_SHADOW;
    19661966    return false;
    19671967}
     
    19771977 * @param   pCtx    Current guest CPU context.
    19781978 * @note    Requires pCtx->rip to be up to date.
    1979  * @note    Does not clear fInhibit when CPUMCTX::uRipInhibitInt differs
    1980  *          from CPUMCTX::rip.
     1979 * @note    Does NOT clear CPUMCTX_INHIBIT_SHADOW when CPUMCTX::uRipInhibitInt
     1980 *          differs from CPUMCTX::rip.
    19811981 * @note    Both CPUMIsInInterruptShadowAfterSti() and this function may return
    19821982 *          true depending on the execution engine being used.
     
    19841984DECLINLINE(bool) CPUMIsInInterruptShadowAfterSs(PCCPUMCTX pCtx)
    19851985{
    1986     if (!(pCtx->fInhibit & CPUMCTX_INHIBIT_SHADOW_SS))
     1986    if (!(pCtx->eflags.uBoth & CPUMCTX_INHIBIT_SHADOW_SS))
    19871987        return false;
    19881988
     
    20002000 * @param   pCtx    Current guest CPU context.
    20012001 * @note    Requires pCtx->rip to be up to date.
    2002  * @note    Does not clear fInhibit when CPUMCTX::uRipInhibitInt differs
    2003  *          from CPUMCTX::rip.
     2002 * @note    Does NOT clear CPUMCTX_INHIBIT_SHADOW when CPUMCTX::uRipInhibitInt
     2003 *          differs from CPUMCTX::rip.
    20042004 * @note    Both CPUMIsInInterruptShadowAfterSs() and this function may return
    20052005 *          true depending on the execution engine being used.
     
    20072007DECLINLINE(bool) CPUMIsInInterruptShadowAfterSti(PCCPUMCTX pCtx)
    20082008{
    2009     if (!(pCtx->fInhibit & CPUMCTX_INHIBIT_SHADOW_STI))
     2009    if (!(pCtx->eflags.uBoth & CPUMCTX_INHIBIT_SHADOW_STI))
    20102010        return false;
    20112011
     
    20232023{
    20242024    CPUMCTX_ASSERT_NOT_EXTRN(pCtx, CPUMCTX_EXTRN_RIP);
    2025     pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW;
     2025    pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW;
    20262026    pCtx->uRipInhibitInt = pCtx->rip;
    20272027}
     
    20362036DECLINLINE(void) CPUMSetInInterruptShadowEx(PCPUMCTX pCtx, uint64_t rip)
    20372037{
    2038     pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW;
     2038    pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW;
    20392039    pCtx->uRipInhibitInt = rip;
    20402040}
     
    20492049{
    20502050    CPUMCTX_ASSERT_NOT_EXTRN(pCtx, CPUMCTX_EXTRN_RIP);
    2051     pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW_SS;
     2051    pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW_SS;
    20522052    pCtx->uRipInhibitInt = pCtx->rip;
    20532053}
     
    20622062{
    20632063    CPUMCTX_ASSERT_NOT_EXTRN(pCtx, CPUMCTX_EXTRN_RIP);
    2064     pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW_STI;
     2064    pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW_STI;
    20652065    pCtx->uRipInhibitInt = pCtx->rip;
    20662066}
     
    20732073DECLINLINE(void) CPUMClearInterruptShadow(PCPUMCTX pCtx)
    20742074{
    2075     pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_SHADOW;
     2075    pCtx->eflags.uBoth &= ~CPUMCTX_INHIBIT_SHADOW;
    20762076}
    20772077
     
    20872087    CPUMCTX_ASSERT_NOT_EXTRN(pCtx, CPUMCTX_EXTRN_RIP);
    20882088    if (!fInhibited)
    2089         pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_SHADOW;
     2089        pCtx->eflags.uBoth  &= ~CPUMCTX_INHIBIT_SHADOW;
    20902090    else
    20912091    {
    2092         pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW;
     2092        pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW;
    20932093        pCtx->uRipInhibitInt = pCtx->rip;
    20942094    }
     
    21062106{
    21072107    if (!fInhibited)
    2108         pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_SHADOW;
     2108        pCtx->eflags.uBoth  &= ~CPUMCTX_INHIBIT_SHADOW;
    21092109    else
    21102110    {
    2111         pCtx->fInhibit |= CPUMCTX_INHIBIT_SHADOW;
     2111        pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_SHADOW;
    21122112        pCtx->uRipInhibitInt = rip;
    21132113    }
     
    21262126{
    21272127    if (!(fInhibitedBySs | fInhibitedBySti))
    2128         pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_SHADOW;
     2128        pCtx->eflags.uBoth &= ~CPUMCTX_INHIBIT_SHADOW;
    21292129    else
    21302130    {
    2131         pCtx->fInhibit |= (fInhibitedBySs  ? (uint8_t)CPUMCTX_INHIBIT_SHADOW_SS  : (uint8_t)0)
    2132                        |  (fInhibitedBySti ? (uint8_t)CPUMCTX_INHIBIT_SHADOW_STI : (uint8_t)0);
     2131        pCtx->eflags.uBoth |= (fInhibitedBySs  ? CPUMCTX_INHIBIT_SHADOW_SS  : UINT32_C(0))
     2132                           |  (fInhibitedBySti ? CPUMCTX_INHIBIT_SHADOW_STI : UINT32_C(0));
    21332133        pCtx->uRipInhibitInt = rip;
    21342134    }
     
    21532153DECLINLINE(bool) CPUMAreInterruptsInhibitedByNmi(PCCPUMCTX pCtx)
    21542154{
    2155     return (pCtx->fInhibit & CPUMCTX_INHIBIT_NMI) != 0;
     2155    return (pCtx->eflags.uBoth & CPUMCTX_INHIBIT_NMI) != 0;
    21562156}
    21572157
     
    21802180DECLINLINE(void) CPUMSetInterruptInhibitingByNmi(PCPUMCTX pCtx)
    21812181{
    2182     pCtx->fInhibit |= CPUMCTX_INHIBIT_NMI;
     2182    pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_NMI;
    21832183}
    21842184
     
    22072207DECLINLINE(void) CPUMClearInterruptInhibitingByNmi(PCPUMCTX pCtx)
    22082208{
    2209     pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_NMI;
     2209    pCtx->eflags.uBoth &= ~CPUMCTX_INHIBIT_NMI;
    22102210}
    22112211
     
    22362236{
    22372237    if (!fInhibited)
    2238         pCtx->fInhibit &= (uint8_t)~CPUMCTX_INHIBIT_NMI;
     2238        pCtx->eflags.uBoth &= ~CPUMCTX_INHIBIT_NMI;
    22392239    else
    2240         pCtx->fInhibit |= CPUMCTX_INHIBIT_NMI;
     2240        pCtx->eflags.uBoth |= CPUMCTX_INHIBIT_NMI;
    22412241}
    22422242
  • trunk/include/VBox/vmm/cpum.mac

    r97213 r97286  
    165165    .eip                resq    1
    166166    .eflags             resq    1
    167     .fInhibit           resb    1
     167    .abPadding          resb    8
    168168    alignb 8
    169169    .uRipInhibitInt     resq    1
  • trunk/include/VBox/vmm/cpumctx.h

    r97281 r97286  
    274274#endif
    275275
    276 /** Mask of internal flags kept with EFLAGS, 64-bit version.   */
    277 #define CPUMX86EFLAGS_INT_MASK_64   UINT64_C(0x0000000000000000)
    278 /** Mask of internal flags kept with EFLAGS, 32-bit version.   */
    279 #define CPUMX86EFLAGS_INT_MASK_32   UINT64_C(0x0000000000000000)
     276/** Mask of internal flags kept with EFLAGS, 64-bit version.
     277 * The first 3 available bits are taken by CPUMCTX_INHIBIT_SHADOW_SS,
     278 * CPUMCTX_INHIBIT_SHADOW_STI and CPUMCTX_INHIBIT_NMI.
     279 */
     280#define CPUMX86EFLAGS_INT_MASK_64   UINT64_C(0x0000000007000000)
     281/** Mask of internal flags kept with EFLAGS, 32-bit version. */
     282#define CPUMX86EFLAGS_INT_MASK_32           UINT32_C(0x07000000)
    280283
    281284
     
    414417    } CPUM_UNION_NM(rflags);
    415418
    416     /** Interrupt & exception inhibiting (CPUMCTX_INHIBIT_XXX). */
    417     uint8_t             fInhibit;
    418     uint8_t             abPadding[7];
    419     /** The RIP value fInhibit is/was valid for. */
     419    uint8_t             abPadding[8];
     420    /** The RIP value an interrupt shadow is/was valid for. */
    420421    uint64_t            uRipInhibitInt;
    421422
     
    674675AssertCompileMemberOffset(CPUMCTX,                                       rip, 0x0140);
    675676AssertCompileMemberOffset(CPUMCTX,                                    rflags, 0x0148);
    676 AssertCompileMemberOffset(CPUMCTX,                                  fInhibit, 0x0150);
    677677AssertCompileMemberOffset(CPUMCTX,                            uRipInhibitInt, 0x0158);
    678678AssertCompileMemberOffset(CPUMCTX,                                       cr0, 0x0160);
     
    10161016 * instructions will have any effect on the instruction following the last one
    10171017 * of them. */
    1018 #define CPUMCTX_INHIBIT_SHADOW_SS   UINT8_C(0x01)
     1018#define CPUMCTX_INHIBIT_SHADOW_SS       RT_BIT_32(0 + CPUMX86EFLAGS_HW_BITS)
    10191019/** Interrupt shadow following STI.
    10201020 * Same as CPUMCTX_INHIBIT_SHADOW_SS but without blocking any debug exceptions. */
    1021 #define CPUMCTX_INHIBIT_SHADOW_STI  UINT8_C(0x02)
     1021#define CPUMCTX_INHIBIT_SHADOW_STI      RT_BIT_32(1 + CPUMX86EFLAGS_HW_BITS)
    10221022/** Mask combining STI and SS shadowing. */
    1023 #define CPUMCTX_INHIBIT_SHADOW      (CPUMCTX_INHIBIT_SHADOW_SS | CPUMCTX_INHIBIT_SHADOW_STI)
     1023#define CPUMCTX_INHIBIT_SHADOW          (CPUMCTX_INHIBIT_SHADOW_SS | CPUMCTX_INHIBIT_SHADOW_STI)
    10241024
    10251025/** Interrupts blocked by NMI delivery.  This condition is cleared by IRET.
     
    10301030 * handler has completed executing."  This flag indicates that these
    10311031 * conditions are currently active.  */
    1032 #define CPUMCTX_INHIBIT_NMI         UINT8_C(0x04)
     1032#define CPUMCTX_INHIBIT_NMI             RT_BIT_32(2 + CPUMX86EFLAGS_HW_BITS)
     1033
     1034/** Mask containing all the interrupt inhibit bits. */
     1035#define CPUMCTX_INHIBIT_ALL_MASK        (CPUMCTX_INHIBIT_SHADOW_SS | CPUMCTX_INHIBIT_SHADOW_STI | CPUMCTX_INHIBIT_NMI)
     1036AssertCompile(CPUMCTX_INHIBIT_ALL_MASK < UINT32_MAX);
    10331037/** @} */
    10341038
  • trunk/include/VBox/vmm/vm.h

    r97178 r97286  
    521521/* 22 used to be VMCPU_FF_SELM_SYNC_GDT (raw-mode only). */
    522522/* 23 used to be VMCPU_FF_SELM_SYNC_LDT (raw-mode only). */
    523 /* 24 used to be VMCPU_FF_INHIBIT_INTERRUPTS, which moved to CPUMCTX::fInhibit in v7.0.4. */
    524 /* 25 used to be VMCPU_FF_BLOCK_NMIS, which moved to CPUMCTX::fInhibit in v7.0.4. */
     523/* 24 used to be VMCPU_FF_INHIBIT_INTERRUPTS, which moved to CPUMCTX::eflags.uBoth in v7.0.4. */
     524/* 25 used to be VMCPU_FF_BLOCK_NMIS, which moved to CPUMCTX::eflags.uBoth in v7.0.4. */
    525525/** Force return to Ring-3. */
    526526#define VMCPU_FF_TO_R3                      RT_BIT_64(VMCPU_FF_TO_R3_BIT)
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