[CLASSPNP] Fix MSVC build. Brought to you by Timo.
[reactos.git] / reactos / include / ndk / i386 / mmtypes.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 mmtypes.h (X86)
8
9 Abstract:
10
11 i386 Type definitions for the Memory Manager
12
13 Author:
14
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
16
17 --*/
18
19 #ifndef _I386_MMTYPES_H
20 #define _I386_MMTYPES_H
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 //
27 // Dependencies
28 //
29
30 //
31 // Page-related Macros
32 //
33 #define PAGE_SIZE 0x1000
34 #define PAGE_SHIFT 12L
35 #define MM_ALLOCATION_GRANULARITY 0x10000
36 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L
37 #define MM_PAGE_FRAME_NUMBER_SIZE 20
38
39 //
40 // User space range limit
41 //
42 #define MI_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF
43
44 //
45 // Address of the shared user page
46 //
47 #define MM_SHARED_USER_DATA_VA 0x7FFE0000
48
49 //
50 // Sanity checks for Paging Macros
51 //
52 #ifdef C_ASSERT
53 C_ASSERT(PAGE_SIZE == (1 << PAGE_SHIFT));
54 C_ASSERT(MM_ALLOCATION_GRANULARITY == (1 << MM_ALLOCATION_GRANULARITY_SHIFT));
55 C_ASSERT(MM_ALLOCATION_GRANULARITY &&
56 !(MM_ALLOCATION_GRANULARITY & (MM_ALLOCATION_GRANULARITY - 1)));
57 C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE);
58 #endif
59
60 //
61 // PAE SEG0 Base?
62 //
63 #define KSEG0_BASE_PAE 0xE0000000
64
65 //
66 // Page Table Entry Definitions
67 //
68 typedef struct _HARDWARE_PTE_X86
69 {
70 ULONG Valid:1;
71 ULONG Write:1;
72 ULONG Owner:1;
73 ULONG WriteThrough:1;
74 ULONG CacheDisable:1;
75 ULONG Accessed:1;
76 ULONG Dirty:1;
77 ULONG LargePage:1;
78 ULONG Global:1;
79 ULONG CopyOnWrite:1;
80 ULONG Prototype: 1;
81 ULONG reserved: 1;
82 ULONG PageFrameNumber:20;
83 } HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;
84
85 typedef struct _MMPTE_SOFTWARE
86 {
87 ULONG Valid:1;
88 ULONG PageFileLow:4;
89 ULONG Protection:5;
90 ULONG Prototype:1;
91 ULONG Transition:1;
92 ULONG PageFileHigh:20;
93 } MMPTE_SOFTWARE;
94
95 typedef struct _MMPTE_TRANSITION
96 {
97 ULONG Valid:1;
98 ULONG Write:1;
99 ULONG Owner:1;
100 ULONG WriteThrough:1;
101 ULONG CacheDisable:1;
102 ULONG Protection:5;
103 ULONG Prototype:1;
104 ULONG Transition:1;
105 ULONG PageFrameNumber:20;
106 } MMPTE_TRANSITION;
107
108 typedef struct _MMPTE_PROTOTYPE
109 {
110 ULONG Valid:1;
111 ULONG ProtoAddressLow:7;
112 ULONG ReadOnly:1;
113 ULONG WhichPool:1;
114 ULONG Prototype:1;
115 ULONG ProtoAddressHigh:21;
116 } MMPTE_PROTOTYPE;
117
118 typedef struct _MMPTE_SUBSECTION
119 {
120 ULONG Valid:1;
121 ULONG SubsectionAddressLow:4;
122 ULONG Protection:5;
123 ULONG Prototype:1;
124 ULONG SubsectionAddressHigh:20;
125 ULONG WhichPool:1;
126 } MMPTE_SUBSECTION;
127
128 typedef struct _MMPTE_LIST
129 {
130 ULONG Valid:1;
131 ULONG OneEntry:1;
132 ULONG filler0:8;
133 ULONG Prototype:1;
134 ULONG filler1:1;
135 ULONG NextEntry:20;
136 } MMPTE_LIST;
137
138 #ifndef CONFIG_SMP
139
140 typedef struct _MMPTE_HARDWARE
141 {
142 ULONG Valid:1;
143 ULONG Write:1;
144 ULONG Owner:1;
145 ULONG WriteThrough:1;
146 ULONG CacheDisable:1;
147 ULONG Accessed:1;
148 ULONG Dirty:1;
149 ULONG LargePage:1;
150 ULONG Global:1;
151 ULONG CopyOnWrite:1;
152 ULONG Prototype:1;
153 ULONG reserved:1;
154 ULONG PageFrameNumber:20;
155 } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
156
157 #else
158
159 typedef struct _MMPTE_HARDWARE
160 {
161 ULONG Valid:1;
162 ULONG Writable:1;
163 ULONG Owner:1;
164 ULONG WriteThrough:1;
165 ULONG CacheDisable:1;
166 ULONG Accessed:1;
167 ULONG Dirty:1;
168 ULONG LargePage:1;
169 ULONG Global:1;
170 ULONG CopyOnWrite:1;
171 ULONG Prototype:1;
172 ULONG Write:1;
173 ULONG PageFrameNumber:20;
174 } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
175
176 #endif
177
178 //
179 // Use the right PTE structure
180 //
181 #define HARDWARE_PTE HARDWARE_PTE_X86
182 #define PHARDWARE_PTE PHARDWARE_PTE_X86
183
184 typedef struct _MMPTE
185 {
186 union
187 {
188 ULONG_PTR Long;
189 HARDWARE_PTE Flush;
190 MMPTE_HARDWARE Hard;
191 MMPTE_PROTOTYPE Proto;
192 MMPTE_SOFTWARE Soft;
193 MMPTE_TRANSITION Trans;
194 MMPTE_SUBSECTION Subsect;
195 MMPTE_LIST List;
196 } u;
197 } MMPTE, *PMMPTE,
198 MMPDE, *PMMPDE;
199
200 #ifdef __cplusplus
201 }; // extern "C"
202 #endif
203
204 #endif