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