VirtualBox

Changeset 100966 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 24, 2023 11:23:58 PM (17 months ago)
Author:
vboxsync
Message:

VMM/PGM,IEM: Prepare work for write monitoring page containing recompiled code. bugref:10369

Location:
trunk/src/VBox/VMM
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll-armv8.cpp

    r99053 r100966  
    114114
    115115
    116 VMM_INT_DECL(void) IEMTlbInvalidateAllPhysicalAllCpus(PVMCC pVM, VMCPUID idCpuCaller)
     116VMM_INT_DECL(void) IEMTlbInvalidateAllPhysicalAllCpus(PVMCC pVM, VMCPUID idCpuCaller, IEMTLBPHYSFLUSHREASON enmReason)
    117117{
    118     RT_NOREF(pVM, idCpuCaller);
     118    RT_NOREF(pVM, idCpuCaller, enmReason);
    119119}
    120120
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r100868 r100966  
    754754 * @param   idCpuCaller The ID of the calling EMT if available to the caller,
    755755 *                      otherwise NIL_VMCPUID.
     756 * @param   enmReason   The reason we're called.
    756757 *
    757758 * @remarks Caller holds the PGM lock.
    758759 */
    759 VMM_INT_DECL(void) IEMTlbInvalidateAllPhysicalAllCpus(PVMCC pVM, VMCPUID idCpuCaller)
     760VMM_INT_DECL(void) IEMTlbInvalidateAllPhysicalAllCpus(PVMCC pVM, VMCPUID idCpuCaller, IEMTLBPHYSFLUSHREASON enmReason)
    760761{
    761762#if defined(IEM_WITH_CODE_TLB) || defined(IEM_WITH_DATA_TLB)
     
    763764    if (pVCpuCaller)
    764765        VMCPU_ASSERT_EMT(pVCpuCaller);
    765     Log10(("IEMTlbInvalidateAllPhysicalAllCpus\n"));
     766    Log10(("IEMTlbInvalidateAllPhysicalAllCpus: %d\n", enmReason)); RT_NOREF(enmReason);
    766767
    767768    VMCC_FOR_EACH_VMCPU(pVM)
     
    789790
    790791#else
    791     RT_NOREF(pVM, idCpuCaller);
     792    RT_NOREF(pVM, idCpuCaller, enmReason);
    792793#endif
    793794}
     
    978979            AssertCompile(PGMIEMGCPHYS2PTR_F_NO_MAPPINGR3 == IEMTLBE_F_NO_MAPPINGR3);
    979980            AssertCompile(PGMIEMGCPHYS2PTR_F_UNASSIGNED   == IEMTLBE_F_PG_UNASSIGNED);
     981            AssertCompile(PGMIEMGCPHYS2PTR_F_CODE_PAGE    == IEMTLBE_F_PG_CODE_PAGE);
    980982            if (RT_LIKELY(pVCpu->iem.s.CodeTlb.uTlbPhysRev > IEMTLB_PHYS_REV_INCR))
    981983            { /* likely */ }
     
    983985                IEMTlbInvalidateAllPhysicalSlow(pVCpu);
    984986            pTlbe->fFlagsAndPhysRev &= ~(  IEMTLBE_F_PHYS_REV
    985                                          | IEMTLBE_F_NO_MAPPINGR3 | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_UNASSIGNED);
     987                                         | IEMTLBE_F_NO_MAPPINGR3
     988                                         | IEMTLBE_F_PG_NO_READ
     989                                         | IEMTLBE_F_PG_NO_WRITE
     990                                         | IEMTLBE_F_PG_UNASSIGNED
     991                                         | IEMTLBE_F_PG_CODE_PAGE);
    986992            int rc = PGMPhysIemGCPhys2PtrNoLock(pVCpu->CTX_SUFF(pVM), pVCpu, pTlbe->GCPhys, &pVCpu->iem.s.CodeTlb.uTlbPhysRev,
    987993                                                &pTlbe->pbMappingR3, &pTlbe->fFlagsAndPhysRev);
     
    64136419        AssertCompile(PGMIEMGCPHYS2PTR_F_NO_MAPPINGR3 == IEMTLBE_F_NO_MAPPINGR3);
    64146420        AssertCompile(PGMIEMGCPHYS2PTR_F_UNASSIGNED   == IEMTLBE_F_PG_UNASSIGNED);
     6421        AssertCompile(PGMIEMGCPHYS2PTR_F_CODE_PAGE    == IEMTLBE_F_PG_CODE_PAGE);
    64156422        if (RT_LIKELY(pVCpu->iem.s.CodeTlb.uTlbPhysRev > IEMTLB_PHYS_REV_INCR))
    64166423        { /* likely */ }
     
    64196426        pTlbe->pbMappingR3       = NULL;
    64206427        pTlbe->fFlagsAndPhysRev &= ~(  IEMTLBE_F_PHYS_REV
    6421                                      | IEMTLBE_F_NO_MAPPINGR3 | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_UNASSIGNED);
     6428                                     | IEMTLBE_F_NO_MAPPINGR3
     6429                                     | IEMTLBE_F_PG_NO_READ
     6430                                     | IEMTLBE_F_PG_NO_WRITE
     6431                                     | IEMTLBE_F_PG_UNASSIGNED
     6432                                     | IEMTLBE_F_PG_CODE_PAGE);
    64226433        int rc = PGMPhysIemGCPhys2PtrNoLock(pVCpu->CTX_SUFF(pVM), pVCpu, pTlbe->GCPhys, &pVCpu->iem.s.DataTlb.uTlbPhysRev,
    64236434                                            &pbMem, &pTlbe->fFlagsAndPhysRev);
     
    67486759            AssertCompile(PGMIEMGCPHYS2PTR_F_NO_MAPPINGR3 == IEMTLBE_F_NO_MAPPINGR3);
    67496760            AssertCompile(PGMIEMGCPHYS2PTR_F_UNASSIGNED   == IEMTLBE_F_PG_UNASSIGNED);
     6761            AssertCompile(PGMIEMGCPHYS2PTR_F_CODE_PAGE    == IEMTLBE_F_PG_CODE_PAGE);
    67506762            pTlbe->pbMappingR3       = NULL;
    67516763            pTlbe->fFlagsAndPhysRev &= ~(  IEMTLBE_F_PHYS_REV
    6752                                          | IEMTLBE_F_NO_MAPPINGR3 | IEMTLBE_F_PG_NO_READ | IEMTLBE_F_PG_NO_WRITE | IEMTLBE_F_PG_UNASSIGNED);
     6764                                         | IEMTLBE_F_NO_MAPPINGR3
     6765                                         | IEMTLBE_F_PG_NO_READ
     6766                                         | IEMTLBE_F_PG_NO_WRITE
     6767                                         | IEMTLBE_F_PG_UNASSIGNED
     6768                                         | IEMTLBE_F_PG_CODE_PAGE);
    67536769            int rc = PGMPhysIemGCPhys2PtrNoLock(pVCpu->CTX_SUFF(pVM), pVCpu, pTlbe->GCPhys, &pVCpu->iem.s.DataTlb.uTlbPhysRev,
    67546770                                                &pbMem, &pTlbe->fFlagsAndPhysRev);
  • trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp

    r99739 r100966  
    948948    pgmPhysInvalidatePageMapTLBEntry(pVM, GCPhysPage);
    949949    if (fFlushIemTlbs)
    950         IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     950        IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_RESET_ALIAS);
    951951
    952952    /*
     
    14341434                         */
    14351435                        if (fFlushIemTlb)
    1436                             IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     1436                            IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_HANDLER_RESET);
    14371437                    }
    14381438                }
     
    17901790                   the guest physical address part of the IEM TLBs.  Note, we do
    17911791                   this here as we will not invalid */
    1792                 IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     1792                IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_MMIO2_ALIAS);
    17931793            }
    17941794            Assert(PGM_PAGE_IS_ZERO(pPage));
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r99739 r100966  
    746746    }
    747747
    748     IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     748    IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_MISC);
    749749    PGM_UNLOCK(pVM);
    750750}
     
    995995    PGM_PAGE_SET_PDE_TYPE(pVM, pPage, PGM_PAGE_PDE_TYPE_PT);
    996996    pgmPhysInvalidatePageMapTLBEntry(pVM, GCPhys);
    997     IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     997    IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_ALLOCATED);
    998998
    999999    /* Copy the shared page contents to the replacement page. */
     
    12251225    PGM_PAGE_SET_WRITTEN_TO(pVM, pPage);
    12261226    PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED);
     1227    if (PGM_PAGE_IS_CODE_PAGE(pPage))
     1228    {
     1229        PGM_PAGE_CLEAR_CODE_PAGE(pVM, pPage);
     1230        IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_MADE_WRITABLE);
     1231    }
     1232
    12271233    Assert(pVM->pgm.s.cMonitoredPages > 0);
    12281234    pVM->pgm.s.cMonitoredPages--;
     
    37373743                    {
    37383744                        case PGM_PAGE_STATE_ALLOCATED:
     3745                            Assert(!PGM_PAGE_IS_CODE_PAGE(pPage));
    37393746                            *pfTlb |= *puTlbPhysRev;
    37403747                            break;
     
    37453752                        case PGM_PAGE_STATE_SHARED:
    37463753                        case PGM_PAGE_STATE_WRITE_MONITORED:
    3747                             *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3754                            if (!PGM_PAGE_IS_CODE_PAGE(pPage))
     3755                                *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3756                            else
     3757                                *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE | PGMIEMGCPHYS2PTR_F_CODE_PAGE;
    37483758                            break;
    37493759                    }
     
    37693779                     */
    37703780                    if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    3771                         *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3781                    {
     3782                        if (!PGM_PAGE_IS_CODE_PAGE(pPage)) /* ROM pages end up here */
     3783                            *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3784                        else
     3785                            *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE | PGMIEMGCPHYS2PTR_F_CODE_PAGE;
     3786                    }
    37723787                    else
    37733788                        switch (PGM_PAGE_GET_STATE(pPage))
    37743789                        {
    37753790                            case PGM_PAGE_STATE_ALLOCATED:
     3791                                Assert(!PGM_PAGE_IS_CODE_PAGE(pPage));
    37763792                                *pfTlb |= *puTlbPhysRev;
    37773793                                break;
     
    37823798                            case PGM_PAGE_STATE_SHARED:
    37833799                            case PGM_PAGE_STATE_WRITE_MONITORED:
    3784                                 *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3800                                if (!PGM_PAGE_IS_CODE_PAGE(pPage))
     3801                                    *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE;
     3802                                else
     3803                                    *pfTlb |= *puTlbPhysRev | PGMIEMGCPHYS2PTR_F_NO_WRITE | PGMIEMGCPHYS2PTR_F_CODE_PAGE;
    37853804                                break;
    37863805                        }
  • trunk/src/VBox/VMM/VMMR0/PGMR0.cpp

    r99739 r100966  
    641641     * invalidate everything.  Add a version to the TLB? */
    642642    pgmPhysInvalidatePageMapTLB(pGVM);
    643     IEMTlbInvalidateAllPhysicalAllCpus(pGVM, idCpu);
     643    IEMTlbInvalidateAllPhysicalAllCpus(pGVM, idCpu, IEMTLBPHYSFLUSHREASON_ALLOCATED_LARGE);
    644644
    645645    STAM_PROFILE_STOP(&pGVM->pgm.s.Stats.StatLargePageSetup, a);
  • trunk/src/VBox/VMM/VMMR0/PGMR0SharedPage.cpp

    r98103 r100966  
    135135                            /* Invalidate page map TLB entry for this page too. */
    136136                            pgmPhysInvalidatePageMapTLBEntry(pVM, PageDesc.GCPhys);
    137                             IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     137                            IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_SHARED);
    138138                            pVM->pgm.s.cReusedSharedPages++;
    139139                        }
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r99739 r100966  
    14051405        pVM->pgm.s.cWrittenToPages++;
    14061406    }
     1407    PGM_PAGE_CLEAR_CODE_PAGE(pVM, pPage); /* No callback needed, IEMTlbInvalidateAllPhysicalAllCpus is called below. */
    14071408
    14081409    /*
     
    14181419    /* Flush physical page map TLB entry. */
    14191420    pgmPhysInvalidatePageMapTLBEntry(pVM, GCPhys);
    1420     IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID); /// @todo move to the perform step.
     1421    IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_FREED); /// @todo move to the perform step.
    14211422
    14221423#ifdef VBOX_WITH_PGM_NEM_MODE
     
    21612162     * Flush the IEM TLB, just to be sure it really is done.
    21622163     */
    2163     IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID);
     2164    IEMTlbInvalidateAllPhysicalAllCpus(pVM, NIL_VMCPUID, IEMTLBPHYSFLUSHREASON_ZERO_ALL);
    21642165
    21652166    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/include/IEMInternal-armv8.h

    r100072 r100966  
    295295#define IEMTLBE_F_NO_MAPPINGR3      RT_BIT_64(7) /**< TLB entry:   The IEMTLBENTRY::pMappingR3 member is invalid. */
    296296#define IEMTLBE_F_PG_UNASSIGNED     RT_BIT_64(8) /**< Phys page:   Unassigned memory (not RAM, ROM, MMIO2 or MMIO). */
    297 #define IEMTLBE_F_PHYS_REV          UINT64_C(0xfffffffffffffe00) /**< Physical revision mask. @sa IEMTLB_PHYS_REV_INCR */
     297#define IEMTLBE_F_PG_CODE_PAGE      RT_BIT_64(9) /**< Phys page:   Code page. */
     298#define IEMTLBE_F_PHYS_REV          UINT64_C(0xfffffffffffffc00) /**< Physical revision mask. @sa IEMTLB_PHYS_REV_INCR */
    298299/** @} */
    299300
     
    360361/** IEMTLB::uTlbPhysRev increment.
    361362 * @sa IEMTLBE_F_PHYS_REV */
    362 #define IEMTLB_PHYS_REV_INCR    RT_BIT_64(9)
     363#define IEMTLB_PHYS_REV_INCR    RT_BIT_64(10)
    363364/**
    364365 * Calculates the TLB tag for a virtual address.
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r100889 r100966  
    443443#define IEMTLBE_F_NO_MAPPINGR3      RT_BIT_64(7) /**< TLB entry:   The IEMTLBENTRY::pMappingR3 member is invalid. */
    444444#define IEMTLBE_F_PG_UNASSIGNED     RT_BIT_64(8) /**< Phys page:   Unassigned memory (not RAM, ROM, MMIO2 or MMIO). */
    445 #define IEMTLBE_F_PHYS_REV          UINT64_C(0xfffffffffffffe00) /**< Physical revision mask. @sa IEMTLB_PHYS_REV_INCR */
     445#define IEMTLBE_F_PG_CODE_PAGE      RT_BIT_64(9) /**< Phys page:   Code page. */
     446#define IEMTLBE_F_PHYS_REV          UINT64_C(0xfffffffffffffc00) /**< Physical revision mask. @sa IEMTLB_PHYS_REV_INCR */
    446447/** @} */
    447448
     
    512513/** IEMTLB::uTlbPhysRev increment.
    513514 * @sa IEMTLBE_F_PHYS_REV */
    514 #define IEMTLB_PHYS_REV_INCR    RT_BIT_64(9)
     515#define IEMTLB_PHYS_REV_INCR    RT_BIT_64(10)
    515516/**
    516517 * Calculates the TLB tag for a virtual address.
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r100965 r100966  
    659659        /** 2     - Don't apply the physical handler in HM mode (nested APIC hack). */
    660660        uint64_t    fHandlerPhysNotInHm : 1;
    661         /** 3     - Flag indicating that a write monitored page was written to
    662          *  when set. */
     661        /** 3     - Flag indicating that a write monitored page was written to when set. */
    663662        uint64_t    fWrittenToY         : 1;
    664         /** 7:4   - Unused. */
    665         uint64_t    u2Unused0           : 4;
     663        /** 4     - Set when the page is write monitored because it's an IEM TB code
     664         * page.  Save recompiled code the need to verify opcode bytes.
     665         *
     666         * IEM fetches this flag as part of the TLB queries.  The flag is cleared when
     667         * the page is made writable and IEM is informed and will invalidate its
     668         * physical TLB layer.
     669         *
     670         * @note Can possibly be set on ROM pages that are not in the monitored state. */
     671        uint64_t    fCodePageY          : 1;
     672        /** 7:5   - Unused. */
     673        uint64_t    u2Unused0           : 3;
    666674        /** 9:8   - Paging structure needed to map the page
    667675         * (PGM_PAGE_PDE_TYPE_*). */
     
    977985#define PGM_PAGE_IS_ALLOCATED(a_pPage)          ( (a_pPage)->s.uStateY == PGM_PAGE_STATE_ALLOCATED )
    978986
     987
    979988/**
    980989 * Marks the page as written to (for GMM change monitoring).
     
    9991008 */
    10001009#define PGM_PAGE_IS_WRITTEN_TO(a_pPage)         ( (a_pPage)->s.fWrittenToY )
     1010
     1011
     1012/**
     1013 * Marks the page as an IEM code page (being write monitored or a ROM page).
     1014 * @param   a_pVM       The VM handle, only used for lock ownership assertions.
     1015 * @param   a_pPage     Pointer to the physical guest page tracking structure.
     1016 */
     1017#define PGM_PAGE_SET_CODE_PAGE(a_pVM, a_pPage) \
     1018    do { (a_pPage)->s.fCodePageY = 1; PGM_PAGE_ASSERT_LOCK(a_pVM); } while (0)
     1019
     1020/**
     1021 * Clears the code page indicator.
     1022 * @param   a_pVM       The VM handle, only used for lock ownership assertions.
     1023 * @param   a_pPage     Pointer to the physical guest page tracking structure.
     1024 */
     1025#define PGM_PAGE_CLEAR_CODE_PAGE(a_pVM, a_pPage) \
     1026    do { (a_pPage)->s.fCodePageY = 0; PGM_PAGE_ASSERT_LOCK(a_pVM); } while (0)
     1027
     1028/**
     1029 * Checks if the page is an IEM code page (implies write monitored or ROM page).
     1030 * @returns true/false.
     1031 * @param   a_pPage     Pointer to the physical guest page tracking structure.
     1032 */
     1033#define PGM_PAGE_IS_CODE_PAGE(a_pPage)         ( (a_pPage)->s.fCodePageY )
    10011034
    10021035
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette