[NDK]: Fix definition of ARM PTE/PDE structure.
[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 Sbo: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 Sbo: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:2;
104 ULONG PageFileLow:4;
105 ULONG Protection:4;
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:2;
114 ULONG Buffered:1;
115 ULONG Cached:1;
116 ULONG Owner:1;
117 ULONG Protection:4;
118 ULONG ReadOnly:1;
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:2;
127 ULONG ProtoAddressLow:7;
128 ULONG ReadOnly:1;
129 ULONG Prototype:1;
130 ULONG ProtoAddressHigh:21;
131 } MMPTE_PROTOTYPE;
132
133 typedef struct _MMPTE_SUBSECTION
134 {
135 ULONG Valid:2;
136 ULONG SubsectionAddressLow:4;
137 ULONG Protection:4;
138 ULONG Prototype:1;
139 ULONG SubsectionAddressHigh:20;
140 ULONG WhichPool:1;
141 } MMPTE_SUBSECTION;
142
143 typedef struct _MMPTE_LIST
144 {
145 ULONG Valid:2;
146 ULONG OneEntry:1;
147 ULONG filler0:8;
148 ULONG NextEntry:20;
149 ULONG Prototype:1;
150 } MMPTE_LIST;
151
152 typedef union _MMPTE_HARDWARE
153 {
154 ULONG NoExecute:1;
155 ULONG Valid:1;
156 ULONG Buffered:1;
157 ULONG Cached:1;
158 ULONG Sbo:1;
159 ULONG Owner:1;
160 ULONG CacheAttributes:3;
161 ULONG ReadOnly:1;
162 ULONG Prototype:1;
163 ULONG NonGlobal:1;
164 ULONG PageFrameNumber:20;
165 } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
166
167 typedef union _MMPDE_HARDWARE
168 {
169 ULONG Valid:1;
170 ULONG LargePage:1;
171 ULONG Buffered:1;
172 ULONG Cached:1;
173 ULONG NoExecute:1;
174 ULONG Domain:4;
175 ULONG Ecc:1;
176 ULONG PageFrameNumber:22;
177 } MMPDE_HARDWARE, *PMMPDE_HARDWARE;
178
179 typedef struct _MMPDE
180 {
181 union
182 {
183 MMPDE_HARDWARE Hard;
184 ULONG Long;
185 } u;
186 } MMPDE, *PMMPDE;
187
188 //
189 // Use the right PTE structure
190 //
191 #define HARDWARE_PTE HARDWARE_PTE_ARMV6
192 #define PHARDWARE_PTE PHARDWARE_PTE_ARMV6
193
194 #endif