* Removes the specified range of addresses from the page table page. */
| 5969 | * Removes the specified range of addresses from the page table page. |
| 5970 | */ |
| 5971 | static bool |
| 5972 | pmap_remove_ptes(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, |
| 5973 | pd_entry_t *pde, struct spglist *free, struct rwlock **lockp) |
| 5974 | { |
| 5975 | pt_entry_t PG_G, *pte; |
| 5976 | vm_offset_t va; |
| 5977 | bool anyvalid; |
| 5978 | |
| 5979 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 5980 | PG_G = pmap_global_bit(pmap); |
| 5981 | anyvalid = false; |
| 5982 | va = eva; |
| 5983 | for (pte = pmap_pde_to_pte(pde, sva); sva != eva; pte++, |
| 5984 | sva += PAGE_SIZE) { |
| 5985 | if (*pte == 0) { |
| 5986 | if (va != eva) { |
| 5987 | pmap_invalidate_range(pmap, va, sva); |
| 5988 | va = eva; |
| 5989 | } |
| 5990 | continue; |
| 5991 | } |
| 5992 | if ((*pte & PG_G) == 0) |
| 5993 | anyvalid = true; |
| 5994 | else if (va == eva) |
| 5995 | va = sva; |
| 5996 | if (pmap_remove_pte(pmap, pte, sva, *pde, free, lockp)) { |
| 5997 | sva += PAGE_SIZE; |
| 5998 | break; |
| 5999 | } |
| 6000 | } |
| 6001 | if (va != eva) |
| 6002 | pmap_invalidate_range(pmap, va, sva); |
| 6003 | return (anyvalid); |
| 6004 | } |
| 6005 | |
| 6006 | /* |
| 6007 | * Remove the given range of addresses from the specified map. |
no test coverage detected