39
54
#undef SHW_POOL_ROOT_IDX
41
56
#if PGM_SHW_TYPE == PGM_TYPE_32BIT
43
# define PSHWPT PX86PT
44
# define SHWPTE X86PTE
45
# define PSHWPTE PX86PTE
47
# define PSHWPD PX86PD
48
# define SHWPDE X86PDE
49
# define PSHWPDE PX86PDE
50
# define SHW_PDE_PG_MASK X86_PDE_PG_MASK
51
# define SHW_PD_SHIFT X86_PD_SHIFT
52
# define SHW_PD_MASK X86_PD_MASK
53
# define SHW_TOTAL_PD_ENTRIES X86_PG_ENTRIES
54
# define SHW_PTE_PG_MASK X86_PTE_PG_MASK
55
# define SHW_PT_SHIFT X86_PT_SHIFT
56
# define SHW_PT_MASK X86_PT_MASK
57
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_PD
58
# define PSHWPT PX86PT
59
# define SHWPTE X86PTE
60
# define PSHWPTE PX86PTE
62
# define PSHWPD PX86PD
63
# define SHWPDE X86PDE
64
# define PSHWPDE PX86PDE
65
# define SHW_PDE_PG_MASK X86_PDE_PG_MASK
66
# define SHW_PD_SHIFT X86_PD_SHIFT
67
# define SHW_PD_MASK X86_PD_MASK
68
# define SHW_TOTAL_PD_ENTRIES X86_PG_ENTRIES
69
# define SHW_PTE_PG_MASK X86_PTE_PG_MASK
70
# define SHW_PTE_IS_P(Pte) ( (Pte).n.u1Present )
71
# define SHW_PTE_IS_RW(Pte) ( (Pte).n.u1Write )
72
# define SHW_PTE_IS_US(Pte) ( (Pte).n.u1User )
73
# define SHW_PTE_IS_A(Pte) ( (Pte).n.u1Accessed )
74
# define SHW_PTE_IS_D(Pte) ( (Pte).n.u1Dirty )
75
# define SHW_PTE_IS_P_RW(Pte) ( (Pte).n.u1Present && (Pte).n.u1Write )
76
# define SHW_PTE_IS_TRACK_DIRTY(Pte) ( !!((Pte).u & PGM_PTFLAGS_TRACK_DIRTY) )
77
# define SHW_PTE_GET_HCPHYS(Pte) ( (Pte).u & X86_PTE_PG_MASK )
78
# define SHW_PTE_LOG64(Pte) ( (uint64_t)(Pte).u )
79
# define SHW_PTE_GET_U(Pte) ( (Pte).u ) /**< Use with care. */
80
# define SHW_PTE_SET(Pte, uNew) do { (Pte).u = (uNew); } while (0)
81
# define SHW_PTE_ATOMIC_SET(Pte, uNew) do { ASMAtomicWriteU32(&(Pte).u, (uNew)); } while (0)
82
# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) do { ASMAtomicWriteU32(&(Pte).u, (Pte2).u); } while (0)
83
# define SHW_PTE_SET_RO(Pte) do { (Pte).n.u1Write = 0; } while (0)
84
# define SHW_PTE_SET_RW(Pte) do { (Pte).n.u1Write = 1; } while (0)
85
# define SHW_PT_SHIFT X86_PT_SHIFT
86
# define SHW_PT_MASK X86_PT_MASK
87
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_PD
59
89
#elif PGM_SHW_TYPE == PGM_TYPE_EPT
61
# define PSHWPT PEPTPT
62
# define SHWPTE EPTPTE
63
# define PSHWPTE PEPTPTE
65
# define PSHWPD PEPTPD
66
# define SHWPDE EPTPDE
67
# define PSHWPDE PEPTPDE
68
# define SHW_PDE_PG_MASK EPT_PDE_PG_MASK
69
# define SHW_PD_SHIFT EPT_PD_SHIFT
70
# define SHW_PD_MASK EPT_PD_MASK
71
# define SHW_PTE_PG_MASK EPT_PTE_PG_MASK
72
# define SHW_PT_SHIFT EPT_PT_SHIFT
73
# define SHW_PT_MASK EPT_PT_MASK
74
# define SHW_PDPT_SHIFT EPT_PDPT_SHIFT
75
# define SHW_PDPT_MASK EPT_PDPT_MASK
76
# define SHW_PDPE_PG_MASK EPT_PDPE_PG_MASK
77
# define SHW_TOTAL_PD_ENTRIES (EPT_PG_AMD64_ENTRIES*EPT_PG_AMD64_PDPE_ENTRIES)
78
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_NESTED_ROOT /* do not use! exception is real mode & protected mode without paging. */
91
# define PSHWPT PEPTPT
92
# define SHWPTE EPTPTE
93
# define PSHWPTE PEPTPTE
95
# define PSHWPD PEPTPD
96
# define SHWPDE EPTPDE
97
# define PSHWPDE PEPTPDE
98
# define SHW_PDE_PG_MASK EPT_PDE_PG_MASK
99
# define SHW_PD_SHIFT EPT_PD_SHIFT
100
# define SHW_PD_MASK EPT_PD_MASK
101
# define SHW_PTE_PG_MASK EPT_PTE_PG_MASK
102
# define SHW_PTE_IS_P(Pte) ( (Pte).n.u1Present ) /* Approximation, works for us. */
103
# define SHW_PTE_IS_RW(Pte) ( (Pte).n.u1Write )
104
# define SHW_PTE_IS_US(Pte) ( true )
105
# define SHW_PTE_IS_A(Pte) ( true )
106
# define SHW_PTE_IS_D(Pte) ( true )
107
# define SHW_PTE_IS_P_RW(Pte) ( (Pte).n.u1Present && (Pte).n.u1Write )
108
# define SHW_PTE_IS_TRACK_DIRTY(Pte) ( false )
109
# define SHW_PTE_GET_HCPHYS(Pte) ( (Pte).u & X86_PTE_PG_MASK )
110
# define SHW_PTE_LOG64(Pte) ( (Pte).u )
111
# define SHW_PTE_GET_U(Pte) ( (Pte).u ) /**< Use with care. */
112
# define SHW_PTE_SET(Pte, uNew) do { (Pte).u = (uNew); } while (0)
113
# define SHW_PTE_ATOMIC_SET(Pte, uNew) do { ASMAtomicWriteU64(&(Pte).u, (uNew)); } while (0)
114
# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) do { ASMAtomicWriteU64(&(Pte).u, (Pte2).u); } while (0)
115
# define SHW_PTE_SET_RO(Pte) do { (Pte).n.u1Write = 0; } while (0)
116
# define SHW_PTE_SET_RW(Pte) do { (Pte).n.u1Write = 1; } while (0)
117
# define SHW_PT_SHIFT EPT_PT_SHIFT
118
# define SHW_PT_MASK EPT_PT_MASK
119
# define SHW_PDPT_SHIFT EPT_PDPT_SHIFT
120
# define SHW_PDPT_MASK EPT_PDPT_MASK
121
# define SHW_PDPE_PG_MASK EPT_PDPE_PG_MASK
122
# define SHW_TOTAL_PD_ENTRIES (EPT_PG_AMD64_ENTRIES*EPT_PG_AMD64_PDPE_ENTRIES)
123
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_NESTED_ROOT /* do not use! exception is real mode & protected mode without paging. */
81
# define SHWPT X86PTPAE
82
# define PSHWPT PX86PTPAE
83
# define SHWPTE X86PTEPAE
84
# define PSHWPTE PX86PTEPAE
85
# define SHWPD X86PDPAE
86
# define PSHWPD PX86PDPAE
87
# define SHWPDE X86PDEPAE
88
# define PSHWPDE PX86PDEPAE
89
# define SHW_PDE_PG_MASK X86_PDE_PAE_PG_MASK
90
# define SHW_PD_SHIFT X86_PD_PAE_SHIFT
91
# define SHW_PD_MASK X86_PD_PAE_MASK
92
# define SHW_PTE_PG_MASK X86_PTE_PAE_PG_MASK
93
# define SHW_PT_SHIFT X86_PT_PAE_SHIFT
94
# define SHW_PT_MASK X86_PT_PAE_MASK
126
# define SHWPT PGMSHWPTPAE
127
# define PSHWPT PPGMSHWPTPAE
128
# define SHWPTE PGMSHWPTEPAE
129
# define PSHWPTE PPGMSHWPTEPAE
130
# define SHWPD X86PDPAE
131
# define PSHWPD PX86PDPAE
132
# define SHWPDE X86PDEPAE
133
# define PSHWPDE PX86PDEPAE
134
# define SHW_PDE_PG_MASK X86_PDE_PAE_PG_MASK
135
# define SHW_PD_SHIFT X86_PD_PAE_SHIFT
136
# define SHW_PD_MASK X86_PD_PAE_MASK
137
# define SHW_PTE_PG_MASK X86_PTE_PAE_PG_MASK
138
# define SHW_PTE_IS_P(Pte) PGMSHWPTEPAE_IS_P(Pte)
139
# define SHW_PTE_IS_RW(Pte) PGMSHWPTEPAE_IS_RW(Pte)
140
# define SHW_PTE_IS_US(Pte) PGMSHWPTEPAE_IS_US(Pte)
141
# define SHW_PTE_IS_A(Pte) PGMSHWPTEPAE_IS_A(Pte)
142
# define SHW_PTE_IS_D(Pte) PGMSHWPTEPAE_IS_D(Pte)
143
# define SHW_PTE_IS_P_RW(Pte) PGMSHWPTEPAE_IS_P_RW(Pte)
144
# define SHW_PTE_IS_TRACK_DIRTY(Pte) PGMSHWPTEPAE_IS_TRACK_DIRTY(Pte)
145
# define SHW_PTE_GET_HCPHYS(Pte) PGMSHWPTEPAE_GET_HCPHYS(Pte)
146
# define SHW_PTE_LOG64(Pte) PGMSHWPTEPAE_GET_LOG(Pte)
147
# define SHW_PTE_GET_U(Pte) PGMSHWPTEPAE_GET_U(Pte) /**< Use with care. */
148
# define SHW_PTE_SET(Pte, uNew) PGMSHWPTEPAE_SET(Pte, uNew)
149
# define SHW_PTE_ATOMIC_SET(Pte, uNew) PGMSHWPTEPAE_ATOMIC_SET(Pte, uNew)
150
# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) PGMSHWPTEPAE_ATOMIC_SET2(Pte, Pte2)
151
# define SHW_PTE_SET_RO(Pte) PGMSHWPTEPAE_SET_RO(Pte)
152
# define SHW_PTE_SET_RW(Pte) PGMSHWPTEPAE_SET_RW(Pte)
153
# define SHW_PT_SHIFT X86_PT_PAE_SHIFT
154
# define SHW_PT_MASK X86_PT_PAE_MASK
96
156
# if PGM_SHW_TYPE == PGM_TYPE_AMD64
97
# define SHW_PDPT_SHIFT X86_PDPT_SHIFT
98
# define SHW_PDPT_MASK X86_PDPT_MASK_AMD64
99
# define SHW_PDPE_PG_MASK X86_PDPE_PG_MASK
100
# define SHW_TOTAL_PD_ENTRIES (X86_PG_AMD64_ENTRIES*X86_PG_AMD64_PDPE_ENTRIES)
101
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_AMD64_CR3
157
# define SHW_PDPT_SHIFT X86_PDPT_SHIFT
158
# define SHW_PDPT_MASK X86_PDPT_MASK_AMD64
159
# define SHW_PDPE_PG_MASK X86_PDPE_PG_MASK
160
# define SHW_TOTAL_PD_ENTRIES (X86_PG_AMD64_ENTRIES * X86_PG_AMD64_PDPE_ENTRIES)
161
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_AMD64_CR3
103
163
# else /* 32 bits PAE mode */
104
# define SHW_PDPT_SHIFT X86_PDPT_SHIFT
105
# define SHW_PDPT_MASK X86_PDPT_MASK_PAE
106
# define SHW_PDPE_PG_MASK X86_PDPE_PG_MASK
107
# define SHW_TOTAL_PD_ENTRIES (X86_PG_PAE_ENTRIES*X86_PG_PAE_PDPE_ENTRIES)
108
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_PDPT
164
# define SHW_PDPT_SHIFT X86_PDPT_SHIFT
165
# define SHW_PDPT_MASK X86_PDPT_MASK_PAE
166
# define SHW_PDPE_PG_MASK X86_PDPE_PG_MASK
167
# define SHW_TOTAL_PD_ENTRIES (X86_PG_PAE_ENTRIES * X86_PG_PAE_PDPE_ENTRIES)
168
# define SHW_POOL_ROOT_IDX PGMPOOL_IDX_PDPT