VirtualBox

Changeset 1865 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 2, 2007 3:45:56 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
20091
Message:

InvalidatePage: always make page non-present (possibly dangerous)
Page fault handler: updates for extra code scanning.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r1839 r1865  
    544544                    STAM_COUNTER_INC(&pVM->pgm.s.StatGCPageOutOfSyncSupervisor);
    545545
    546 #  ifdef LOG_ENABLED
     546#  if defined(LOG_ENABLED) && !defined(IN_RING0)
    547547                RTGCPHYS   GCPhys;
    548548                uint64_t   fPageGst;
    549549                PGMGstGetPage(pVM, pvFault, &fPageGst, &GCPhys);
    550                 LogFlow(("Page out of sync: %p eip=%08x PdeSrc.n.u1User=%d fPageGst=%08llx GCPhys=%VGp\n",
    551                          pvFault, pRegFrame->eip, PdeSrc.n.u1User, fPageGst, GCPhys));
     550                Log(("Page out of sync: %p eip=%08x PdeSrc.n.u1User=%d fPageGst=%08llx GCPhys=%VGp scan=%d\n",
     551                     pvFault, pRegFrame->eip, PdeSrc.n.u1User, fPageGst, GCPhys, CSAMDoesPageNeedScanning(pVM, (RTGCPTR)pRegFrame->eip)));
    552552#  endif /* LOG_ENABLED */
    553553
    554554#  ifndef IN_RING0
    555                 if (CSAMIsEnabled(pVM) && (cpl == 0))
     555                if (cpl == 0)
    556556                {
    557557                    uint64_t fPageGst;
     
    560560                        && !(fPageGst & X86_PTE_US))
    561561                    {
    562                         if (pvFault == (RTGCPTR)pRegFrame->eip)
     562                        /** Note: can't check for X86_TRAP_ID bit, because that requires execute disable support on the CPU */
     563                        if (    pvFault == (RTGCPTR)pRegFrame->eip
     564                            ||  (RTGCUINTPTR)pvFault - pRegFrame->eip < 8    /* instruction crossing a page boundary */
     565#if 0   /* Note: enable if ever required in the future; it's a bit aggressive */
     566                            ||  (   !PATMIsPatchGCAddr(pVM, (RTGCPTR)pRegFrame->eip)
     567                                 && CSAMDoesPageNeedScanning(pVM, (RTGCPTR)pRegFrame->eip))   /* any new code we encounter here */
     568#endif
     569                           )
    563570                        {
    564                             LogFlow(("CSAMExecFault %VGv\n", pvFault));
    565                             rc = CSAMExecFault(pVM, pvFault);
     571                            LogFlow(("CSAMExecFault %VGv\n", pRegFrame->eip));
     572                            rc = CSAMExecFault(pVM, (RTGCPTR)pRegFrame->eip);
    566573                            if (rc != VINF_SUCCESS)
    567574                            {
     
    581588                            }
    582589                        }
     590                        else
     591                        if (    uErr == X86_TRAP_PF_RW
     592                            &&  pRegFrame->ecx >= 0x100         /* early check for movswd count */
     593                            &&  pRegFrame->ecx < 0x10000
     594                           )
     595                        {
     596                            /* In case of a write to a non-present supervisor shadow page, we'll take special precautions
     597                             * to detect loading of new code pages.
     598                             */
     599
     600                            /*
     601                             * Decode the instruction.
     602                             */
     603                            RTGCPTR PC;
     604                            rc = SELMValidateAndConvertCSAddr(pVM, pRegFrame->eflags, pRegFrame->ss, pRegFrame->cs, &pRegFrame->csHid, (RTGCPTR)pRegFrame->eip, &PC);
     605                            if (rc == VINF_SUCCESS)
     606                            {
     607                                DISCPUSTATE Cpu;
     608                                uint32_t    cbOp;
     609                                rc = EMInterpretDisasOneEx(pVM, (RTGCUINTPTR)PC, pRegFrame, &Cpu, &cbOp);
     610
     611                                /* For now we'll restrict this to rep movsw/d instructions */
     612                                if (    rc == VINF_SUCCESS
     613                                    &&  Cpu.pCurInstr->opcode == OP_MOVSWD
     614                                    &&  (Cpu.prefix & PREFIX_REP))
     615                                {
     616                                    CSAMMarkPossibleCodePage(pVM, pvFault);
     617                                }
     618                            }                           
     619                        }
    583620
    584621                        /*
     
    587624                        /** @todo not correct for pages that contain both code and data!! */
    588625                        Log2(("CSAMMarkPage %p; scanned=%d\n", pvFault, true));
    589                         CSAMMarkPage(pVM, (RTGCPTR)pvFault, true);
     626                        CSAMMarkPage(pVM, pvFault, true);
    590627                    }
    591628                }
     
    864901            if (pShwPage->GCPhys == GCPhys)
    865902            {
    866 #if 0 /* debug build + flash + xp (=1000Hz timer?) => bad invalidation + sync loops. */
    867903                const unsigned iPTEDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    868904                PSHWPT pPT = (PSHWPT)PGMPOOL_PAGE_2_PTR(pVM, pShwPage);
     
    875911                    pPT->a[iPTEDst].u = 0;
    876912                }
    877 #else /* Syncing it here isn't 100% safe and it's probably not worth spending time syncing it. */
    878                 rc = PGM_BTH_NAME(SyncPage)(pVM, PdeSrc, GCPtrPage, 1, 0);
    879                 if (VBOX_SUCCESS(rc))
    880                     rc = VINF_SUCCESS;
    881 #endif
    882913                STAM_COUNTER_INC(&pVM->pgm.s.CTXMID(Stat,InvalidatePage4KBPages));
    883914                PGM_INVL_PG(GCPtrPage);
     
    13321363                            {
    13331364                                VBOXPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst];
    1334                                 PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    1335                                 Log2(("SyncPage: 4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s\n",
    1336                                       (GCPtrPage & ~(RTGCUINTPTR)(X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT),
    1337                                       PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u,
     1365                                RTGCUINTPTR GCPtrCurPage = ((RTGCUINTPTR)GCPtrPage & ~(RTGCUINTPTR)(X86_PT_MASK << X86_PT_SHIFT)) | ((offPTSrc + iPTDst) << PAGE_SHIFT);
     1366
     1367#ifndef IN_RING0
     1368                                /*
     1369                                 * Assuming kernel code will be marked as supervisor - and not as user level
     1370                                 * and executed using a conforming code selector - And marked as readonly.
     1371                                 * Also assume that if we're monitoring a page, it's of no interest to CSAM.
     1372                                 */
     1373                                if (    ((PdeSrc.u & PteSrc.u) & (X86_PTE_RW | X86_PTE_US))
     1374                                    ||  iPTDst == ((GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK)   /* always sync GCPtrPage */
     1375                                    ||  !CSAMDoesPageNeedScanning(pVM, (RTGCPTR)GCPtrCurPage)
     1376                                    ||  PGMRamTestFlags(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK,
     1377                                                        MM_RAM_FLAGS_PHYSICAL_ALL | MM_RAM_FLAGS_VIRTUAL_ALL | MM_RAM_FLAGS_PHYSICAL_WRITE | MM_RAM_FLAGS_VIRTUAL_WRITE)
     1378                                   )
     1379#endif   
     1380                                    PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
     1381                                Log2(("SyncPage: 4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx} PteDst=%08llx%s\n",
     1382                                      GCPtrCurPage, PteSrc.n.u1Present,
     1383                                      PteSrc.n.u1Write & PdeSrc.n.u1Write,
     1384                                      PteSrc.n.u1User & PdeSrc.n.u1User,
     1385                                      (uint64_t)PteSrc.u,
     1386                                      (uint64_t)pPTDst->a[iPTDst].u,
    13381387                                      pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
    13391388                            }
     
    13481397                        PGM_BTH_NAME(SyncPageWorker)(pVM, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
    13491398                        Log2(("SyncPage: 4K  %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s\n",
    1350                               GCPtrPage, PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u,
     1399                              GCPtrPage, PteSrc.n.u1Present,
     1400                              PteSrc.n.u1Write & PdeSrc.n.u1Write,
     1401                              PteSrc.n.u1User & PdeSrc.n.u1User,
     1402                              (uint64_t)PteSrc.u,
    13511403                              pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
    13521404                    }
     
    18861938                         */
    18871939                        if (    ((PdeSrc.u & pPTSrc->a[iPTSrc].u) & (X86_PTE_RW | X86_PTE_US))
    1888                             ||  !CSAMIsEnabled(pVM)
    18891940                            ||  !CSAMDoesPageNeedScanning(pVM, (RTGCPTR)((iPDSrc << GST_PD_SHIFT) | (iPTSrc << PAGE_SHIFT)))
    18901941                            ||  PGMRamTestFlags(&pVM->pgm.s, PteSrc.u & GST_PTE_PG_MASK,
     
    18951946                        Log2(("SyncPT:   4K+ %VGv PteSrc:{P=%d RW=%d U=%d raw=%08llx}%s dst.raw=%08llx iPTSrc=%x PdeSrc.u=%x physpte=%VGp\n",
    18961947                              (RTGCPTR)((iPDSrc << GST_PD_SHIFT) | (iPTSrc << PAGE_SHIFT)),
    1897                               PteSrc.n.u1Present, PteSrc.n.u1Write, PteSrc.n.u1User, (uint64_t)PteSrc.u,
     1948                              PteSrc.n.u1Present,
     1949                              PteSrc.n.u1Write & PdeSrc.n.u1Write,
     1950                              PteSrc.n.u1User & PdeSrc.n.u1User,
     1951                              (uint64_t)PteSrc.u,
    18981952                              pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : "", pPTDst->a[iPTDst].u, iPTSrc, PdeSrc.au32[0],
    18991953                              (PdeSrc.u & GST_PDE_PG_MASK) + iPTSrc*sizeof(PteSrc)));
     
    20042058                         */
    20052059                        else if (    !PdeSrc.n.u1User
    2006                                  &&  CSAMIsEnabled(pVM)
    20072060                                 &&  CSAMDoesPageNeedScanning(pVM, (RTGCPTR)(GCPtr | (iPTDst << SHW_PT_SHIFT))))
    20082061                            PteDst.u = 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