Changeset 346b12a2 in mainline for kernel/genarch/src/mm/page_ht.c
- Timestamp:
- 2016-08-31T17:51:04Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fb63c06
- Parents:
- 38dc82d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_ht.c
r38dc82d r346b12a2 60 60 static void ht_mapping_remove(as_t *, uintptr_t); 61 61 static bool ht_mapping_find(as_t *, uintptr_t, bool, pte_t *); 62 static void ht_mapping_update(as_t *, uintptr_t, bool, pte_t *); 62 63 static void ht_mapping_make_global(uintptr_t, size_t); 63 64 … … 91 92 .mapping_remove = ht_mapping_remove, 92 93 .mapping_find = ht_mapping_find, 94 .mapping_update = ht_mapping_update, 93 95 .mapping_make_global = ht_mapping_make_global 94 96 }; … … 245 247 } 246 248 249 static pte_t *ht_mapping_find_internal(as_t *as, uintptr_t page, bool nolock) 250 { 251 sysarg_t key[2] = { 252 (uintptr_t) as, 253 page = ALIGN_DOWN(page, PAGE_SIZE) 254 }; 255 256 ASSERT(nolock || page_table_locked(as)); 257 258 link_t *cur = hash_table_find(&page_ht, key); 259 if (cur) 260 return hash_table_get_instance(cur, pte_t, link); 261 262 return NULL; 263 } 247 264 248 265 /** Find mapping for virtual page in page hash table. … … 257 274 bool ht_mapping_find(as_t *as, uintptr_t page, bool nolock, pte_t *pte) 258 275 { 259 sysarg_t key[2] = { 260 (uintptr_t) as, 261 page = ALIGN_DOWN(page, PAGE_SIZE) 262 }; 263 264 ASSERT(nolock || page_table_locked(as)); 265 266 link_t *cur = hash_table_find(&page_ht, key); 267 if (cur) 268 *pte = *hash_table_get_instance(cur, pte_t, link); 269 270 return cur != NULL; 276 pte_t *t = ht_mapping_find_internal(as, page, nolock); 277 if (t) 278 *pte = *t; 279 280 return t != NULL; 281 } 282 283 /** Update mapping for virtual page in page hash table. 284 * 285 * @param as Address space to which page belongs. 286 * @param page Virtual page. 287 * @param nolock True if the page tables need not be locked. 288 * @param pte New PTE. 289 */ 290 void ht_mapping_update(as_t *as, uintptr_t page, bool nolock, pte_t *pte) 291 { 292 pte_t *t = ht_mapping_find_internal(as, page, nolock); 293 if (!t) 294 panic("Updating non-existent PTE"); 295 296 ASSERT(pte->as == t->as); 297 ASSERT(pte->page == t->page); 298 ASSERT(pte->frame == t->frame); 299 ASSERT(pte->g == t->g); 300 ASSERT(pte->x == t->x); 301 ASSERT(pte->w == t->w); 302 ASSERT(pte->k == t->k); 303 ASSERT(pte->c == t->c); 304 ASSERT(pte->p == t->p); 305 306 t->a = pte->a; 307 t->d = pte->d; 271 308 } 272 309
Note:
See TracChangeset
for help on using the changeset viewer.