MCPcopy Create free account
hub / github.com/F-Stack/f-stack / _pmap_allocpte

Function _pmap_allocpte

freebsd/i386/i386/pmap.c:2124–2164  ·  view source on GitHub ↗

* this routine is called if the page table page is not * mapped correctly. */

Source from the content-addressed store, hash-verified

2122 * mapped correctly.
2123 */
2124static vm_page_t
2125_pmap_allocpte(pmap_t pmap, u_int ptepindex, u_int flags)
2126{
2127 vm_paddr_t ptepa;
2128 vm_page_t m;
2129
2130 /*
2131 * Allocate a page table page.
2132 */
2133 if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
2134 VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
2135 if ((flags & PMAP_ENTER_NOSLEEP) == 0) {
2136 PMAP_UNLOCK(pmap);
2137 rw_wunlock(&pvh_global_lock);
2138 vm_wait(NULL);
2139 rw_wlock(&pvh_global_lock);
2140 PMAP_LOCK(pmap);
2141 }
2142
2143 /*
2144 * Indicate the need to retry. While waiting, the page table
2145 * page may have been allocated.
2146 */
2147 return (NULL);
2148 }
2149 if ((m->flags & PG_ZERO) == 0)
2150 pmap_zero_page(m);
2151
2152 /*
2153 * Map the pagetable page into the process address space, if
2154 * it isn't already there.
2155 */
2156
2157 pmap->pm_stats.resident_count++;
2158
2159 ptepa = VM_PAGE_TO_PHYS(m);
2160 pmap->pm_pdir[ptepindex] =
2161 (pd_entry_t) (ptepa | PG_U | PG_RW | PG_V | PG_A | PG_M);
2162
2163 return (m);
2164}
2165
2166static vm_page_t
2167pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags)

Callers 2

pmap_allocpteFunction · 0.70
pmap_enter_quick_lockedFunction · 0.70

Calls 3

vm_page_allocFunction · 0.85
vm_waitFunction · 0.85
pmap_zero_pageFunction · 0.70

Tested by

no test coverage detected