Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/arm64/pmap.c
Show First 20 Lines • Show All 1,864 Lines • ▼ Show 20 Lines | _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp) | ||||
*/ | */ | ||||
if (ptepindex >= (NUL2E + NUL1E)) { | if (ptepindex >= (NUL2E + NUL1E)) { | ||||
pd_entry_t *l0; | pd_entry_t *l0; | ||||
vm_pindex_t l0index; | vm_pindex_t l0index; | ||||
l0index = ptepindex - (NUL2E + NUL1E); | l0index = ptepindex - (NUL2E + NUL1E); | ||||
l0 = &pmap->pm_l0[l0index]; | l0 = &pmap->pm_l0[l0index]; | ||||
KASSERT((pmap_load(l0) & ATTR_DESCR_VALID) == 0, | |||||
("%s: L0 entry %#lx is valid", __func__, pmap_load(l0))); | |||||
pmap_store(l0, VM_PAGE_TO_PHYS(m) | L0_TABLE); | pmap_store(l0, VM_PAGE_TO_PHYS(m) | L0_TABLE); | ||||
} else if (ptepindex >= NUL2E) { | } else if (ptepindex >= NUL2E) { | ||||
vm_pindex_t l0index, l1index; | vm_pindex_t l0index, l1index; | ||||
pd_entry_t *l0, *l1; | pd_entry_t *l0, *l1; | ||||
pd_entry_t tl0; | pd_entry_t tl0; | ||||
l1index = ptepindex - NUL2E; | l1index = ptepindex - NUL2E; | ||||
l0index = l1index >> L0_ENTRIES_SHIFT; | l0index = l1index >> L0_ENTRIES_SHIFT; | ||||
Show All 10 Lines | if (tl0 == 0) { | ||||
} | } | ||||
} else { | } else { | ||||
l1pg = PHYS_TO_VM_PAGE(tl0 & ~ATTR_MASK); | l1pg = PHYS_TO_VM_PAGE(tl0 & ~ATTR_MASK); | ||||
l1pg->ref_count++; | l1pg->ref_count++; | ||||
} | } | ||||
l1 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l0) & ~ATTR_MASK); | l1 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l0) & ~ATTR_MASK); | ||||
l1 = &l1[ptepindex & Ln_ADDR_MASK]; | l1 = &l1[ptepindex & Ln_ADDR_MASK]; | ||||
KASSERT((pmap_load(l1) & ATTR_DESCR_VALID) == 0, | |||||
("%s: L1 entry %#lx is valid", __func__, pmap_load(l1))); | |||||
pmap_store(l1, VM_PAGE_TO_PHYS(m) | L1_TABLE); | pmap_store(l1, VM_PAGE_TO_PHYS(m) | L1_TABLE); | ||||
} else { | } else { | ||||
vm_pindex_t l0index, l1index; | vm_pindex_t l0index, l1index; | ||||
pd_entry_t *l0, *l1, *l2; | pd_entry_t *l0, *l1, *l2; | ||||
pd_entry_t tl0, tl1; | pd_entry_t tl0, tl1; | ||||
l1index = ptepindex >> Ln_ENTRIES_SHIFT; | l1index = ptepindex >> Ln_ENTRIES_SHIFT; | ||||
l0index = l1index >> L0_ENTRIES_SHIFT; | l0index = l1index >> L0_ENTRIES_SHIFT; | ||||
Show All 26 Lines | if (tl0 == 0) { | ||||
} else { | } else { | ||||
l2pg = PHYS_TO_VM_PAGE(tl1 & ~ATTR_MASK); | l2pg = PHYS_TO_VM_PAGE(tl1 & ~ATTR_MASK); | ||||
l2pg->ref_count++; | l2pg->ref_count++; | ||||
} | } | ||||
} | } | ||||
l2 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l1) & ~ATTR_MASK); | l2 = (pd_entry_t *)PHYS_TO_DMAP(pmap_load(l1) & ~ATTR_MASK); | ||||
l2 = &l2[ptepindex & Ln_ADDR_MASK]; | l2 = &l2[ptepindex & Ln_ADDR_MASK]; | ||||
KASSERT((pmap_load(l2) & ATTR_DESCR_VALID) == 0, | |||||
("%s: L2 entry %#lx is valid", __func__, pmap_load(l2))); | |||||
pmap_store(l2, VM_PAGE_TO_PHYS(m) | L2_TABLE); | pmap_store(l2, VM_PAGE_TO_PHYS(m) | L2_TABLE); | ||||
} | } | ||||
pmap_resident_count_inc(pmap, 1); | pmap_resident_count_inc(pmap, 1); | ||||
return (m); | return (m); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 5,085 Lines • Show Last 20 Lines |