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

Function pmap_alloc_pde

freebsd/amd64/amd64/pmap.c:4543–4581  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4541}
4542
4543static pd_entry_t *
4544pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp,
4545 struct rwlock **lockp)
4546{
4547 pdp_entry_t *pdpe, PG_V;
4548 pd_entry_t *pde;
4549 vm_page_t pdpg;
4550 vm_pindex_t pdpindex;
4551
4552 PG_V = pmap_valid_bit(pmap);
4553
4554retry:
4555 pdpe = pmap_pdpe(pmap, va);
4556 if (pdpe != NULL && (*pdpe & PG_V) != 0) {
4557 pde = pmap_pdpe_to_pde(pdpe, va);
4558 if (va < VM_MAXUSER_ADDRESS) {
4559 /* Add a reference to the pd page. */
4560 pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
4561 pdpg->ref_count++;
4562 } else
4563 pdpg = NULL;
4564 } else if (va < VM_MAXUSER_ADDRESS) {
4565 /* Allocate a pd page. */
4566 pdpindex = pmap_pde_pindex(va) >> NPDPEPGSHIFT;
4567 pdpg = pmap_allocpte_alloc(pmap, NUPDE + pdpindex, lockp, va);
4568 if (pdpg == NULL) {
4569 if (lockp != NULL)
4570 goto retry;
4571 else
4572 return (NULL);
4573 }
4574 pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg));
4575 pde = &pde[pmap_pde_index(va)];
4576 } else
4577 panic("pmap_alloc_pde: missing page table page for va %#lx",
4578 va);
4579 *pdpgp = pdpg;
4580 return (pde);
4581}
4582
4583static vm_page_t
4584pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)

Callers 3

pmap_enter_pdeFunction · 0.85
pmap_object_init_ptFunction · 0.85
pmap_copyFunction · 0.85

Calls 8

pmap_valid_bitFunction · 0.85
pmap_pdpeFunction · 0.85
PHYS_TO_VM_PAGEFunction · 0.85
pmap_pde_pindexFunction · 0.85
pmap_allocpte_allocFunction · 0.85
pmap_pde_indexFunction · 0.85
pmap_pdpe_to_pdeFunction · 0.70
panicFunction · 0.50

Tested by

no test coverage detected