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

Function pmap_alloc_l2

freebsd/arm64/arm64/pmap.c:1971–2006  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1969}
1970
1971static pd_entry_t *
1972pmap_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
1979retry:
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
2008static vm_page_t
2009pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)

Callers 2

pmap_enter_l2Function · 0.85
pmap_copyFunction · 0.85

Calls 5

pmap_l1Function · 0.85
pmap_l1_to_l2Function · 0.85
PHYS_TO_VM_PAGEFunction · 0.85
_pmap_alloc_l3Function · 0.85
panicFunction · 0.50

Tested by

no test coverage detected