| 1969 | } |
| 1970 | |
| 1971 | static pd_entry_t * |
| 1972 | pmap_alloc_l2(pmap_t pmap, vm_offset_t va, vm_page_t *l2pgp, |
| 1973 | struct rwlock **lockp) |
| 1974 | { |
| 1975 | pd_entry_t *l1, *l2; |
| 1976 | vm_page_t l2pg; |
| 1977 | vm_pindex_t l2pindex; |
| 1978 | |
| 1979 | retry: |
| 1980 | l1 = pmap_l1(pmap, va); |
| 1981 | if (l1 != NULL && (pmap_load(l1) & ATTR_DESCR_MASK) == L1_TABLE) { |
| 1982 | l2 = pmap_l1_to_l2(l1, va); |
| 1983 | if (va < VM_MAXUSER_ADDRESS) { |
| 1984 | /* Add a reference to the L2 page. */ |
| 1985 | l2pg = PHYS_TO_VM_PAGE(pmap_load(l1) & ~ATTR_MASK); |
| 1986 | l2pg->ref_count++; |
| 1987 | } else |
| 1988 | l2pg = NULL; |
| 1989 | } else if (va < VM_MAXUSER_ADDRESS) { |
| 1990 | /* Allocate a L2 page. */ |
| 1991 | l2pindex = pmap_l2_pindex(va) >> Ln_ENTRIES_SHIFT; |
| 1992 | l2pg = _pmap_alloc_l3(pmap, NUL2E + l2pindex, lockp); |
| 1993 | if (l2pg == NULL) { |
| 1994 | if (lockp != NULL) |
| 1995 | goto retry; |
| 1996 | else |
| 1997 | return (NULL); |
| 1998 | } |
| 1999 | l2 = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(l2pg)); |
| 2000 | l2 = &l2[pmap_l2_index(va)]; |
| 2001 | } else |
| 2002 | panic("pmap_alloc_l2: missing page table page for va %#lx", |
| 2003 | va); |
| 2004 | *l2pgp = l2pg; |
| 2005 | return (l2); |
| 2006 | } |
| 2007 | |
| 2008 | static vm_page_t |
| 2009 | pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) |
no test coverage detected