VirtualBox

Changeset 1830 in vbox for trunk/src/VBox/VMM/PATM


Ignore:
Timestamp:
Mar 30, 2007 2:16:35 PM (18 years ago)
Author:
vboxsync
Message:

Preparation for new code page detection.

Location:
trunk/src/VBox/VMM/PATM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PATM/CSAM.cpp

    r1800 r1830  
    226226    pVM->csam.s.fScanningStarted = false;
    227227
    228     VM_FF_CLEAR(pVM, VM_FF_CSAM_FLUSH_DIRTY_PAGE);
     228    VM_FF_CLEAR(pVM, VM_FF_CSAM_PENDING_ACTION);
    229229    pVM->csam.s.cDirtyPages = 0;
    230230    /* not necessary */
     
    462462    memcpy(pVM->csam.s.pvDirtyBasePage,  csamInfo.pvDirtyBasePage, sizeof(pVM->csam.s.pvDirtyBasePage));
    463463    memcpy(pVM->csam.s.pvDirtyFaultPage, csamInfo.pvDirtyFaultPage, sizeof(pVM->csam.s.pvDirtyFaultPage));
     464
     465     /* Restore possible code page  */
     466    pVM->csam.s.cPossibleCodePages = csamInfo.cPossibleCodePages;
     467    memcpy(pVM->csam.s.pvPossibleCodePage,  csamInfo.pvPossibleCodePage, sizeof(pVM->csam.s.pvPossibleCodePage));
    464468
    465469    /* Restore pgdir bitmap (we'll change the pointers next). */
     
    20082012 * @param   fScanned    Mark as scanned or not
    20092013 */
    2010 CSAMDECL(int) CSAMR3MarkCode(PVM pVM, RTGCPTR pInstr, uint32_t opsize, bool fScanned)
     2014CSAMR3DECL(int) CSAMR3MarkCode(PVM pVM, RTGCPTR pInstr, uint32_t opsize, bool fScanned)
    20112015{
    20122016    PCSAMPAGE pPage = 0;
     
    21042108 * @param   pVM         The VM to operate on.
    21052109 */
    2106 CSAMR3DECL(int) CSAMR3FlushDirtyPages(PVM pVM)
     2110static int csamR3FlushDirtyPages(PVM pVM)
    21072111{
    21082112    STAM_PROFILE_START(&pVM->csam.s.StatFlushDirtyPages, a);
     
    21422146    }
    21432147    pVM->csam.s.cDirtyPages = 0;
    2144     VM_FF_CLEAR(pVM, VM_FF_CSAM_FLUSH_DIRTY_PAGE);
    21452148    STAM_PROFILE_STOP(&pVM->csam.s.StatFlushDirtyPages, a);
     2149    return VINF_SUCCESS;
     2150}
     2151
     2152/**
     2153 * Flush potential new code pages
     2154 *
     2155 * @returns VBox status code.
     2156 * @param   pVM         The VM to operate on.
     2157 */
     2158static int csamR3FlushCodePages(PVM pVM)
     2159{
     2160    for (uint32_t i=0;i<pVM->csam.s.cPossibleCodePages;i++)
     2161    {
     2162        int          rc;
     2163        RTGCPTR      GCPtr = pVM->csam.s.pvPossibleCodePage[i];
     2164
     2165        GCPtr = GCPtr & PAGE_BASE_GC_MASK;
     2166
     2167        CSAMMarkPage(pVM, GCPtr, false);
     2168        PGMInvalidatePage(pVM, GCPtr);
     2169        PGMPrefetchPage(pVM, GCPtr);
     2170
     2171        CSAMMarkPage(pVM, GCPtr, true);
     2172    }
     2173    pVM->csam.s.cPossibleCodePages = 0;
     2174    return VINF_SUCCESS;
     2175}
     2176
     2177/**
     2178 * Perform any pending actions
     2179 *
     2180 * @returns VBox status code.
     2181 * @param   pVM         The VM to operate on.
     2182 */
     2183CSAMR3DECL(int) CSAMR3DoPendingAction(PVM pVM)
     2184{
     2185    csamR3FlushDirtyPages(pVM);
     2186    csamR3FlushCodePages(pVM);
     2187
     2188    VM_FF_CLEAR(pVM, VM_FF_CSAM_PENDING_ACTION);
    21462189    return VINF_SUCCESS;
    21472190}
  • trunk/src/VBox/VMM/PATM/CSAMInternal.h

    r518 r1830  
    4040/** Scanned and approved by CSAM (tm). */
    4141/** NOTE: Must be identical to the one defined in PGMInternal.h!! */
    42 #define PGM_PTFLAGS_CSAM_VALIDATED  BIT64(11)
     42#define PGM_PTFLAGS_CSAM_VALIDATED              BIT64(11)
    4343#endif
    4444
    4545/** @} */
    4646
    47 #define CSAM_SSM_VERSION                       13
    48 
    49 #define CSAM_PGDIRBMP_CHUNKS                   1024
    50 
    51 #define CSAM_PAGE_BITMAP_SIZE                  (PAGE_SIZE/(sizeof(uint8_t)*8))
     47#define CSAM_SSM_VERSION                        14
     48
     49#define CSAM_PGDIRBMP_CHUNKS                    1024
     50
     51#define CSAM_PAGE_BITMAP_SIZE                   (PAGE_SIZE/(sizeof(uint8_t)*8))
    5252
    5353/* Maximum nr of dirty page that are cached. */
    54 #define CSAM_MAX_DIRTY_PAGES                   32
     54#define CSAM_MAX_DIRTY_PAGES                    32
    5555
    5656/* Maximum number of cached addresses of dangerous instructions that have been scanned before. */
    57 #define CSAM_MAX_DANGR_INSTR                   16 /* power of two! */
    58 #define CSAM_MAX_DANGR_INSTR_MASK              (CSAM_MAX_DANGR_INSTR-1)
    59 
    60 
    61 #define CSAM_MAX_CALLEXIT_RET                  16
     57#define CSAM_MAX_DANGR_INSTR                    16 /* power of two! */
     58#define CSAM_MAX_DANGR_INSTR_MASK               (CSAM_MAX_DANGR_INSTR-1)
     59
     60/* Maximum number of possible dangerous code pages that we'll flush after a world switch */
     61#define CSAM_MAX_CODE_PAGES_FLUSH               32
     62
     63#define CSAM_MAX_CALLEXIT_RET                   16
    6264
    6365/* copy from PATMInternal.h */
    64 #define SIZEOF_NEARJUMP32                  5 //opcode byte + 4 byte relative offset
     66#define SIZEOF_NEARJUMP32                       5 //opcode byte + 4 byte relative offset
    6567
    6668typedef struct
     
    174176    RTGCPTR             pvDirtyBasePage[CSAM_MAX_DIRTY_PAGES];
    175177    RTGCPTR             pvDirtyFaultPage[CSAM_MAX_DIRTY_PAGES];
     178
     179    /* To keep track of possible code pages */
     180    uint32_t            cPossibleCodePages;
     181    RTGCPTR             pvPossibleCodePage[CSAM_MAX_CODE_PAGES_FLUSH];
    176182
    177183    /* Set when scanning has started. */
  • trunk/src/VBox/VMM/PATM/VMMAll/CSAMAll.cpp

    r23 r1830  
    175175 * @returns false if the page was already scanned.
    176176 * @param   pVM         The VM to operate on.
    177  * @param   GCPtr       GC pointer of page table entry
     177 * @param   GCPtr       GC pointer of page
    178178 */
    179179CSAMDECL(bool) CSAMDoesPageNeedScanning(PVM pVM, RTGCPTR GCPtr)
     
    189189}
    190190
     191
     192/**
     193 * Remember a possible code page for later inspection
     194 *
     195 * @returns VBox status code.
     196 * @param   pVM         The VM to operate on.
     197 * @param   GCPtr       GC pointer of page
     198 */
     199CSAMDECL(void) CSAMMarkPossibleCodePage(PVM pVM, RTGCPTR GCPtr)
     200{
     201    if (pVM->csam.s.cPossibleCodePages < RT_ELEMENTS(pVM->csam.s.pvPossibleCodePage))
     202    {
     203        pVM->csam.s.pvPossibleCodePage[pVM->csam.s.cPossibleCodePages++] = GCPtr;
     204    }
     205    return;
     206}
     207
     208
    191209/**
    192210 * Turn on code scanning
  • trunk/src/VBox/VMM/PATM/VMMGC/CSAMGC.cpp

    r1352 r1830  
    114114    }
    115115
    116     VM_FF_SET(pVM, VM_FF_CSAM_FLUSH_DIRTY_PAGE);
     116    VM_FF_SET(pVM, VM_FF_CSAM_PENDING_ACTION);
    117117
    118118    /* Note that pvFault might be a different address in case of aliases. So use pvRange + offset instead!. */
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