Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 1,342 Lines • ▼ Show 20 Lines | |||||
pmap_alloc_l2(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) | pmap_alloc_l2(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) | ||||
{ | { | ||||
pd_entry_t *l1; | pd_entry_t *l1; | ||||
vm_page_t l2pg; | vm_page_t l2pg; | ||||
vm_pindex_t l2pindex; | vm_pindex_t l2pindex; | ||||
retry: | retry: | ||||
l1 = pmap_l1(pmap, va); | l1 = pmap_l1(pmap, va); | ||||
if (l1 != NULL && (pmap_load(l1) & PTE_RWX) == 0) { | if (l1 != NULL && (pmap_load(l1) & PTE_V) != 0) { | ||||
KASSERT((pmap_load(l1) & PTE_RWX) == 0, | |||||
("%s: L1 entry %#lx for VA %#lx is a leaf", __func__, | |||||
pmap_load(l1), va)); | |||||
/* Add a reference to the L2 page. */ | /* Add a reference to the L2 page. */ | ||||
l2pg = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l1))); | l2pg = PHYS_TO_VM_PAGE(PTE_TO_PHYS(pmap_load(l1))); | ||||
l2pg->ref_count++; | l2pg->ref_count++; | ||||
} else { | } else { | ||||
/* Allocate a L2 page. */ | /* Allocate a L2 page. */ | ||||
l2pindex = pmap_l2_pindex(va) >> Ln_ENTRIES_SHIFT; | l2pindex = pmap_l2_pindex(va) >> Ln_ENTRIES_SHIFT; | ||||
l2pg = _pmap_alloc_l3(pmap, NUL2E + l2pindex, lockp); | l2pg = _pmap_alloc_l3(pmap, NUL2E + l2pindex, lockp); | ||||
if (l2pg == NULL && lockp != NULL) | if (l2pg == NULL && lockp != NULL) | ||||
▲ Show 20 Lines • Show All 3,328 Lines • Show Last 20 Lines |