Changeset 38dc82d in mainline for kernel/generic/src/mm
- Timestamp:
- 2016-08-31T14:16:45Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 346b12a2
- Parents:
- dc05a9a
- Location:
- kernel/generic/src/mm
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/as.c
rdc05a9a r38dc82d 888 888 889 889 for (; i < node_size; i++) { 890 pte_t *pte = page_mapping_find(as, 891 ptr + P2SZ(i), false); 890 pte_t pte; 891 bool found = page_mapping_find(as, 892 ptr + P2SZ(i), false, &pte); 892 893 893 ASSERT( pte);894 ASSERT(PTE_VALID( pte));895 ASSERT(PTE_PRESENT( pte));894 ASSERT(found); 895 ASSERT(PTE_VALID(&pte)); 896 ASSERT(PTE_PRESENT(&pte)); 896 897 897 898 if ((area->backend) && … … 899 900 area->backend->frame_free(area, 900 901 ptr + P2SZ(i), 901 PTE_GET_FRAME( pte));902 PTE_GET_FRAME(&pte)); 902 903 } 903 904 … … 1002 1003 1003 1004 for (size = 0; size < (size_t) node->value[i]; size++) { 1004 pte_t *pte = page_mapping_find(as, 1005 ptr + P2SZ(size), false); 1005 pte_t pte; 1006 bool found = page_mapping_find(as, 1007 ptr + P2SZ(size), false, &pte); 1006 1008 1007 ASSERT( pte);1008 ASSERT(PTE_VALID( pte));1009 ASSERT(PTE_PRESENT( pte));1009 ASSERT(found); 1010 ASSERT(PTE_VALID(&pte)); 1011 ASSERT(PTE_PRESENT(&pte)); 1010 1012 1011 1013 if ((area->backend) && … … 1013 1015 area->backend->frame_free(area, 1014 1016 ptr + P2SZ(size), 1015 PTE_GET_FRAME( pte));1017 PTE_GET_FRAME(&pte)); 1016 1018 } 1017 1019 … … 1314 1316 1315 1317 for (size = 0; size < (size_t) node->value[i]; size++) { 1316 pte_t *pte = page_mapping_find(as, 1317 ptr + P2SZ(size), false); 1318 pte_t pte; 1319 bool found = page_mapping_find(as, 1320 ptr + P2SZ(size), false, &pte); 1318 1321 1319 ASSERT( pte);1320 ASSERT(PTE_VALID( pte));1321 ASSERT(PTE_PRESENT( pte));1322 ASSERT(found); 1323 ASSERT(PTE_VALID(&pte)); 1324 ASSERT(PTE_PRESENT(&pte)); 1322 1325 1323 old_frame[frame_idx++] = PTE_GET_FRAME( pte);1326 old_frame[frame_idx++] = PTE_GET_FRAME(&pte); 1324 1327 1325 1328 /* Remove old mapping */ … … 1451 1454 * we need to make sure the mapping has not been already inserted. 1452 1455 */ 1453 pte_t *pte; 1454 if ((pte = page_mapping_find(AS, page, false))) { 1455 if (PTE_PRESENT(pte)) { 1456 if (((access == PF_ACCESS_READ) && PTE_READABLE(pte)) || 1457 (access == PF_ACCESS_WRITE && PTE_WRITABLE(pte)) || 1458 (access == PF_ACCESS_EXEC && PTE_EXECUTABLE(pte))) { 1456 pte_t pte; 1457 bool found = page_mapping_find(AS, page, false, &pte); 1458 if (found) { 1459 if (PTE_PRESENT(&pte)) { 1460 if (((access == PF_ACCESS_READ) && PTE_READABLE(&pte)) || 1461 (access == PF_ACCESS_WRITE && PTE_WRITABLE(&pte)) || 1462 (access == PF_ACCESS_EXEC && PTE_EXECUTABLE(&pte))) { 1459 1463 page_table_unlock(AS, false); 1460 1464 mutex_unlock(&area->lock); -
kernel/generic/src/mm/backend_anon.c
rdc05a9a r38dc82d 131 131 132 132 for (j = 0; j < count; j++) { 133 pte_t *pte; 133 pte_t pte; 134 bool found; 134 135 135 136 page_table_lock(area->as, false); 136 pte = page_mapping_find(area->as, 137 base + P2SZ(j), false); 138 ASSERT(pte && PTE_VALID(pte) && 139 PTE_PRESENT(pte)); 137 found = page_mapping_find(area->as, 138 base + P2SZ(j), false, &pte); 139 140 ASSERT(found); 141 ASSERT(PTE_VALID(&pte)); 142 ASSERT(PTE_PRESENT(&pte)); 143 140 144 btree_insert(&area->sh_info->pagemap, 141 145 (base + P2SZ(j)) - area->base, 142 (void *) PTE_GET_FRAME( pte), NULL);146 (void *) PTE_GET_FRAME(&pte), NULL); 143 147 page_table_unlock(area->as, false); 144 148 145 pfn_t pfn = ADDR2PFN(PTE_GET_FRAME( pte));149 pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(&pte)); 146 150 frame_reference_add(pfn); 147 151 } -
kernel/generic/src/mm/backend_elf.c
rdc05a9a r38dc82d 184 184 185 185 for (j = 0; j < count; j++) { 186 pte_t *pte; 186 pte_t pte; 187 bool found; 187 188 188 189 /* … … 196 197 197 198 page_table_lock(area->as, false); 198 pte = page_mapping_find(area->as, 199 base + P2SZ(j), false); 200 ASSERT(pte && PTE_VALID(pte) && 201 PTE_PRESENT(pte)); 199 found = page_mapping_find(area->as, 200 base + P2SZ(j), false, &pte); 201 202 ASSERT(found); 203 ASSERT(PTE_VALID(&pte)); 204 ASSERT(PTE_PRESENT(&pte)); 205 202 206 btree_insert(&area->sh_info->pagemap, 203 207 (base + P2SZ(j)) - area->base, 204 (void *) PTE_GET_FRAME( pte), NULL);208 (void *) PTE_GET_FRAME(&pte), NULL); 205 209 page_table_unlock(area->as, false); 206 210 207 pfn_t pfn = ADDR2PFN(PTE_GET_FRAME( pte));211 pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(&pte)); 208 212 frame_reference_add(pfn); 209 213 } … … 335 339 dirty = true; 336 340 } else { 337 pte_t *pte = page_mapping_find(AS_KERNEL, 338 base + i * FRAME_SIZE, true); 339 340 ASSERT(pte); 341 ASSERT(PTE_PRESENT(pte)); 342 343 frame = PTE_GET_FRAME(pte); 341 pte_t pte; 342 bool found; 343 344 found = page_mapping_find(AS_KERNEL, 345 base + i * FRAME_SIZE, true, &pte); 346 347 ASSERT(found); 348 ASSERT(PTE_PRESENT(&pte)); 349 350 frame = PTE_GET_FRAME(&pte); 344 351 } 345 352 } else if (upage >= start_anon) { -
kernel/generic/src/mm/page.c
rdc05a9a r38dc82d 137 137 /** Find mapping for virtual page. 138 138 * 139 * @param as Address space to which page belongs.140 * @param page Virtual page.141 * @param nolock True if the page tables need not be locked.142 * 143 * @return NULL if there is no such mapping; requested mapping144 * 145 * 146 */ 147 NO_TRACE pte_t *page_mapping_find(as_t *as, uintptr_t page, bool nolock)139 * @param as Address space to which page belongs. 140 * @param page Virtual page. 141 * @param nolock True if the page tables need not be locked. 142 * @param[out] pte Structure that will receive a copy of the found PTE. 143 * 144 * @return True if the mapping was found, false otherwise. 145 */ 146 NO_TRACE bool page_mapping_find(as_t *as, uintptr_t page, bool nolock, 147 pte_t *pte) 148 148 { 149 149 ASSERT(nolock || page_table_locked(as)); … … 153 153 154 154 return page_mapping_operations->mapping_find(as, 155 ALIGN_DOWN(page, PAGE_SIZE), nolock );155 ALIGN_DOWN(page, PAGE_SIZE), nolock, pte); 156 156 } 157 157 … … 173 173 page_table_lock(AS, true); 174 174 175 pte_t *pte = page_mapping_find(AS, virt, false); 176 if ((!PTE_VALID(pte)) || (!PTE_PRESENT(pte))) { 175 pte_t pte; 176 bool found = page_mapping_find(AS, virt, false, &pte); 177 if (!found || !PTE_VALID(&pte) || !PTE_PRESENT(&pte)) { 177 178 page_table_unlock(AS, true); 178 179 return ENOENT; 179 180 } 180 181 181 *phys = PTE_GET_FRAME( pte) +182 *phys = PTE_GET_FRAME(&pte) + 182 183 (virt - ALIGN_DOWN(virt, PAGE_SIZE)); 183 184
Note:
See TracChangeset
for help on using the changeset viewer.