Merge from amd64-branch:
[reactos.git] / reactos / ntoskrnl / include / internal / arm / mm.h
1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H
3
4 //
5 // Number of bits corresponding to the area that a PDE entry represents (1MB)
6 //
7 #define PDE_SHIFT 20
8 #define PDE_SIZE (1 << PDE_SHIFT)
9
10 //
11 // Number of bits corresponding to the area that a coarse page table entry represents (4KB)
12 //
13 #define PTE_SHIFT 12
14 //#define PAGE_SIZE (1 << PTE_SHIFT) // FIXME: This conflicts with ndk/arm/mmtypes.h which does #define PAGE_SIZE 0x1000 -- use PTE_SIZE here instead?
15
16 //
17 // Number of bits corresponding to the area that a coarse page table occupies (1KB)
18 //
19 #define CPT_SHIFT 10
20 #define CPT_SIZE (1 << CPT_SHIFT)
21
22 typedef union _ARM_PTE
23 {
24 union
25 {
26 struct
27 {
28 ULONG Type:2;
29 ULONG Unused:30;
30 } Fault;
31 struct
32 {
33 ULONG Type:2;
34 ULONG Ignored:2;
35 ULONG Reserved:1;
36 ULONG Domain:4;
37 ULONG Ignored1:1;
38 ULONG BaseAddress:22;
39 } Coarse;
40 struct
41 {
42 ULONG Type:2;
43 ULONG Buffered:1;
44 ULONG Cached:1;
45 ULONG Reserved:1;
46 ULONG Domain:4;
47 ULONG Ignored:1;
48 ULONG Access:2;
49 ULONG Ignored1:8;
50 ULONG BaseAddress:12;
51 } Section;
52 struct
53 {
54 ULONG Type:2;
55 ULONG Reserved:3;
56 ULONG Domain:4;
57 ULONG Ignored:3;
58 ULONG BaseAddress:20;
59 } Fine;
60 } L1;
61 union
62 {
63 struct
64 {
65 ULONG Type:2;
66 ULONG Unused:30;
67 } Fault;
68 struct
69 {
70 ULONG Type:2;
71 ULONG Buffered:1;
72 ULONG Cached:1;
73 ULONG Access0:2;
74 ULONG Access1:2;
75 ULONG Access2:2;
76 ULONG Access3:2;
77 ULONG Ignored:4;
78 ULONG BaseAddress:16;
79 } Large;
80 struct
81 {
82 ULONG Type:2;
83 ULONG Buffered:1;
84 ULONG Cached:1;
85 ULONG Access0:2;
86 ULONG Access1:2;
87 ULONG Access2:2;
88 ULONG Access3:2;
89 ULONG BaseAddress:20;
90 } Small;
91 struct
92 {
93 ULONG Type:2;
94 ULONG Buffered:1;
95 ULONG Cached:1;
96 ULONG Access0:2;
97 ULONG Ignored:4;
98 ULONG BaseAddress:22;
99 } Tiny;
100 } L2;
101 ULONG AsUlong;
102 } ARM_PTE, *PARM_PTE;
103
104 typedef struct _ARM_TRANSLATION_TABLE
105 {
106 ARM_PTE Pte[4096];
107 } ARM_TRANSLATION_TABLE, *PARM_TRANSLATION_TABLE;
108
109 typedef struct _ARM_COARSE_PAGE_TABLE
110 {
111 ARM_PTE Pte[256];
112 ULONG Padding[768];
113 } ARM_COARSE_PAGE_TABLE, *PARM_COARSE_PAGE_TABLE;
114
115 typedef enum _ARM_L1_PTE_TYPE
116 {
117 FaultPte,
118 CoarsePte,
119 SectionPte,
120 FinePte
121 } ARM_L1_PTE_TYPE;
122
123 typedef enum _ARM_L2_PTE_TYPE
124 {
125 LargePte = 1,
126 SmallPte,
127 TinyPte
128 } ARM_L2_PTE_TYPE;
129
130 typedef enum _ARM_PTE_ACCESS
131 {
132 FaultAccess,
133 SupervisorAccess,
134 SharedAccess,
135 UserAccess
136 } ARM_PTE_ACCESS;
137
138 typedef enum _ARM_DOMAIN
139 {
140 FaultDomain,
141 ClientDomain,
142 InvalidDomain,
143 ManagerDomain
144 } ARM_DOMAIN;
145
146 //
147 // Take 0x80812345 and extract:
148 // PTE_BASE[0x808][0x12]
149 //
150 #define MiGetPteAddress(x) \
151 (PMMPTE)(PTE_BASE + \
152 (((ULONG)(x) >> 20) << 12) + \
153 ((((ULONG)(x) >> 12) & 0xFF) << 2))
154
155 #define MiGetPdeAddress(x) \
156 (PMMPTE)(PDE_BASE + \
157 (((ULONG)(x) >> 20) << 2))
158
159 #define MiGetPdeOffset(x) (((ULONG)(x)) >> 22)
160
161 #define PTE_BASE 0xC0000000
162 #define PDE_BASE 0xC1000000
163 #define HYPER_SPACE 0xC1100000
164
165 struct _EPROCESS;
166 PULONG MmGetPageDirectory(VOID);
167
168 #endif