* this routine is called if the page table page is not * mapped correctly. */
| 2122 | * mapped correctly. |
| 2123 | */ |
| 2124 | static 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 | |
| 2166 | static vm_page_t |
| 2167 | pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags) |
no test coverage detected