VirtualBox

Changeset 36937 in vbox for trunk/src/VBox/VMM/include


Ignore:
Timestamp:
May 3, 2011 2:11:41 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71524
Message:

PGMPAGE: HCPhys + ID should be made bitfields as well, because the page id field is too small.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r36935 r36937  
    691691typedef struct PGMPAGE
    692692{
    693     /** The physical address and the Page ID. */
    694     RTHCPHYS    HCPhysAndPageID;
    695693    union
    696694    {
     
    698696        struct
    699697        {
     698            /** The physical address and the Page ID. */
     699            RTHCPHYS    HCPhysAndPageID;
     700
    700701            /** 7:0   - The physical handler state
    701702             *  (PGM_PAGE_HNDL_PHYS_STATE_*). */
     
    722723            /** 31:22 - PTE index for usage tracking (page pool). */
    723724            uint32_t    u10PteIdx   : 10;
     725
     726            /** Usage tracking (page pool). */
     727            uint16_t    u16TrackingY;
     728            /** The number of read locks on this page. */
     729            uint8_t     cReadLocksY;
     730            /** The number of write locks on this page. */
     731            uint8_t     cWriteLocksY;
    724732        } bit;
    725         /** 32-bit integer view. */
    726         uint32_t    u;
     733
     734        /** 64-bit integer view. */
     735        uint64_t    au64[2];
    727736        /** 16-bit view. */
    728         uint16_t    au16[2];
     737        uint32_t    au32[4];
     738        /** 16-bit view. */
     739        uint16_t    au16[8];
    729740        /** 8-bit view. */
    730         uint8_t     au8[4];
     741        uint8_t     au8[16];
    731742    } u1;
    732     /** Usage tracking (page pool). */
    733     uint16_t    u16TrackingY;
    734     /** The number of read locks on this page. */
    735     uint8_t     cReadLocksY;
    736     /** The number of write locks on this page. */
    737     uint8_t     cWriteLocksY;
    738743} PGMPAGE;
    739744AssertCompileSize(PGMPAGE, 16);
     
    752757#define PGM_PAGE_CLEAR(a_pPage) \
    753758    do { \
    754         (a_pPage)->HCPhysAndPageID     = 0; \
    755         (a_pPage)->u1.u                = 0; \
    756         (a_pPage)->u16TrackingY        = 0; \
    757         (a_pPage)->cReadLocksY         = 0; \
    758         (a_pPage)->cWriteLocksY        = 0; \
     759        (a_pPage)->u1.au64[0] = 0; \
     760        (a_pPage)->u1.au64[1] = 0; \
    759761    } while (0)
    760762
     
    767769        RTHCPHYS SetHCPhysTmp = (a_HCPhys); \
    768770        AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
    769         (a_pPage)->u1.u                 = 0; \
    770         (a_pPage)->u16TrackingY         = 0; \
    771         (a_pPage)->cReadLocksY          = 0; \
    772         (a_pPage)->cWriteLocksY         = 0; \
    773         (a_pPage)->HCPhysAndPageID      = (SetHCPhysTmp << (28-12)) | ((a_idPage) & UINT32_C(0x0fffffff)); \
    774         (a_pPage)->u1.bit.uStateY       = (a_uState); \
    775         (a_pPage)->u1.bit.uTypeY        = (a_uType); \
     771        (a_pPage)->u1.bit.HCPhysAndPageID = (SetHCPhysTmp << (28-12)) | ((a_idPage) & UINT32_C(0x0fffffff)); \
     772        (a_pPage)->u1.au64[1]             = 0; \
     773        (a_pPage)->u1.bit.uStateY         = (a_uState); \
     774        (a_pPage)->u1.bit.uTypeY          = (a_uType); \
    776775    } while (0)
    777776
     
    829828 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    830829 */
    831 #define PGM_PAGE_GET_HCPHYS(a_pPage)            ( ((a_pPage)->HCPhysAndPageID >> 28) << 12 )
     830#define PGM_PAGE_GET_HCPHYS(a_pPage)            ( ((a_pPage)->u1.bit.HCPhysAndPageID >> 28) << 12 )
    832831
    833832/**
     
    840839        RTHCPHYS const SetHCPhysTmp = (a_HCPhys); \
    841840        AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
    842         (a_pPage)->HCPhysAndPageID = ((a_pPage)->HCPhysAndPageID & UINT32_C(0x0fffffff)) \
    843                                    | (SetHCPhysTmp << (28-12)); \
     841        (a_pPage)->u1.bit.HCPhysAndPageID = ((a_pPage)->u1.bit.HCPhysAndPageID & UINT32_C(0x0fffffff)) \
     842                                          | (SetHCPhysTmp << (28-12)); \
    844843    } while (0)
    845844
     
    849848 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    850849 */
    851 #define PGM_PAGE_GET_PAGEID(a_pPage)            (  (uint32_t)((a_pPage)->HCPhysAndPageID & UINT32_C(0x0fffffff)) )
     850#define PGM_PAGE_GET_PAGEID(a_pPage)            (  (uint32_t)((a_pPage)->u1.bit.HCPhysAndPageID & UINT32_C(0x0fffffff)) )
    852851
    853852/**
     
    858857#define PGM_PAGE_SET_PAGEID(a_pPage, a_idPage) \
    859858    do { \
    860         (a_pPage)->HCPhysAndPageID = (((a_pPage)->HCPhysAndPageID) & UINT64_C(0xfffffffff0000000)) \
    861                                    | ((a_idPage) & UINT32_C(0x0fffffff)); \
     859        (a_pPage)->u1.bit.HCPhysAndPageID = (((a_pPage)->u1.bit.HCPhysAndPageID) & UINT64_C(0xfffffffff0000000)) \
     860                                          | ((a_idPage) & UINT32_C(0x0fffffff)); \
    862861    } while (0)
    863862
     
    874873 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    875874 */
    876 #define PGM_PAGE_GET_PAGE_IN_CHUNK(a_pPage)     ( (uint32_t)((a_pPage)->HCPhysAndPageID & GMM_PAGEID_IDX_MASK) )
     875#define PGM_PAGE_GET_PAGE_IN_CHUNK(a_pPage)     ( (uint32_t)((a_pPage)->u1.bit.HCPhysAndPageID & GMM_PAGEID_IDX_MASK) )
    877876
    878877/**
     
    11141113#ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
    11151114# define PGM_PAGE_HAS_ANY_HANDLERS(a_pPage) \
    1116     ( ((a_pPage)->u1.u & UINT16_C(0x0303)) != 0 )
     1115    ( ((a_pPage)->u1.au32[2] & UINT16_C(0x0303)) != 0 )
    11171116#else
    11181117# define PGM_PAGE_HAS_ANY_HANDLERS(a_pPage) \
     
    11281127#ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
    11291128# define PGM_PAGE_HAS_ACTIVE_HANDLERS(a_pPage) \
    1130     ( ((a_pPage)->u1.u & UINT16_C(0x0202)) != 0 )
     1129    ( ((a_pPage)->u1.au32[2] & UINT16_C(0x0202)) != 0 )
    11311130#else
    11321131# define PGM_PAGE_HAS_ACTIVE_HANDLERS(a_pPage) \
     
    11421141#ifdef PGM_PAGE_WITH_OPTIMIZED_HANDLER_ACCESS
    11431142# define PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(a_pPage) \
    1144     (   ( ((a_pPage)->u1.au8[0] | (a_pPage)->u1.au8[1]) & UINT8_C(0x3) ) \
     1143    (   ( ((a_pPage)->u1.au8[8] | (a_pPage)->u1.au8[9]) & UINT8_C(0x3) ) \
    11451144     == PGM_PAGE_HNDL_PHYS_STATE_ALL )
    11461145#else
     
    11561155 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    11571156 */
    1158 #define PGM_PAGE_GET_TRACKING(a_pPage)          ( (a_pPage)->u16TrackingY )
     1157#define PGM_PAGE_GET_TRACKING(a_pPage)          ( (a_pPage)->u1.bit.u16TrackingY )
    11591158
    11601159/** @def PGM_PAGE_SET_TRACKING
     
    11641163 */
    11651164#define PGM_PAGE_SET_TRACKING(a_pPage, a_u16TrackingData) \
    1166     do { (a_pPage)->u16TrackingY = (a_u16TrackingData); } while (0)
     1165    do { (a_pPage)->u1.bit.u16TrackingY = (a_u16TrackingData); } while (0)
    11671166
    11681167/** @def PGM_PAGE_GET_TD_CREFS
     
    11901189 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    11911190 */
    1192 #define PGM_PAGE_GET_READ_LOCKS(a_pPage)        ( (a_pPage)->cReadLocksY )
     1191#define PGM_PAGE_GET_READ_LOCKS(a_pPage)        ( (a_pPage)->u1.bit.cReadLocksY )
    11931192
    11941193/** Get the write lock count.
     
    11961195 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    11971196 */
    1198 #define PGM_PAGE_GET_WRITE_LOCKS(a_pPage)       ( (a_pPage)->cWriteLocksY )
     1197#define PGM_PAGE_GET_WRITE_LOCKS(a_pPage)       ( (a_pPage)->u1.bit.cWriteLocksY )
    11991198
    12001199/** Decrement the read lock counter.
    12011200 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    12021201 */
    1203 #define PGM_PAGE_DEC_READ_LOCKS(a_pPage)        do { --(a_pPage)->cReadLocksY; } while (0)
     1202#define PGM_PAGE_DEC_READ_LOCKS(a_pPage)        do { --(a_pPage)->u1.bit.cReadLocksY; } while (0)
    12041203
    12051204/** Decrement the write lock counter.
    12061205 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    12071206 */
    1208 #define PGM_PAGE_DEC_WRITE_LOCKS(a_pPage)       do { --(a_pPage)->cWriteLocksY; } while (0)
     1207#define PGM_PAGE_DEC_WRITE_LOCKS(a_pPage)       do { --(a_pPage)->u1.bit.cWriteLocksY; } while (0)
    12091208
    12101209/** Increment the read lock counter.
    12111210 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    12121211 */
    1213 #define PGM_PAGE_INC_READ_LOCKS(a_pPage)        do { ++(a_pPage)->cReadLocksY; } while (0)
     1212#define PGM_PAGE_INC_READ_LOCKS(a_pPage)        do { ++(a_pPage)->u1.bit.cReadLocksY; } while (0)
    12141213
    12151214/** Increment the write lock counter.
    12161215 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    12171216 */
    1218 #define PGM_PAGE_INC_WRITE_LOCKS(a_pPage)       do { ++(a_pPage)->cWriteLocksY; } while (0)
     1217#define PGM_PAGE_INC_WRITE_LOCKS(a_pPage)       do { ++(a_pPage)->u1.bit.cWriteLocksY; } while (0)
    12191218
    12201219
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