Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/arm/pmap-v6.c
Show First 20 Lines • Show All 1,996 Lines • ▼ Show 20 Lines | |||||
retry: | retry: | ||||
pte1 = pte1_load(pmap_pte1(pmap, va)); | pte1 = pte1_load(pmap_pte1(pmap, va)); | ||||
if (pte1_is_section(pte1)) { | if (pte1_is_section(pte1)) { | ||||
if (!(pte1 & PTE1_RO) || !(prot & VM_PROT_WRITE)) { | if (!(pte1 & PTE1_RO) || !(prot & VM_PROT_WRITE)) { | ||||
pa = pte1_pa(pte1) | (va & PTE1_OFFSET); | pa = pte1_pa(pte1) | (va & PTE1_OFFSET); | ||||
if (vm_page_pa_tryrelock(pmap, pa, &lockpa)) | if (vm_page_pa_tryrelock(pmap, pa, &lockpa)) | ||||
goto retry; | goto retry; | ||||
m = PHYS_TO_VM_PAGE(pa); | m = PHYS_TO_VM_PAGE(pa); | ||||
vm_page_hold(m); | vm_page_wire(m); | ||||
} | } | ||||
} else if (pte1_is_link(pte1)) { | } else if (pte1_is_link(pte1)) { | ||||
pte2p = pmap_pte2(pmap, va); | pte2p = pmap_pte2(pmap, va); | ||||
pte2 = pte2_load(pte2p); | pte2 = pte2_load(pte2p); | ||||
pmap_pte2_release(pte2p); | pmap_pte2_release(pte2p); | ||||
if (pte2_is_valid(pte2) && | if (pte2_is_valid(pte2) && | ||||
(!(pte2 & PTE2_RO) || !(prot & VM_PROT_WRITE))) { | (!(pte2 & PTE2_RO) || !(prot & VM_PROT_WRITE))) { | ||||
pa = pte2_pa(pte2); | pa = pte2_pa(pte2); | ||||
if (vm_page_pa_tryrelock(pmap, pa, &lockpa)) | if (vm_page_pa_tryrelock(pmap, pa, &lockpa)) | ||||
goto retry; | goto retry; | ||||
m = PHYS_TO_VM_PAGE(pa); | m = PHYS_TO_VM_PAGE(pa); | ||||
vm_page_hold(m); | vm_page_wire(m); | ||||
} | } | ||||
} | } | ||||
PA_UNLOCK_COND(lockpa); | PA_UNLOCK_COND(lockpa); | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
return (m); | return (m); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 4,679 Lines • ▼ Show 20 Lines | for (i = 0; i < NPTE1_IN_PT1; i++) { | ||||
pte2p = pmap_pte2(pmap, va); | pte2p = pmap_pte2(pmap, va); | ||||
pte2 = pte2_load(pte2p); | pte2 = pte2_load(pte2p); | ||||
pmap_pte2_release(pte2p); | pmap_pte2_release(pte2p); | ||||
if (!pte2_is_valid(pte2)) | if (!pte2_is_valid(pte2)) | ||||
continue; | continue; | ||||
pa = pte2_pa(pte2); | pa = pte2_pa(pte2); | ||||
m = PHYS_TO_VM_PAGE(pa); | m = PHYS_TO_VM_PAGE(pa); | ||||
printf("va: 0x%x, pa: 0x%x, h: %d, w:" | printf("va: 0x%x, pa: 0x%x, w: %d, " | ||||
" %d, f: 0x%x", va, pa, | "f: 0x%x", va, pa, | ||||
m->hold_count, m->wire_count, | m->wire_count, m->flags); | ||||
m->flags); | |||||
npte2++; | npte2++; | ||||
index++; | index++; | ||||
if (index >= 2) { | if (index >= 2) { | ||||
index = 0; | index = 0; | ||||
printf("\n"); | printf("\n"); | ||||
} else { | } else { | ||||
printf(" "); | printf(" "); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | if (!pte2_is_valid(pte2)) { | ||||
printf(" - not valid !!!"); | printf(" - not valid !!!"); | ||||
printf("\n"); | printf("\n"); | ||||
continue; | continue; | ||||
} | } | ||||
m = PHYS_TO_VM_PAGE(pte2_pa(pte2)); | m = PHYS_TO_VM_PAGE(pte2_pa(pte2)); | ||||
printf(" 0x%08X: 0x%08X, TEX%d, s:%d, g:%d, m:%p", va , pte2, | printf(" 0x%08X: 0x%08X, TEX%d, s:%d, g:%d, m:%p", va , pte2, | ||||
pte2_class(pte2), !!(pte2 & PTE2_S), !(pte2 & PTE2_NG), m); | pte2_class(pte2), !!(pte2 & PTE2_S), !(pte2 & PTE2_NG), m); | ||||
if (m != NULL) { | if (m != NULL) { | ||||
printf(" v:%d h:%d w:%d f:0x%04X\n", m->valid, | printf(" v:%d w:%d f:0x%04X\n", m->valid, | ||||
m->hold_count, m->wire_count, m->flags); | m->wire_count, m->flags); | ||||
} else { | } else { | ||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
static __inline boolean_t | static __inline boolean_t | ||||
is_pv_chunk_space(vm_offset_t va) | is_pv_chunk_space(vm_offset_t va) | ||||
▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | for (i = 0; i < PT2TAB_ENTRIES; i++) { | ||||
if (!pte2_is_valid(pte2)) | if (!pte2_is_valid(pte2)) | ||||
continue; | continue; | ||||
va = i << PT2TAB_SHIFT; | va = i << PT2TAB_SHIFT; | ||||
pa = pte2_pa(pte2); | pa = pte2_pa(pte2); | ||||
m = PHYS_TO_VM_PAGE(pa); | m = PHYS_TO_VM_PAGE(pa); | ||||
printf(" 0x%08X: 0x%08X, TEX%d, s:%d, m:%p", va, pte2, | printf(" 0x%08X: 0x%08X, TEX%d, s:%d, m:%p", va, pte2, | ||||
pte2_class(pte2), !!(pte2 & PTE2_S), m); | pte2_class(pte2), !!(pte2 & PTE2_S), m); | ||||
if (m != NULL) | if (m != NULL) | ||||
printf(" , h: %d, w: %d, f: 0x%04X pidx: %lld", | printf(" , w: %d, f: 0x%04X pidx: %lld", | ||||
m->hold_count, m->wire_count, m->flags, m->pindex); | m->wire_count, m->flags, m->pindex); | ||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
} | } | ||||
DB_SHOW_COMMAND(pmap_pt2tab, pmap_pt2tab_print) | DB_SHOW_COMMAND(pmap_pt2tab, pmap_pt2tab_print) | ||||
{ | { | ||||
/* XXX convert args. */ | /* XXX convert args. */ | ||||
pmap_t pmap = (pmap_t)addr; | pmap_t pmap = (pmap_t)addr; | ||||
Show All 37 Lines |