Rev 2278 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2278 | Rev 2329 | ||
---|---|---|---|
Line 99... | Line 99... | ||
99 | #define PTE_GET_FRAME_ARCH(pte) ( ((pte_level1_t *)(pte))->frame_base_addr << FRAME_WIDTH) |
99 | #define PTE_GET_FRAME_ARCH(pte) ( ((pte_level1_t *)(pte))->frame_base_addr << FRAME_WIDTH) |
100 | /* pte should point into ptl3 */ |
100 | /* pte should point into ptl3 */ |
101 | #define PTE_WRITABLE_ARCH(pte) ( ((pte_level1_t *)(pte))->access_permission_0 == PTE_AP_USER_RW_KERNEL_RW ) |
101 | #define PTE_WRITABLE_ARCH(pte) ( ((pte_level1_t *)(pte))->access_permission_0 == PTE_AP_USER_RW_KERNEL_RW ) |
102 | #define PTE_EXECUTABLE_ARCH(pte) 1 |
102 | #define PTE_EXECUTABLE_ARCH(pte) 1 |
103 | 103 | ||
- | 104 | ||
104 | #ifndef __ASM__ |
105 | #ifndef __ASM__ |
105 | 106 | ||
106 | /** Level 0 page table entry. */ |
107 | /** Level 0 page table entry. */ |
107 | typedef struct { |
108 | typedef struct { |
108 | /* 01b for coarse tables, see below for details */ |
109 | /* 01b for coarse tables, see below for details */ |
Line 116... | Line 117... | ||
116 | * with 1KB per the coarse table) |
117 | * with 1KB per the coarse table) |
117 | */ |
118 | */ |
118 | unsigned coarse_table_addr : 22; |
119 | unsigned coarse_table_addr : 22; |
119 | } __attribute__ ((packed)) pte_level0_t; |
120 | } __attribute__ ((packed)) pte_level0_t; |
120 | 121 | ||
- | 122 | ||
121 | /** Level 1 page table entry (small (4KB) pages used) */ |
123 | /** Level 1 page table entry (small (4KB) pages used). */ |
122 | typedef struct { |
124 | typedef struct { |
123 | /* 0b10 for small pages */ |
125 | /* 0b10 for small pages */ |
124 | unsigned descriptor_type : 2; |
126 | unsigned descriptor_type : 2; |
125 | unsigned bufferable : 1; |
127 | unsigned bufferable : 1; |
126 | unsigned cacheable : 1; |
128 | unsigned cacheable : 1; |
Line 134... | Line 136... | ||
134 | } __attribute__ ((packed)) pte_level1_t; |
136 | } __attribute__ ((packed)) pte_level1_t; |
135 | 137 | ||
136 | 138 | ||
137 | /* Level 1 page tables access permissions */ |
139 | /* Level 1 page tables access permissions */ |
138 | 140 | ||
139 | /** User mode: no access, privileged mode: no access */ |
141 | /** User mode: no access, privileged mode: no access. */ |
140 | #define PTE_AP_USER_NO_KERNEL_NO 0 |
142 | #define PTE_AP_USER_NO_KERNEL_NO 0 |
141 | /** User mode: no access, privileged mode: read/write */ |
143 | /** User mode: no access, privileged mode: read/write. */ |
142 | #define PTE_AP_USER_NO_KERNEL_RW 1 |
144 | #define PTE_AP_USER_NO_KERNEL_RW 1 |
143 | /** User mode: read only, privileged mode: read/write */ |
145 | /** User mode: read only, privileged mode: read/write. */ |
144 | #define PTE_AP_USER_RO_KERNEL_RW 2 |
146 | #define PTE_AP_USER_RO_KERNEL_RW 2 |
145 | /** User mode: read/write, privileged mode: read/write */ |
147 | /** User mode: read/write, privileged mode: read/write. */ |
146 | #define PTE_AP_USER_RW_KERNEL_RW 3 |
148 | #define PTE_AP_USER_RW_KERNEL_RW 3 |
147 | 149 | ||
148 | 150 | ||
149 | /* pte_level0_t and pte_level1_t descriptor_type flags */ |
151 | /* pte_level0_t and pte_level1_t descriptor_type flags */ |
150 | 152 | ||
151 | /** pte_level0_t and pte_level1_t "not present" flag (used in descriptor_type) */ |
153 | /** pte_level0_t and pte_level1_t "not present" flag (used in descriptor_type). */ |
152 | #define PTE_DESCRIPTOR_NOT_PRESENT 0 |
154 | #define PTE_DESCRIPTOR_NOT_PRESENT 0 |
153 | /** pte_level0_t coarse page table flag (used in descriptor_type) */ |
155 | /** pte_level0_t coarse page table flag (used in descriptor_type). */ |
154 | #define PTE_DESCRIPTOR_COARSE_TABLE 1 |
156 | #define PTE_DESCRIPTOR_COARSE_TABLE 1 |
155 | /** pte_level1_t small page table flag (used in descriptor type) */ |
157 | /** pte_level1_t small page table flag (used in descriptor type). */ |
156 | #define PTE_DESCRIPTOR_SMALL_PAGE 2 |
158 | #define PTE_DESCRIPTOR_SMALL_PAGE 2 |
157 | 159 | ||
158 | 160 | ||
159 | /** |
- | |
160 | * Sets the address of level 0 page table. |
161 | /** Sets the address of level 0 page table. |
161 | * |
162 | * |
162 | * \param pt pointer to the page table to set |
163 | * @param pt Pointer to the page table to set. |
163 | */ |
164 | */ |
164 | static inline void set_ptl0_addr( pte_level0_t* pt) |
165 | static inline void set_ptl0_addr( pte_level0_t* pt) |
165 | { |
166 | { |
166 | asm volatile ( |
167 | asm volatile ( |
167 | "mcr p15, 0, %0, c2, c0, 0 \n" |
168 | "mcr p15, 0, %0, c2, c0, 0 \n" |
168 | : |
169 | : |
169 | : "r"(pt) |
170 | : "r"(pt) |
170 | ); |
171 | ); |
171 | } |
172 | } |
172 | 173 | ||
- | 174 | ||
173 | /** Returns level 0 page table entry flags. |
175 | /** Returns level 0 page table entry flags. |
174 | * |
176 | * |
175 | * \param pt level 0 page table |
177 | * @param pt Level 0 page table. |
176 | * \param i index of the entry to return |
178 | * @param i Index of the entry to return. |
177 | */ |
179 | */ |
178 | static inline int get_pt_level0_flags(pte_level0_t *pt, index_t i) |
180 | static inline int get_pt_level0_flags(pte_level0_t *pt, index_t i) |
179 | { |
181 | { |
180 | pte_level0_t *p = &pt[i]; |
182 | pte_level0_t *p = &pt[i]; |
181 | 183 | ||
Line 187... | Line 189... | ||
187 | ( 1 << PAGE_EXEC_SHIFT ) | |
189 | ( 1 << PAGE_EXEC_SHIFT ) | |
188 | ( 1 << PAGE_CACHEABLE_SHIFT ) |
190 | ( 1 << PAGE_CACHEABLE_SHIFT ) |
189 | ; |
191 | ; |
190 | } |
192 | } |
191 | 193 | ||
- | 194 | ||
192 | /** Returns level 1 page table entry flags. |
195 | /** Returns level 1 page table entry flags. |
193 | * |
196 | * |
194 | * \param pt level 1 page table |
197 | * @param pt Level 1 page table. |
195 | * \param i index of the entry to return |
198 | * @param i Index of the entry to return. |
196 | */ |
199 | */ |
197 | static inline int get_pt_level1_flags(pte_level1_t *pt, index_t i) |
200 | static inline int get_pt_level1_flags(pte_level1_t *pt, index_t i) |
198 | { |
201 | { |
199 | pte_level1_t *p = &pt[i]; |
202 | pte_level1_t *p = &pt[i]; |
200 | 203 | ||
Line 209... | Line 212... | ||
209 | ( 1 << PAGE_EXEC_SHIFT ) | |
212 | ( 1 << PAGE_EXEC_SHIFT ) | |
210 | ( p->bufferable << PAGE_CACHEABLE ) |
213 | ( p->bufferable << PAGE_CACHEABLE ) |
211 | ; |
214 | ; |
212 | } |
215 | } |
213 | 216 | ||
- | 217 | ||
214 | /** Sets flags of level 0 page table entry. |
218 | /** Sets flags of level 0 page table entry. |
215 | * |
219 | * |
216 | * \param pt level 0 page table |
220 | * @param pt level 0 page table |
217 | * \param i index of the entry to be changed |
221 | * @param i index of the entry to be changed |
218 | * \param flags new flags |
222 | * @param flags new flags |
219 | */ |
223 | */ |
220 | static inline void set_pt_level0_flags(pte_level0_t *pt, index_t i, int flags) |
224 | static inline void set_pt_level0_flags(pte_level0_t *pt, index_t i, int flags) |
221 | { |
225 | { |
222 | pte_level0_t *p = &pt[i]; |
226 | pte_level0_t *p = &pt[i]; |
223 | 227 | ||
Line 229... | Line 233... | ||
229 | p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; |
233 | p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; |
230 | p->should_be_zero = 0; |
234 | p->should_be_zero = 0; |
231 | } |
235 | } |
232 | } |
236 | } |
233 | 237 | ||
- | 238 | ||
234 | /** Sets flags of level 1 page table entry. |
239 | /** Sets flags of level 1 page table entry. |
235 | * |
240 | * |
236 | * We use same access rights for the whole page. When page is not preset we |
241 | * We use same access rights for the whole page. When page is not preset we |
237 | * store 1 in acess_rigts_3 so that at least one bit is 1 (to mark correct |
242 | * store 1 in acess_rigts_3 so that at least one bit is 1 (to mark correct |
238 | * page entry, see #PAGE_VALID_ARCH). |
243 | * page entry, see #PAGE_VALID_ARCH). |
239 | * |
244 | * |
240 | * \param pt level 1 page table |
245 | * @param pt Level 1 page table. |
241 | * \param i index of the entry to be changed |
246 | * @param i Index of the entry to be changed. |
242 | * \param flags new flags |
247 | * @param flags New flags. |
243 | */ |
248 | */ |
244 | static inline void set_pt_level1_flags(pte_level1_t *pt, index_t i, int flags) |
249 | static inline void set_pt_level1_flags(pte_level1_t *pt, index_t i, int flags) |
245 | { |
250 | { |
246 | pte_level1_t *p = &pt[i]; |
251 | pte_level1_t *p = &pt[i]; |
247 | 252 |