Changeset c868e2d in mainline for kernel/genarch/src/mm/page_pt.c
- Timestamp:
- 2011-12-19T23:42:44Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 398e33be
- Parents:
- 7aaed09
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_pt.c
r7aaed09 rc868e2d 46 46 #include <arch/asm.h> 47 47 #include <memstr.h> 48 #include <align.h> 49 #include <macros.h> 48 50 49 51 static void pt_mapping_insert(as_t *, uintptr_t, uintptr_t, unsigned int); 50 52 static void pt_mapping_remove(as_t *, uintptr_t); 51 53 static pte_t *pt_mapping_find(as_t *, uintptr_t, bool); 54 static void pt_mapping_make_global(uintptr_t, size_t); 52 55 53 56 page_mapping_operations_t pt_mapping_operations = { 54 57 .mapping_insert = pt_mapping_insert, 55 58 .mapping_remove = pt_mapping_remove, 56 .mapping_find = pt_mapping_find 59 .mapping_find = pt_mapping_find, 60 .mapping_make_global = pt_mapping_make_global 57 61 }; 58 62 … … 133 137 /* 134 138 * First, remove the mapping, if it exists. 135 *136 139 */ 137 140 … … 150 153 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); 151 154 152 /* Destroy the mapping. Setting to PAGE_NOT_PRESENT is not sufficient. */ 155 /* 156 * Destroy the mapping. 157 * Setting to PAGE_NOT_PRESENT is not sufficient. 158 */ 153 159 memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); 154 160 … … 286 292 } 287 293 294 /** Make the mappings in the given range global accross all address spaces. 295 * 296 * All PTL0 entries in the given range will be mapped to a next level page 297 * table. The next level page table will be allocated and cleared. 298 * 299 * pt_mapping_remove() will never deallocate these page tables even when there 300 * are no PTEs in them. 301 * 302 * @param as Address space. 303 * @param base Base address corresponding to the first PTL0 entry that will be 304 * altered by this function. 305 * @param size Size in bytes defining the range of PTL0 entries that will be 306 * altered by this function. 307 */ 308 void pt_mapping_make_global(uintptr_t base, size_t size) 309 { 310 uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 311 uintptr_t ptl0step = (((uintptr_t) -1) / PTL0_ENTRIES) + 1; 312 size_t order; 313 uintptr_t addr; 314 315 #if (PTL1_ENTRIES != 0) 316 order = PTL1_SIZE; 317 #elif (PTL2_ENTRIES != 0) 318 order = PTL2_SIZE; 319 #else 320 order = PTL3_SIZE; 321 #endif 322 323 ASSERT(ispwr2(ptl0step)); 324 325 for (addr = ALIGN_DOWN(base, ptl0step); addr < base + size; 326 addr += ptl0step) { 327 uintptr_t l1; 328 329 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM); 330 memsetb((void *) l1, FRAME_SIZE << order, 0); 331 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 332 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr), 333 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 334 PAGE_WRITE); 335 } 336 } 337 288 338 /** @} 289 339 */
Note:
See TracChangeset
for help on using the changeset viewer.