phys_bytes pg_load() { phys_bytes phpagedir = vir2phys(pagedir); refresh_tlb(); write_ttbr0(phpagedir); return phpagedir; }
void page_remove(pgd_t* pgdir, viraddr_t va) { assert(pgdir); page_t *pf; pte_t *pte_store; pf = page_lookup(pgdir, va, &pte_store); if( pf == NULL ) return; //printk("free:%x\n",va); page_decref(pf); pte_set(*pte_store,0); refresh_tlb(pgdir, va); }
int page_insert(pgd_t* pgdir, page_t *pf,viraddr_t va, uint32_t perm) { assert(pgdir && pf); pte_t* pte = _page_walk(pgdir, va,true); if (!pte) return -ENOMEM; atomic_inc(&pf->_count); if (pte_present(*pte)) page_remove(pgdir, va); pte_val(*pte) = page2phys(pf) | perm | _PAGE_PRESENT; refresh_tlb(pgdir, va); return 0; }