• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /barrelfish-2018-10-04/lib/barrelfish/arch/x86_64/

Lines Matching defs:page

5  * x86_64 specific management of page tables
10 * sized page is the number of page table levels + 1.
13 * Warning: Additional slots will be required to map a BASE_PAGE_SIZE size page,
68 // returns whether va1 and va2 share a page directory entry
75 // returns whether va1 and va2 share a page directory pointer table entry
80 // returns whether va1 and va2 share a page map level 4 entry
132 * \brief Returns the vnode for the page directory mapping a given vspace
199 * \brief Returns the vnode for the page directory pointer table mapping for a
212 * \brief Returns the vnode for the page directory mapping a given vspace
284 printf("page already exists in 0x%"
288 // clean out empty page tables. We do this here because we benefit
289 // from having the page tables in place when doing lots of small
296 struct vnode *page = slab_alloc(&pmap->slab);
297 assert(page);
298 page->is_vnode = false;
299 page->entry = table_base;
300 page->next = ptable->u.vnode.children;
301 ptable->u.vnode.children = page;
302 page->u.frame.cap = frame;
303 page->u.frame.offset = offset;
304 page->u.frame.flags = flags;
305 page->u.frame.pte_count = pte_count;
307 err = pmap->p.slot_alloc->alloc(pmap->p.slot_alloc, &page->mapping);
315 pmap_flags, offset, pte_count, page->mapping);
332 // determine page size and relevant address part
350 // huge page branch (1GB)
362 // large page branch (2MB)
372 // round to the next full page and calculate end address and #ptes
389 "; pte_count = %zd; frame bytes = 0x%zx; page size = 0x%zx\n",
407 else { // multiple leaf page tables
528 // If we recurse, we require more slabs than to map a single page
564 * \brief Create page mappings
589 // Adjust the parameters to page boundaries
622 max_slabs += 5; // minimum amount required to map a page
647 struct vnode *page;
657 * \arg pt the last-level page table meta-data we found if any
658 * \arg page the page meta-data we found if any
664 struct vnode *pdpt = NULL, *pdir = NULL, *pt = NULL, *page = NULL;
670 // find page and last-level page table (can be pdir or pdpt)
672 page = find_vnode(pdpt, X86_64_PDPT_BASE(vaddr));
673 if (page && page->is_vnode) { // not 1G pages
674 pdir = page;
675 page = find_vnode(pdir, X86_64_PDIR_BASE(vaddr));
676 if (page && page->is_vnode) { // not 2M pages
677 pt = page;
678 page = find_vnode(pt, X86_64_PTABLE_BASE(vaddr));
682 } else if (page) {
683 assert(is_large_page(page));
689 } else if (page) {
690 assert(is_huge_page(page));
699 info->page = page;
704 if (pt && page) {
720 assert(info.page_table && info.page_table->is_vnode && info.page && !info.page->is_vnode);
722 if (info.page->u.frame.pte_count == pte_count) {
723 err = vnode_unmap(info.page_table->u.vnode.cap, info.page->mapping);
730 // delete&free page->mapping after doing vnode_unmap()
731 err = cap_delete(info.page->mapping);
735 err = pmap->p.slot_alloc->free(pmap->p.slot_alloc, info.page->mapping);
740 remove_vnode(info.page_table, info.page);
741 slab_free(&pmap->slab, info.page);
748 * \brief Remove page mappings
762 //determine if we unmap a larger page
770 assert(!info.page->is_vnode);
772 if (info.page->entry > info.table_base) {
783 (is_same_pdpt(vaddr, vend) && is_large_page(info.page)) ||
784 (is_same_pml4(vaddr, vend) && is_huge_page(info.page)))
849 assert(info.page_table && info.page_table->is_vnode && info.page && !info.page->is_vnode);
854 // page (as offset from first page in mapping), #affected
857 size_t off = info.table_base - info.page->entry;
862 // do assisted selective flush for single page
865 err = invoke_mapping_modify_flags(info.page->mapping, off, pages,
879 * \brief Modify page mapping
893 //determine if we unmap a larger page
900 assert(info.page && !info.page->is_vnode);
911 (is_same_pdpt(vaddr, vend) && is_large_page(info.page)) ||
912 (is_same_pml4(vaddr, vend) && is_huge_page(info.page))) {
958 * \brief Query existing page mapping
985 info->cap = find_info.page->u.frame.cap;
986 info->offset = find_info.page->u.frame.offset;
987 info->flags = find_info.page->u.frame.flags;
988 info->mapping = find_info.page->mapping;