VirtualBox

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


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

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

Location:
trunk/src/VBox/VMM/VMMAll
Files:
4 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                        }
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