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

Function pmap_allocpte_getpml4

freebsd/amd64/amd64/pmap.c:4281–4316  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4279}
4280
4281static pml4_entry_t *
4282pmap_allocpte_getpml4(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4283 bool addref)
4284{
4285 vm_pindex_t pml5index;
4286 pml5_entry_t *pml5;
4287 pml4_entry_t *pml4;
4288 vm_page_t pml4pg;
4289 pt_entry_t PG_V;
4290 bool allocated;
4291
4292 if (!pmap_is_la57(pmap))
4293 return (&pmap->pm_pmltop[pmap_pml4e_index(va)]);
4294
4295 PG_V = pmap_valid_bit(pmap);
4296 pml5index = pmap_pml5e_index(va);
4297 pml5 = &pmap->pm_pmltop[pml5index];
4298 if ((*pml5 & PG_V) == 0) {
4299 if (pmap_allocpte_nosleep(pmap, pmap_pml5e_pindex(va), lockp,
4300 va) == NULL)
4301 return (NULL);
4302 allocated = true;
4303 } else {
4304 allocated = false;
4305 }
4306 pml4 = (pml4_entry_t *)PHYS_TO_DMAP(*pml5 & PG_FRAME);
4307 pml4 = &pml4[pmap_pml4e_index(va)];
4308 if ((*pml4 & PG_V) == 0) {
4309 pml4pg = PHYS_TO_VM_PAGE(*pml5 & PG_FRAME);
4310 if (allocated && !addref)
4311 pml4pg->ref_count--;
4312 else if (!allocated && addref)
4313 pml4pg->ref_count++;
4314 }
4315 return (pml4);
4316}
4317
4318static pdp_entry_t *
4319pmap_allocpte_getpdp(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,

Callers 2

pmap_allocpte_getpdpFunction · 0.85
pmap_allocpte_nosleepFunction · 0.85

Calls 7

pmap_is_la57Function · 0.85
pmap_pml4e_indexFunction · 0.85
pmap_valid_bitFunction · 0.85
pmap_pml5e_indexFunction · 0.85
pmap_allocpte_nosleepFunction · 0.85
pmap_pml5e_pindexFunction · 0.85
PHYS_TO_VM_PAGEFunction · 0.85

Tested by

no test coverage detected