Changeset 346b12a2 in mainline for kernel/genarch/src/mm/page_ht.c


Ignore:
Timestamp:
2016-08-31T17:51:04Z (9 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fb63c06
Parents:
38dc82d
Message:

Add page_mapping_update()

page_mapping_update() can be used to safely update the accessed and dirty
bits of a PTE in the actual page tables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/mm/page_ht.c

    r38dc82d r346b12a2  
    6060static void ht_mapping_remove(as_t *, uintptr_t);
    6161static bool ht_mapping_find(as_t *, uintptr_t, bool, pte_t *);
     62static void ht_mapping_update(as_t *, uintptr_t, bool, pte_t *);
    6263static void ht_mapping_make_global(uintptr_t, size_t);
    6364
     
    9192        .mapping_remove = ht_mapping_remove,
    9293        .mapping_find = ht_mapping_find,
     94        .mapping_update = ht_mapping_update,
    9395        .mapping_make_global = ht_mapping_make_global
    9496};
     
    245247}
    246248
     249static 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}
    247264
    248265/** Find mapping for virtual page in page hash table.
     
    257274bool ht_mapping_find(as_t *as, uintptr_t page, bool nolock, pte_t *pte)
    258275{
    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 */
     290void 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;
    271308}
    272309
Note: See TracChangeset for help on using the changeset viewer.