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

Function pmap_allocpte_getpdp

freebsd/amd64/amd64/pmap.c:4318–4357  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4316}
4317
4318static pdp_entry_t *
4319pmap_allocpte_getpdp(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4320 bool addref)
4321{
4322 vm_page_t pdppg;
4323 pml4_entry_t *pml4;
4324 pdp_entry_t *pdp;
4325 pt_entry_t PG_V;
4326 bool allocated;
4327
4328 PG_V = pmap_valid_bit(pmap);
4329
4330 pml4 = pmap_allocpte_getpml4(pmap, lockp, va, false);
4331 if (pml4 == NULL)
4332 return (NULL);
4333
4334 if ((*pml4 & PG_V) == 0) {
4335 /* Have to allocate a new pdp, recurse */
4336 if (pmap_allocpte_nosleep(pmap, pmap_pml4e_pindex(va), lockp,
4337 va) == NULL) {
4338 if (pmap_is_la57(pmap))
4339 pmap_allocpte_free_unref(pmap, va,
4340 pmap_pml5e(pmap, va));
4341 return (NULL);
4342 }
4343 allocated = true;
4344 } else {
4345 allocated = false;
4346 }
4347 pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
4348 pdp = &pdp[pmap_pdpe_index(va)];
4349 if ((*pdp & PG_V) == 0) {
4350 pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
4351 if (allocated && !addref)
4352 pdppg->ref_count--;
4353 else if (!allocated && addref)
4354 pdppg->ref_count++;
4355 }
4356 return (pdp);
4357}
4358
4359/*
4360 * The ptepindexes, i.e. page indices, of the page table pages encountered

Callers 1

pmap_allocpte_nosleepFunction · 0.85

Calls 9

pmap_valid_bitFunction · 0.85
pmap_allocpte_getpml4Function · 0.85
pmap_allocpte_nosleepFunction · 0.85
pmap_pml4e_pindexFunction · 0.85
pmap_is_la57Function · 0.85
pmap_allocpte_free_unrefFunction · 0.85
pmap_pml5eFunction · 0.85
pmap_pdpe_indexFunction · 0.85
PHYS_TO_VM_PAGEFunction · 0.85

Tested by

no test coverage detected