[NDK]: Add MMPDE structure for ARM.
[reactos.git] / reactos / include / ndk / arm / mmtypes.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 mmtypes.h (ARM)
8
9 Abstract:
10
11 ARM 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 _ARM_MMTYPES_H
20 #define _ARM_MMTYPES_H
21
22 //
23 // Dependencies
24 //
25
26 //
27 // Page-related Macros
28 //
29 #ifndef PAGE_SIZE
30 #define PAGE_SIZE 0x1000
31 #endif
32 #define PAGE_SHIFT 12L
33 #define MM_ALLOCATION_GRANULARITY 0x10000
34 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L
35
36 //
37 // Sanity checks for Paging Macros
38 //
39 #ifdef C_ASSERT
40 C_ASSERT(PAGE_SIZE == (1 << PAGE_SHIFT));
41 C_ASSERT(MM_ALLOCATION_GRANULARITY == (1 << MM_ALLOCATION_GRANULARITY_SHIFT));
42 C_ASSERT(MM_ALLOCATION_GRANULARITY &&
43 !(MM_ALLOCATION_GRANULARITY & (MM_ALLOCATION_GRANULARITY - 1)));
44 C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE);
45 #endif
46
47 //
48 // Page Table Entry Definitions
49 //
50 typedef struct _HARDWARE_PDE_ARMV6
51 {
52 ULONG Valid:1; // Only for small pages
53 ULONG LargePage:1; // Note, if large then Valid = 0
54 ULONG Buffered:1;
55 ULONG Cached:1;
56 ULONG NoExecute:1;
57 ULONG Domain:4;
58 ULONG Ecc:1;
59 ULONG PageFrameNumber:22;
60 } HARDWARE_PDE_ARMV6, *PHARDWARE_PDE_ARMV6;
61
62 typedef struct _HARDWARE_LARGE_PTE_ARMV6
63 {
64 ULONG Valid:1; // Only for small pages
65 ULONG LargePage:1; // Note, if large then Valid = 0
66 ULONG Buffered:1;
67 ULONG Cached:1;
68 ULONG NoExecute:1;
69 ULONG Domain:4;
70 ULONG Ecc:1;
71 ULONG Accessed:1;
72 ULONG Owner:1;
73 ULONG CacheAttributes:3;
74 ULONG ReadOnly:1;
75 ULONG Shared:1;
76 ULONG NonGlobal:1;
77 ULONG SuperLagePage:1;
78 ULONG Reserved:1;
79 ULONG PageFrameNumber:12;
80 } HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6;
81
82 typedef struct _HARDWARE_PTE_ARMV6
83 {
84 ULONG NoExecute:1;
85 ULONG Valid:1;
86 ULONG Buffered:1;
87 ULONG Cached:1;
88 ULONG Accessed:1;
89 ULONG Owner:1;
90 ULONG CacheAttributes:3;
91 ULONG ReadOnly:1;
92 ULONG Shared:1;
93 ULONG NonGlobal:1;
94 ULONG PageFrameNumber:20;
95 } HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6;
96
97 C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG));
98 C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG));
99 C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG));
100
101 typedef struct _MMPTE_SOFTWARE
102 {
103 ULONG Valid:1;
104 ULONG PageFileLow:4;
105 ULONG Protection:5;
106 ULONG Prototype:1;
107 ULONG Transition:1;
108 ULONG PageFileHigh:20;
109 } MMPTE_SOFTWARE;
110
111 typedef struct _MMPTE_TRANSITION
112 {
113 ULONG Valid:1;
114 ULONG Write:1;
115 ULONG Owner:1;
116 ULONG WriteThrough:1;
117 ULONG CacheDisable:1;
118 ULONG Protection:5;
119 ULONG Prototype:1;
120 ULONG Transition:1;
121 ULONG PageFrameNumber:20;
122 } MMPTE_TRANSITION;
123
124 typedef struct _MMPTE_PROTOTYPE
125 {
126 ULONG Valid:1;
127 ULONG ProtoAddressLow:7;
128 ULONG ReadOnly:1;
129 ULONG WhichPool:1;
130 ULONG Prototype:1;
131 ULONG ProtoAddressHigh:21;
132 } MMPTE_PROTOTYPE;
133
134 typedef struct _MMPTE_SUBSECTION
135 {
136 ULONG Valid:1;
137 ULONG SubsectionAddressLow:4;
138 ULONG Protection:5;
139 ULONG Prototype:1;
140 ULONG SubsectionAddressHigh:20;
141 ULONG WhichPool:1;
142 } MMPTE_SUBSECTION;
143
144 typedef struct _MMPTE_LIST
145 {
146 ULONG Valid:1;
147 ULONG OneEntry:1;
148 ULONG filler0:8;
149 ULONG NextEntry:20;
150 ULONG Prototype:1;
151 ULONG filler1:1;
152 } MMPTE_LIST;
153
154 typedef union _MMPTE_HARDWARE
155 {
156 struct
157 {
158 ULONG NoExecute:1;
159 ULONG Valid:1;
160 ULONG Buffered:1;
161 ULONG Cached:1;
162 ULONG Access:1;
163 ULONG Owner:1;
164 ULONG CacheAttributes:3;
165 ULONG ReadOnly:1;
166 ULONG Shared:1;
167 ULONG NonGlobal:1;
168 ULONG PageFrameNumber:20;
169 };
170 ULONG AsUlong;
171 } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
172
173 typedef union _MMPDE_HARDWARE
174 {
175 struct
176 {
177 ULONG Valid:1;
178 ULONG LargePage:1;
179 ULONG Buffered:1;
180 ULONG Cached:1;
181 ULONG NoExecute:1;
182 ULONG Domain:4;
183 ULONG Ecc:1;
184 ULONG PageFrameNumber:22;
185 };
186 ULONG AsUlong;
187 } MMPDE_HARDWARE, *PMMPDE_HARDWARE;
188
189 typedef struct _MMPDE
190 {
191 union
192 {
193 MMPDE_HARDWARE Hard;
194 ULONG Long;
195 } u;
196 } MMPDE, *PMMPDE;
197
198 //
199 // Use the right PTE structure
200 //
201 #define HARDWARE_PTE HARDWARE_PTE_ARMV6
202 #define PHARDWARE_PTE PHARDWARE_PTE_ARMV6
203
204 #endif