Changes in kernel/genarch/src/mm/page_pt.c [a2789d2:235e6c7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_pt.c
ra2789d2 r235e6c7 39 39 #include <mm/page.h> 40 40 #include <mm/frame.h> 41 #include <mm/km.h>42 41 #include <mm/as.h> 43 42 #include <arch/mm/page.h> … … 46 45 #include <arch/asm.h> 47 46 #include <memstr.h> 48 #include <align.h>49 #include <macros.h>50 47 51 48 static void pt_mapping_insert(as_t *, uintptr_t, uintptr_t, unsigned int); 52 49 static void pt_mapping_remove(as_t *, uintptr_t); 53 50 static pte_t *pt_mapping_find(as_t *, uintptr_t, bool); 54 static void pt_mapping_make_global(uintptr_t, size_t);55 51 56 52 page_mapping_operations_t pt_mapping_operations = { 57 53 .mapping_insert = pt_mapping_insert, 58 54 .mapping_remove = pt_mapping_remove, 59 .mapping_find = pt_mapping_find, 60 .mapping_make_global = pt_mapping_make_global 55 .mapping_find = pt_mapping_find 61 56 }; 62 57 … … 80 75 81 76 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { 82 pte_t *newpt = (pte_t *) frame_alloc(PTL1_SIZE, 83 FRAME_LOWMEM | FRAME_KA); 77 pte_t *newpt = (pte_t *) frame_alloc(PTL1_SIZE, FRAME_KA); 84 78 memsetb(newpt, FRAME_SIZE << PTL1_SIZE, 0); 85 79 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 86 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), 87 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 88 PAGE_WRITE); 80 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); 89 81 } 90 82 … … 92 84 93 85 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { 94 pte_t *newpt = (pte_t *) frame_alloc(PTL2_SIZE, 95 FRAME_LOWMEM | FRAME_KA); 86 pte_t *newpt = (pte_t *) frame_alloc(PTL2_SIZE, FRAME_KA); 96 87 memsetb(newpt, FRAME_SIZE << PTL2_SIZE, 0); 97 88 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 98 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), 99 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 100 PAGE_WRITE); 89 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); 101 90 } 102 91 … … 104 93 105 94 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { 106 pte_t *newpt = (pte_t *) frame_alloc(PTL3_SIZE, 107 FRAME_LOWMEM | FRAME_KA); 95 pte_t *newpt = (pte_t *) frame_alloc(PTL3_SIZE, FRAME_KA); 108 96 memsetb(newpt, FRAME_SIZE << PTL3_SIZE, 0); 109 97 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 110 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), 111 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 112 PAGE_WRITE); 98 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); 113 99 } 114 100 … … 137 123 /* 138 124 * First, remove the mapping, if it exists. 125 * 139 126 */ 140 127 … … 153 140 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); 154 141 142 /* Destroy the mapping. Setting to PAGE_NOT_PRESENT is not sufficient. */ 143 memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); 144 155 145 /* 156 * Destroy the mapping. 157 * Setting to PAGE_NOT_PRESENT is not sufficient. 158 */ 159 memsetb(&ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); 160 161 /* 162 * Second, free all empty tables along the way from PTL3 down to PTL0 163 * except those needed for sharing the kernel non-identity mappings. 146 * Second, free all empty tables along the way from PTL3 down to PTL0. 147 * 164 148 */ 165 149 … … 178 162 /* 179 163 * PTL3 is empty. 180 * Release the frame and remove PTL3 pointer from the parent 181 * table. 182 */ 164 * Release the frame and remove PTL3 pointer from preceding table. 165 * 166 */ 167 frame_free(KA2PA((uintptr_t) ptl3)); 183 168 #if (PTL2_ENTRIES != 0) 184 169 memsetb(&ptl2[PTL2_INDEX(page)], sizeof(pte_t), 0); … … 186 171 memsetb(&ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); 187 172 #else 188 if (km_is_non_identity(page))189 return;190 191 173 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 192 174 #endif 193 frame_free(KA2PA((uintptr_t) ptl3));194 175 } else { 195 176 /* … … 214 195 /* 215 196 * PTL2 is empty. 216 * Release the frame and remove PTL2 pointer from the parent 217 * table. 218 */ 197 * Release the frame and remove PTL2 pointer from preceding table. 198 * 199 */ 200 frame_free(KA2PA((uintptr_t) ptl2)); 219 201 #if (PTL1_ENTRIES != 0) 220 202 memsetb(&ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); 221 203 #else 222 if (km_is_non_identity(page))223 return;224 225 204 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 226 205 #endif 227 frame_free(KA2PA((uintptr_t) ptl2));228 206 } else { 229 207 /* … … 249 227 /* 250 228 * PTL1 is empty. 251 * Release the frame and remove PTL1 pointer from the parent 252 * table. 253 */ 254 if (km_is_non_identity(page)) 255 return; 256 229 * Release the frame and remove PTL1 pointer from preceding table. 230 * 231 */ 232 frame_free(KA2PA((uintptr_t) ptl1)); 257 233 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 258 frame_free(KA2PA((uintptr_t) ptl1));259 234 } 260 235 #endif /* PTL1_ENTRIES != 0 */ … … 292 267 } 293 268 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 page297 * table. The next level page table will be allocated and cleared.298 *299 * pt_mapping_remove() will never deallocate these page tables even when there300 * are no PTEs in them.301 *302 * @param as Address space.303 * @param base Base address corresponding to the first PTL0 entry that will be304 * altered by this function.305 * @param size Size in bytes defining the range of PTL0 entries that will be306 * 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 #else320 order = PTL3_SIZE;321 #endif322 323 ASSERT(ispwr2(ptl0step));324 ASSERT(size > 0);325 326 for (addr = ALIGN_DOWN(base, ptl0step); addr - 1 < base + size - 1;327 addr += ptl0step) {328 uintptr_t l1;329 330 l1 = (uintptr_t) frame_alloc(order, FRAME_KA | FRAME_LOWMEM);331 memsetb((void *) l1, FRAME_SIZE << order, 0);332 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));333 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),334 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |335 PAGE_WRITE);336 }337 }338 339 269 /** @} 340 270 */
Note:
See TracChangeset
for help on using the changeset viewer.