VirtualBox

Changeset 23477 in vbox


Ignore:
Timestamp:
Oct 1, 2009 1:04:42 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53098
Message:

PGMPAGE: Spell it out for the compiler. (soon, no bitfields)

File:
1 edited

Legend:

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

    r23471 r23477  
    620620/** @} */
    621621
    622 /** When non-zero, PGMPAGE is packed. When zero some of the important fields
    623  *  are expaned to 8-bit size to allow the compiler to use byte access. */
    624 #define PGM_PAGE_PACKED     0
    625 
    626622/**
    627623 * A Physical Guest Page tracking structure.
     
    637633    /** The physical address and the Page ID. */
    638634    RTHCPHYS    HCPhysAndPageID;
    639     /** The page state. */
    640     uint32_t    u2StateY : (PGM_PAGE_PACKED ? 2 : 8);
    641     /** The page type (PGMPAGETYPE). */
    642     uint32_t    u3TypeY : (PGM_PAGE_PACKED ? 3 : 8);
    643     /** The physical handler state (PGM_PAGE_HNDL_PHYS_STATE*) */
    644     uint32_t    u2HandlerPhysStateY : (PGM_PAGE_PACKED ? 2 : 8);
     635    /** The page state.
     636     * Only 2 bits are really needed for this. */
     637#ifdef PGM_PAGE_WITH_BIT_FIELD
     638    uint32_t    uStateY : 8;
     639#else
     640    uint8_t     uStateY;
     641#endif
     642    /** The page type (PGMPAGETYPE).
     643     * Only 3 bits are really needed for this. */
     644#ifdef PGM_PAGE_WITH_BIT_FIELD
     645    uint32_t    uTypeY : 8;
     646#else
     647    uint8_t     uTypeY;
     648#endif
     649
     650    /** The physical handler state (PGM_PAGE_HNDL_PHYS_STATE*).
     651     * Only 2 bits are really needed for this.  */
     652#ifdef PGM_PAGE_WITH_BIT_FIELD
     653    uint32_t    uHandlerPhysStateY : 8;
     654#else
     655    uint8_t     uHandlerPhysStateY;
     656#endif
     657
     658#ifdef PGM_PAGE_WITH_BIT_FIELD
    645659    /** The virtual handler state (PGM_PAGE_HNDL_VIRT_STATE*) */
    646660    uint32_t    u2HandlerVirtStateY : 2;
     661    /** For later. */
     662    uint32_t    afSomethingElse0 : 5;
    647663    /** Flag indicating that a write monitored page was written to when set. */
    648664    uint32_t    fWrittenToY : 1;
    649     /** For later. */
    650     uint32_t    afSomethingElse0 : (PGM_PAGE_PACKED ? 17+5 : 5);
     665#else
     666    /** Combination of u2HandlerVirtStateY, fWrittenToY and 5 unused bits. */
     667    uint8_t     f8MiscY;
     668#endif
     669
    651670    /** Usage tracking (page pool). */
    652671    uint16_t    u16TrackingY;
     
    669688 * @param   pPage       Pointer to the physical guest page tracking structure.
    670689 */
    671 #define PGM_PAGE_CLEAR(pPage) \
     690#ifdef PGM_PAGE_WITH_BIT_FIELD
     691# define PGM_PAGE_CLEAR(pPage) \
    672692    do { \
    673693        (pPage)->HCPhysAndPageID     = 0; \
    674         (pPage)->u2StateY            = 0; \
     694        (pPage)->uStateY             = 0; \
    675695        (pPage)->fWrittenToY         = 0; \
    676696        (pPage)->afSomethingElse0    = 0; \
    677         (pPage)->u3TypeY             = 0; \
    678         (pPage)->u2HandlerPhysStateY = 0; \
     697        (pPage)->uTypeY              = 0; \
     698        (pPage)->uHandlerPhysStateY = 0; \
    679699        (pPage)->u2HandlerVirtStateY = 0; \
    680700        (pPage)->u16TrackingY        = 0; \
     
    682702        (pPage)->cWriteLocksY        = 0; \
    683703    } while (0)
     704#else
     705# define PGM_PAGE_CLEAR(pPage) \
     706    do { \
     707        (pPage)->HCPhysAndPageID     = 0; \
     708        (pPage)->uStateY             = 0; \
     709        (pPage)->uTypeY              = 0; \
     710        (pPage)->uHandlerPhysStateY  = 0; \
     711        (pPage)->f8MiscY             = 0; \
     712        (pPage)->u16TrackingY        = 0; \
     713        (pPage)->cReadLocksY         = 0; \
     714        (pPage)->cWriteLocksY        = 0; \
     715    } while (0)
     716#endif
    684717
    685718/**
     
    687720 * @param   pPage       Pointer to the physical guest page tracking structure.
    688721 */
    689 #define PGM_PAGE_INIT(pPage, _HCPhys, _idPage, _uType, _uState) \
     722#ifdef PGM_PAGE_WITH_BIT_FIELD
     723# define PGM_PAGE_INIT(pPage, _HCPhys, _idPage, _uType, _uState) \
    690724    do { \
    691725        RTHCPHYS SetHCPhysTmp = (_HCPhys); \
    692726        AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
    693727        (pPage)->HCPhysAndPageID     = (SetHCPhysTmp << (28-12)) | ((_idPage) & UINT32_C(0x0fffffff)); \
    694         (pPage)->u2StateY            = (_uState); \
     728        (pPage)->uStateY             = (_uState); \
    695729        (pPage)->fWrittenToY         = 0; \
    696730        (pPage)->afSomethingElse0    = 0; \
    697         (pPage)->u3TypeY             = (_uType); \
    698         (pPage)->u2HandlerPhysStateY = 0; \
     731        (pPage)->uTypeY              = (_uType); \
     732        (pPage)->uHandlerPhysStateY = 0; \
    699733        (pPage)->u2HandlerVirtStateY = 0; \
    700734        (pPage)->u16TrackingY        = 0; \
     
    702736        (pPage)->cWriteLocksY        = 0; \
    703737    } while (0)
     738#else
     739# define PGM_PAGE_INIT(pPage, _HCPhys, _idPage, _uType, _uState) \
     740    do { \
     741        RTHCPHYS SetHCPhysTmp = (_HCPhys); \
     742        AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \
     743        (pPage)->HCPhysAndPageID     = (SetHCPhysTmp << (28-12)) | ((_idPage) & UINT32_C(0x0fffffff)); \
     744        (pPage)->uStateY             = (_uState); \
     745        (pPage)->uTypeY              = (_uType); \
     746        (pPage)->uHandlerPhysStateY  = 0; \
     747        (pPage)->f8MiscY             = 0; \
     748        (pPage)->u16TrackingY        = 0; \
     749        (pPage)->cReadLocksY         = 0; \
     750        (pPage)->cWriteLocksY        = 0; \
     751    } while (0)
     752#endif
    704753
    705754/**
     
    713762
    714763
    715 /** @name The Page state, PGMPAGE::u2StateY.
     764/** @name The Page state, PGMPAGE::uStateY.
    716765 * @{ */
    717766/** The zero page.
     
    739788 * @param   pPage       Pointer to the physical guest page tracking structure.
    740789 */
    741 #define PGM_PAGE_GET_STATE(pPage)           ( (pPage)->u2StateY )
     790#define PGM_PAGE_GET_STATE(pPage)           ( (pPage)->uStateY )
    742791
    743792/**
     
    746795 * @param   _uState     The new page state.
    747796 */
    748 #define PGM_PAGE_SET_STATE(pPage, _uState)  do { (pPage)->u2StateY = (_uState); } while (0)
     797#define PGM_PAGE_SET_STATE(pPage, _uState)  do { (pPage)->uStateY = (_uState); } while (0)
    749798
    750799
     
    791840 * @param   pPage       Pointer to the physical guest page tracking structure.
    792841 */
    793 #define PGM_PAGE_GET_CHUNKID(pPage)         ( (uint32_t)((pPage)->HCPhysAndPageID & UINT32_C(0x0fffffff)) >> GMM_CHUNKID_SHIFT )
     842#define PGM_PAGE_GET_CHUNKID(pPage)         ( PGM_PAGE_GET_PAGEID(pPage) >> GMM_CHUNKID_SHIFT )
    794843
    795844/**
     
    805854 * @param   pPage       Pointer to the physical guest page tracking structure.
    806855 */
    807 #define PGM_PAGE_GET_TYPE(pPage)            (pPage)->u3TypeY
     856#define PGM_PAGE_GET_TYPE(pPage)            (pPage)->uTypeY
    808857
    809858/**
     
    812861 * @param   _enmType    The new page type (PGMPAGETYPE).
    813862 */
    814 #define PGM_PAGE_SET_TYPE(pPage, _enmType)  do { (pPage)->u3TypeY = (_enmType); } while (0)
     863#define PGM_PAGE_SET_TYPE(pPage, _enmType)  do { (pPage)->uTypeY = (_enmType); } while (0)
    815864
    816865/**
     
    819868 * @param   pPage       Pointer to the physical guest page tracking structure.
    820869 */
    821 #define PGM_PAGE_IS_MMIO(pPage)             ( (pPage)->u3TypeY == PGMPAGETYPE_MMIO )
     870#define PGM_PAGE_IS_MMIO(pPage)             ( (pPage)->uTypeY == PGMPAGETYPE_MMIO )
    822871
    823872/**
     
    826875 * @param   pPage       Pointer to the physical guest page tracking structure.
    827876 */
    828 #define PGM_PAGE_IS_ZERO(pPage)             ( (pPage)->u2StateY == PGM_PAGE_STATE_ZERO )
     877#define PGM_PAGE_IS_ZERO(pPage)             ( (pPage)->uStateY == PGM_PAGE_STATE_ZERO )
    829878
    830879/**
     
    833882 * @param   pPage       Pointer to the physical guest page tracking structure.
    834883 */
    835 #define PGM_PAGE_IS_SHARED(pPage)           ( (pPage)->u2StateY == PGM_PAGE_STATE_SHARED )
     884#define PGM_PAGE_IS_SHARED(pPage)           ( (pPage)->uStateY == PGM_PAGE_STATE_SHARED )
    836885
    837886
     
    840889 * @param   pPage       Pointer to the physical guest page tracking structure.
    841890 */
     891#ifdef PGM_PAGE_WITH_BIT_FIELD
    842892#define PGM_PAGE_SET_WRITTEN_TO(pPage)      do { (pPage)->fWrittenToY = 1; } while (0)
     893#else
     894#define PGM_PAGE_SET_WRITTEN_TO(pPage)      do { (pPage)->f8MiscY |= UINT8_C(0x80); } while (0)
     895#endif
    843896
    844897/**
     
    846899 * @param   pPage       Pointer to the physical guest page tracking structure.
    847900 */
     901#ifdef PGM_PAGE_WITH_BIT_FIELD
    848902#define PGM_PAGE_CLEAR_WRITTEN_TO(pPage)    do { (pPage)->fWrittenToY = 0; } while (0)
     903#else
     904#define PGM_PAGE_CLEAR_WRITTEN_TO(pPage)    do { (pPage)->f8MiscY &= UINT8_C(0x7f); } while (0)
     905#endif
    849906
    850907/**
     
    853910 * @param   pPage       Pointer to the physical guest page tracking structure.
    854911 */
     912#ifdef PGM_PAGE_WITH_BIT_FIELD
    855913#define PGM_PAGE_IS_WRITTEN_TO(pPage)       ( (pPage)->fWrittenToY )
    856 
    857 
    858 /** @name Physical Access Handler State values (PGMPAGE::u2HandlerPhysStateY).
     914#else
     915#define PGM_PAGE_IS_WRITTEN_TO(pPage)       ( !!((pPage)->f8MiscY & UINT8_C(0x80)) )
     916#endif
     917
     918
     919/** @name Physical Access Handler State values (PGMPAGE::uHandlerPhysStateY).
    859920 *
    860921 * @remarks The values are assigned in order of priority, so we can calculate
     
    877938 */
    878939#define PGM_PAGE_GET_HNDL_PHYS_STATE(pPage)  \
    879     ( (pPage)->u2HandlerPhysStateY )
     940    ( (pPage)->uHandlerPhysStateY )
    880941
    881942/**
     
    885946 */
    886947#define PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, _uState) \
    887     do { (pPage)->u2HandlerPhysStateY = (_uState); } while (0)
     948    do { (pPage)->uHandlerPhysStateY = (_uState); } while (0)
    888949
    889950/**
     
    893954 */
    894955#define PGM_PAGE_HAS_ANY_PHYSICAL_HANDLERS(pPage) \
    895     ( (pPage)->u2HandlerPhysStateY != PGM_PAGE_HNDL_PHYS_STATE_NONE )
     956    ( PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_NONE )
    896957
    897958/**
     
    901962 */
    902963#define PGM_PAGE_HAS_ACTIVE_PHYSICAL_HANDLERS(pPage) \
    903     ( (pPage)->u2HandlerPhysStateY >= PGM_PAGE_HNDL_PHYS_STATE_WRITE )
     964    ( PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) >= PGM_PAGE_HNDL_PHYS_STATE_WRITE )
    904965
    905966
     
    923984 * @param   pPage       Pointer to the physical guest page tracking structure.
    924985 */
    925 #define PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) \
    926     ( (pPage)->u2HandlerVirtStateY )
     986#ifdef PGM_PAGE_WITH_BIT_FIELD
     987#define PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) ( (pPage)->u2HandlerVirtStateY )
     988#else
     989#define PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) ( (pPage)->f8MiscY & UINT8_C(0x03) )
     990#endif
    927991
    928992/**
     
    931995 * @param   _uState     The new state value.
    932996 */
     997#ifdef PGM_PAGE_WITH_BIT_FIELD
    933998#define PGM_PAGE_SET_HNDL_VIRT_STATE(pPage, _uState) \
    934999    do { (pPage)->u2HandlerVirtStateY = (_uState); } while (0)
     1000#else
     1001#define PGM_PAGE_SET_HNDL_VIRT_STATE(pPage, _uState) \
     1002    do { \
     1003        (pPage)->f8MiscY = ((pPage)->f8MiscY & UINT8_C(0xfc)) \
     1004                         | ((_uState)        & UINT8_C(0x03)); \
     1005    } while (0)
     1006#endif
    9351007
    9361008/**
     
    9401012 */
    9411013#define PGM_PAGE_HAS_ANY_VIRTUAL_HANDLERS(pPage) \
    942     ( (pPage)->u2HandlerVirtStateY != PGM_PAGE_HNDL_VIRT_STATE_NONE )
     1014    ( PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) != PGM_PAGE_HNDL_VIRT_STATE_NONE )
    9431015
    9441016/**
     
    9591031 */
    9601032#define PGM_PAGE_HAS_ANY_HANDLERS(pPage) \
    961     (   (pPage)->u2HandlerPhysStateY != PGM_PAGE_HNDL_PHYS_STATE_NONE \
    962      || (pPage)->u2HandlerVirtStateY != PGM_PAGE_HNDL_VIRT_STATE_NONE )
     1033    (   PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_NONE \
     1034     || PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) != PGM_PAGE_HNDL_VIRT_STATE_NONE )
    9631035
    9641036/**
     
    9681040 */
    9691041#define PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) \
    970     (   (pPage)->u2HandlerPhysStateY >= PGM_PAGE_HNDL_PHYS_STATE_WRITE \
    971      || (pPage)->u2HandlerVirtStateY >= PGM_PAGE_HNDL_VIRT_STATE_WRITE )
     1042    (   PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) >= PGM_PAGE_HNDL_PHYS_STATE_WRITE \
     1043     || PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) >= PGM_PAGE_HNDL_VIRT_STATE_WRITE )
    9721044
    9731045/**
     
    9771049 */
    9781050#define PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage) \
    979     (   (pPage)->u2HandlerPhysStateY == PGM_PAGE_HNDL_PHYS_STATE_ALL \
    980      || (pPage)->u2HandlerVirtStateY == PGM_PAGE_HNDL_VIRT_STATE_ALL )
     1051    (   PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL \
     1052     || PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) == PGM_PAGE_HNDL_VIRT_STATE_ALL )
    9811053
    9821054
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