Changeset 23477 in vbox
- Timestamp:
- Oct 1, 2009 1:04:42 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 53098
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGMInternal.h
r23471 r23477 620 620 /** @} */ 621 621 622 /** When non-zero, PGMPAGE is packed. When zero some of the important fields623 * are expaned to 8-bit size to allow the compiler to use byte access. */624 #define PGM_PAGE_PACKED 0625 626 622 /** 627 623 * A Physical Guest Page tracking structure. … … 637 633 /** The physical address and the Page ID. */ 638 634 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 645 659 /** The virtual handler state (PGM_PAGE_HNDL_VIRT_STATE*) */ 646 660 uint32_t u2HandlerVirtStateY : 2; 661 /** For later. */ 662 uint32_t afSomethingElse0 : 5; 647 663 /** Flag indicating that a write monitored page was written to when set. */ 648 664 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 651 670 /** Usage tracking (page pool). */ 652 671 uint16_t u16TrackingY; … … 669 688 * @param pPage Pointer to the physical guest page tracking structure. 670 689 */ 671 #define PGM_PAGE_CLEAR(pPage) \ 690 #ifdef PGM_PAGE_WITH_BIT_FIELD 691 # define PGM_PAGE_CLEAR(pPage) \ 672 692 do { \ 673 693 (pPage)->HCPhysAndPageID = 0; \ 674 (pPage)->u 2StateY= 0; \694 (pPage)->uStateY = 0; \ 675 695 (pPage)->fWrittenToY = 0; \ 676 696 (pPage)->afSomethingElse0 = 0; \ 677 (pPage)->u 3TypeY= 0; \678 (pPage)->u 2HandlerPhysStateY= 0; \697 (pPage)->uTypeY = 0; \ 698 (pPage)->uHandlerPhysStateY = 0; \ 679 699 (pPage)->u2HandlerVirtStateY = 0; \ 680 700 (pPage)->u16TrackingY = 0; \ … … 682 702 (pPage)->cWriteLocksY = 0; \ 683 703 } 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 684 717 685 718 /** … … 687 720 * @param pPage Pointer to the physical guest page tracking structure. 688 721 */ 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) \ 690 724 do { \ 691 725 RTHCPHYS SetHCPhysTmp = (_HCPhys); \ 692 726 AssertFatal(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \ 693 727 (pPage)->HCPhysAndPageID = (SetHCPhysTmp << (28-12)) | ((_idPage) & UINT32_C(0x0fffffff)); \ 694 (pPage)->u 2StateY= (_uState); \728 (pPage)->uStateY = (_uState); \ 695 729 (pPage)->fWrittenToY = 0; \ 696 730 (pPage)->afSomethingElse0 = 0; \ 697 (pPage)->u 3TypeY= (_uType); \698 (pPage)->u 2HandlerPhysStateY= 0; \731 (pPage)->uTypeY = (_uType); \ 732 (pPage)->uHandlerPhysStateY = 0; \ 699 733 (pPage)->u2HandlerVirtStateY = 0; \ 700 734 (pPage)->u16TrackingY = 0; \ … … 702 736 (pPage)->cWriteLocksY = 0; \ 703 737 } 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 704 753 705 754 /** … … 713 762 714 763 715 /** @name The Page state, PGMPAGE::u 2StateY.764 /** @name The Page state, PGMPAGE::uStateY. 716 765 * @{ */ 717 766 /** The zero page. … … 739 788 * @param pPage Pointer to the physical guest page tracking structure. 740 789 */ 741 #define PGM_PAGE_GET_STATE(pPage) ( (pPage)->u 2StateY )790 #define PGM_PAGE_GET_STATE(pPage) ( (pPage)->uStateY ) 742 791 743 792 /** … … 746 795 * @param _uState The new page state. 747 796 */ 748 #define PGM_PAGE_SET_STATE(pPage, _uState) do { (pPage)->u 2StateY = (_uState); } while (0)797 #define PGM_PAGE_SET_STATE(pPage, _uState) do { (pPage)->uStateY = (_uState); } while (0) 749 798 750 799 … … 791 840 * @param pPage Pointer to the physical guest page tracking structure. 792 841 */ 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 ) 794 843 795 844 /** … … 805 854 * @param pPage Pointer to the physical guest page tracking structure. 806 855 */ 807 #define PGM_PAGE_GET_TYPE(pPage) (pPage)->u 3TypeY856 #define PGM_PAGE_GET_TYPE(pPage) (pPage)->uTypeY 808 857 809 858 /** … … 812 861 * @param _enmType The new page type (PGMPAGETYPE). 813 862 */ 814 #define PGM_PAGE_SET_TYPE(pPage, _enmType) do { (pPage)->u 3TypeY = (_enmType); } while (0)863 #define PGM_PAGE_SET_TYPE(pPage, _enmType) do { (pPage)->uTypeY = (_enmType); } while (0) 815 864 816 865 /** … … 819 868 * @param pPage Pointer to the physical guest page tracking structure. 820 869 */ 821 #define PGM_PAGE_IS_MMIO(pPage) ( (pPage)->u 3TypeY == PGMPAGETYPE_MMIO )870 #define PGM_PAGE_IS_MMIO(pPage) ( (pPage)->uTypeY == PGMPAGETYPE_MMIO ) 822 871 823 872 /** … … 826 875 * @param pPage Pointer to the physical guest page tracking structure. 827 876 */ 828 #define PGM_PAGE_IS_ZERO(pPage) ( (pPage)->u 2StateY == PGM_PAGE_STATE_ZERO )877 #define PGM_PAGE_IS_ZERO(pPage) ( (pPage)->uStateY == PGM_PAGE_STATE_ZERO ) 829 878 830 879 /** … … 833 882 * @param pPage Pointer to the physical guest page tracking structure. 834 883 */ 835 #define PGM_PAGE_IS_SHARED(pPage) ( (pPage)->u 2StateY == PGM_PAGE_STATE_SHARED )884 #define PGM_PAGE_IS_SHARED(pPage) ( (pPage)->uStateY == PGM_PAGE_STATE_SHARED ) 836 885 837 886 … … 840 889 * @param pPage Pointer to the physical guest page tracking structure. 841 890 */ 891 #ifdef PGM_PAGE_WITH_BIT_FIELD 842 892 #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 843 896 844 897 /** … … 846 899 * @param pPage Pointer to the physical guest page tracking structure. 847 900 */ 901 #ifdef PGM_PAGE_WITH_BIT_FIELD 848 902 #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 849 906 850 907 /** … … 853 910 * @param pPage Pointer to the physical guest page tracking structure. 854 911 */ 912 #ifdef PGM_PAGE_WITH_BIT_FIELD 855 913 #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). 859 920 * 860 921 * @remarks The values are assigned in order of priority, so we can calculate … … 877 938 */ 878 939 #define PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) \ 879 ( (pPage)->u 2HandlerPhysStateY )940 ( (pPage)->uHandlerPhysStateY ) 880 941 881 942 /** … … 885 946 */ 886 947 #define PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, _uState) \ 887 do { (pPage)->u 2HandlerPhysStateY = (_uState); } while (0)948 do { (pPage)->uHandlerPhysStateY = (_uState); } while (0) 888 949 889 950 /** … … 893 954 */ 894 955 #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 ) 896 957 897 958 /** … … 901 962 */ 902 963 #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 ) 904 965 905 966 … … 923 984 * @param pPage Pointer to the physical guest page tracking structure. 924 985 */ 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 927 991 928 992 /** … … 931 995 * @param _uState The new state value. 932 996 */ 997 #ifdef PGM_PAGE_WITH_BIT_FIELD 933 998 #define PGM_PAGE_SET_HNDL_VIRT_STATE(pPage, _uState) \ 934 999 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 935 1007 936 1008 /** … … 940 1012 */ 941 1013 #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 ) 943 1015 944 1016 /** … … 959 1031 */ 960 1032 #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 ) 963 1035 964 1036 /** … … 968 1040 */ 969 1041 #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 ) 972 1044 973 1045 /** … … 977 1049 */ 978 1050 #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 ) 981 1053 982 1054
Note:
See TracChangeset
for help on using the changeset viewer.