| 4103 | } |
| 4104 | |
| 4105 | static vm_page_t |
| 4106 | pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, |
| 4107 | vm_prot_t prot, vm_page_t mpte) |
| 4108 | { |
| 4109 | pt_entry_t newpte, *pte; |
| 4110 | |
| 4111 | KASSERT(pmap != kernel_pmap || va < kmi.clean_sva || |
| 4112 | va >= kmi.clean_eva || (m->oflags & VPO_UNMANAGED) != 0, |
| 4113 | ("pmap_enter_quick_locked: managed mapping within the clean submap")); |
| 4114 | rw_assert(&pvh_global_lock, RA_WLOCKED); |
| 4115 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 4116 | |
| 4117 | /* |
| 4118 | * In the case that a page table page is not |
| 4119 | * resident, we are creating it here. |
| 4120 | */ |
| 4121 | if (pmap != kernel_pmap) { |
| 4122 | u_int ptepindex; |
| 4123 | pd_entry_t ptepa; |
| 4124 | |
| 4125 | /* |
| 4126 | * Calculate pagetable page index |
| 4127 | */ |
| 4128 | ptepindex = va >> PDRSHIFT; |
| 4129 | if (mpte && (mpte->pindex == ptepindex)) { |
| 4130 | mpte->ref_count++; |
| 4131 | } else { |
| 4132 | /* |
| 4133 | * Get the page directory entry |
| 4134 | */ |
| 4135 | ptepa = pmap->pm_pdir[ptepindex]; |
| 4136 | |
| 4137 | /* |
| 4138 | * If the page table page is mapped, we just increment |
| 4139 | * the hold count, and activate it. |
| 4140 | */ |
| 4141 | if (ptepa) { |
| 4142 | if (ptepa & PG_PS) |
| 4143 | return (NULL); |
| 4144 | mpte = PHYS_TO_VM_PAGE(ptepa & PG_FRAME); |
| 4145 | mpte->ref_count++; |
| 4146 | } else { |
| 4147 | mpte = _pmap_allocpte(pmap, ptepindex, |
| 4148 | PMAP_ENTER_NOSLEEP); |
| 4149 | if (mpte == NULL) |
| 4150 | return (mpte); |
| 4151 | } |
| 4152 | } |
| 4153 | } else { |
| 4154 | mpte = NULL; |
| 4155 | } |
| 4156 | |
| 4157 | sched_pin(); |
| 4158 | pte = pmap_pte_quick(pmap, va); |
| 4159 | if (*pte) { |
| 4160 | if (mpte != NULL) |
| 4161 | mpte->ref_count--; |
| 4162 | sched_unpin(); |
no test coverage detected