Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 358 Lines • ▼ Show 20 Lines | |||||
#define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK) | #define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK) | ||||
#define PTE_TO_PHYS(pte) \ | #define PTE_TO_PHYS(pte) \ | ||||
((((pte) & ~PTE_HI_MASK) >> PTE_PPN0_S) * PAGE_SIZE) | ((((pte) & ~PTE_HI_MASK) >> PTE_PPN0_S) * PAGE_SIZE) | ||||
#define L2PTE_TO_PHYS(l2) \ | #define L2PTE_TO_PHYS(l2) \ | ||||
((((l2) & ~PTE_HI_MASK) >> PTE_PPN1_S) << L2_SHIFT) | ((((l2) & ~PTE_HI_MASK) >> PTE_PPN1_S) << L2_SHIFT) | ||||
static __inline pd_entry_t * | static __inline pd_entry_t * | ||||
pmap_l0(pmap_t pmap, vm_offset_t va) | |||||
{ | |||||
KASSERT(pmap_mode != PMAP_MODE_SV39, ("%s: in SV39 mode", __func__)); | |||||
KASSERT(VIRT_IS_VALID(va), | |||||
("%s: malformed virtual address %#lx", __func__, va)); | |||||
return (&pmap->pm_top[pmap_l0_index(va)]); | |||||
} | |||||
static __inline pd_entry_t * | |||||
pmap_l0_to_l1(pd_entry_t *l0, vm_offset_t va) | |||||
{ | |||||
vm_paddr_t phys; | |||||
pd_entry_t *l1; | |||||
KASSERT(pmap_mode != PMAP_MODE_SV39, ("%s: in SV39 mode", __func__)); | |||||
phys = PTE_TO_PHYS(pmap_load(l0)); | |||||
l1 = (pd_entry_t *)PHYS_TO_DMAP(phys); | |||||
return (&l1[pmap_l1_index(va)]); | |||||
} | |||||
static __inline pd_entry_t * | |||||
pmap_l1(pmap_t pmap, vm_offset_t va) | pmap_l1(pmap_t pmap, vm_offset_t va) | ||||
{ | { | ||||
pd_entry_t *l0; | |||||
KASSERT(VIRT_IS_VALID(va), | KASSERT(VIRT_IS_VALID(va), | ||||
("%s: malformed virtual address %#lx", __func__, va)); | ("%s: malformed virtual address %#lx", __func__, va)); | ||||
if (pmap_mode == PMAP_MODE_SV39) { | |||||
return (&pmap->pm_top[pmap_l1_index(va)]); | return (&pmap->pm_top[pmap_l1_index(va)]); | ||||
} else { | |||||
l0 = pmap_l0(pmap, va); | |||||
if ((pmap_load(l0) & PTE_V) == 0) | |||||
return (NULL); | |||||
if ((pmap_load(l0) & PTE_RX) != 0) | |||||
return (NULL); | |||||
return (pmap_l0_to_l1(l0, va)); | |||||
} | } | ||||
} | |||||
static __inline pd_entry_t * | static __inline pd_entry_t * | ||||
pmap_l1_to_l2(pd_entry_t *l1, vm_offset_t va) | pmap_l1_to_l2(pd_entry_t *l1, vm_offset_t va) | ||||
{ | { | ||||
vm_paddr_t phys; | vm_paddr_t phys; | ||||
pd_entry_t *l2; | pd_entry_t *l2; | ||||
phys = PTE_TO_PHYS(pmap_load(l1)); | phys = PTE_TO_PHYS(pmap_load(l1)); | ||||
l2 = (pd_entry_t *)PHYS_TO_DMAP(phys); | l2 = (pd_entry_t *)PHYS_TO_DMAP(phys); | ||||
return (&l2[pmap_l2_index(va)]); | return (&l2[pmap_l2_index(va)]); | ||||
} | } | ||||
static __inline pd_entry_t * | static __inline pd_entry_t * | ||||
pmap_l2(pmap_t pmap, vm_offset_t va) | pmap_l2(pmap_t pmap, vm_offset_t va) | ||||
{ | { | ||||
pd_entry_t *l1; | pd_entry_t *l1; | ||||
l1 = pmap_l1(pmap, va); | l1 = pmap_l1(pmap, va); | ||||
if (l1 == NULL) | |||||
return (NULL); | |||||
if ((pmap_load(l1) & PTE_V) == 0) | if ((pmap_load(l1) & PTE_V) == 0) | ||||
return (NULL); | return (NULL); | ||||
if ((pmap_load(l1) & PTE_RX) != 0) | if ((pmap_load(l1) & PTE_RX) != 0) | ||||
return (NULL); | return (NULL); | ||||
return (pmap_l1_to_l2(l1, va)); | return (pmap_l1_to_l2(l1, va)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 4,397 Lines • Show Last 20 Lines |