[PowerPC] Use PVO_PADDR to get the PA from PVO
Use PVO_PADDR macro to get the physical address from a PVO, instead of explicitly ANDing pvo_pte.pa with LPTE_RPGN where it is needed. Besides improving readability, this is needed to support superpages (D25237), where the steps to get the PA from a PVO are different. Reviewed by: markj Sponsored by: Eldorado Research Institute (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D25654
This commit is contained in:
parent
8ca1ed33ec
commit
4c0c2fb1ad
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=363222
@ -108,6 +108,9 @@ uintptr_t moea64_get_unique_vsid(void);
|
|||||||
#define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff)
|
#define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff)
|
||||||
#define VSID_HASH_MASK 0x0000007fffffffffULL
|
#define VSID_HASH_MASK 0x0000007fffffffffULL
|
||||||
|
|
||||||
|
/* Get physical address from PVO. */
|
||||||
|
#define PVO_PADDR(pvo) ((pvo)->pvo_pte.pa & LPTE_RPGN)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Locking semantics:
|
* Locking semantics:
|
||||||
*
|
*
|
||||||
@ -1207,7 +1210,7 @@ moea64_unwire(pmap_t pm, vm_offset_t sva, vm_offset_t eva)
|
|||||||
(pvo->pvo_pte.prot & VM_PROT_WRITE)) {
|
(pvo->pvo_pte.prot & VM_PROT_WRITE)) {
|
||||||
if (refchg < 0)
|
if (refchg < 0)
|
||||||
refchg = LPTE_CHG;
|
refchg = LPTE_CHG;
|
||||||
m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
|
m = PHYS_TO_VM_PAGE(PVO_PADDR(pvo));
|
||||||
|
|
||||||
refchg |= atomic_readandclear_32(&m->md.mdpg_attrs);
|
refchg |= atomic_readandclear_32(&m->md.mdpg_attrs);
|
||||||
if (refchg & LPTE_CHG)
|
if (refchg & LPTE_CHG)
|
||||||
@ -1615,7 +1618,7 @@ moea64_extract(pmap_t pm, vm_offset_t va)
|
|||||||
if (pvo == NULL)
|
if (pvo == NULL)
|
||||||
pa = 0;
|
pa = 0;
|
||||||
else
|
else
|
||||||
pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
|
pa = PVO_PADDR(pvo) | (va - PVO_VADDR(pvo));
|
||||||
PMAP_UNLOCK(pm);
|
PMAP_UNLOCK(pm);
|
||||||
|
|
||||||
return (pa);
|
return (pa);
|
||||||
@ -1636,7 +1639,7 @@ moea64_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
|
|||||||
PMAP_LOCK(pmap);
|
PMAP_LOCK(pmap);
|
||||||
pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF);
|
pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF);
|
||||||
if (pvo != NULL && (pvo->pvo_pte.prot & prot) == prot) {
|
if (pvo != NULL && (pvo->pvo_pte.prot & prot) == prot) {
|
||||||
m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
|
m = PHYS_TO_VM_PAGE(PVO_PADDR(pvo));
|
||||||
if (!vm_page_wire_mapped(m))
|
if (!vm_page_wire_mapped(m))
|
||||||
m = NULL;
|
m = NULL;
|
||||||
}
|
}
|
||||||
@ -1943,7 +1946,7 @@ moea64_kextract(vm_offset_t va)
|
|||||||
pvo = moea64_pvo_find_va(kernel_pmap, va);
|
pvo = moea64_pvo_find_va(kernel_pmap, va);
|
||||||
KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR,
|
KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR,
|
||||||
va));
|
va));
|
||||||
pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
|
pa = PVO_PADDR(pvo) | (va - PVO_VADDR(pvo));
|
||||||
PMAP_UNLOCK(kernel_pmap);
|
PMAP_UNLOCK(kernel_pmap);
|
||||||
return (pa);
|
return (pa);
|
||||||
}
|
}
|
||||||
@ -2269,7 +2272,7 @@ moea64_pvo_protect( pmap_t pm, struct pvo_entry *pvo, vm_prot_t prot)
|
|||||||
*/
|
*/
|
||||||
oldprot = pvo->pvo_pte.prot;
|
oldprot = pvo->pvo_pte.prot;
|
||||||
pvo->pvo_pte.prot = prot;
|
pvo->pvo_pte.prot = prot;
|
||||||
pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
|
pg = PHYS_TO_VM_PAGE(PVO_PADDR(pvo));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the PVO is in the page table, update mapping
|
* If the PVO is in the page table, update mapping
|
||||||
@ -2284,7 +2287,7 @@ moea64_pvo_protect( pmap_t pm, struct pvo_entry *pvo, vm_prot_t prot)
|
|||||||
if ((pg->oflags & VPO_UNMANAGED) == 0)
|
if ((pg->oflags & VPO_UNMANAGED) == 0)
|
||||||
vm_page_aflag_set(pg, PGA_EXECUTABLE);
|
vm_page_aflag_set(pg, PGA_EXECUTABLE);
|
||||||
moea64_syncicache(pm, PVO_VADDR(pvo),
|
moea64_syncicache(pm, PVO_VADDR(pvo),
|
||||||
pvo->pvo_pte.pa & LPTE_RPGN, PAGE_SIZE);
|
PVO_PADDR(pvo), PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2648,7 +2651,7 @@ moea64_pvo_remove_from_pmap(struct pvo_entry *pvo)
|
|||||||
/* Send RC bits to VM */
|
/* Send RC bits to VM */
|
||||||
if ((pvo->pvo_vaddr & PVO_MANAGED) &&
|
if ((pvo->pvo_vaddr & PVO_MANAGED) &&
|
||||||
(pvo->pvo_pte.prot & VM_PROT_WRITE)) {
|
(pvo->pvo_pte.prot & VM_PROT_WRITE)) {
|
||||||
pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
|
pg = PHYS_TO_VM_PAGE(PVO_PADDR(pvo));
|
||||||
if (pg != NULL) {
|
if (pg != NULL) {
|
||||||
refchg |= atomic_readandclear_32(&pg->md.mdpg_attrs);
|
refchg |= atomic_readandclear_32(&pg->md.mdpg_attrs);
|
||||||
if (refchg & LPTE_CHG)
|
if (refchg & LPTE_CHG)
|
||||||
@ -2674,7 +2677,7 @@ moea64_pvo_remove_from_page_locked(struct pvo_entry *pvo,
|
|||||||
/*
|
/*
|
||||||
* Update vm about page writeability/executability if managed
|
* Update vm about page writeability/executability if managed
|
||||||
*/
|
*/
|
||||||
PV_LOCKASSERT(pvo->pvo_pte.pa & LPTE_RPGN);
|
PV_LOCKASSERT(PVO_PADDR(pvo));
|
||||||
if (pvo->pvo_vaddr & PVO_MANAGED) {
|
if (pvo->pvo_vaddr & PVO_MANAGED) {
|
||||||
if (m != NULL) {
|
if (m != NULL) {
|
||||||
LIST_REMOVE(pvo, pvo_vlink);
|
LIST_REMOVE(pvo, pvo_vlink);
|
||||||
@ -2694,11 +2697,11 @@ moea64_pvo_remove_from_page(struct pvo_entry *pvo)
|
|||||||
vm_page_t pg = NULL;
|
vm_page_t pg = NULL;
|
||||||
|
|
||||||
if (pvo->pvo_vaddr & PVO_MANAGED)
|
if (pvo->pvo_vaddr & PVO_MANAGED)
|
||||||
pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
|
pg = PHYS_TO_VM_PAGE(PVO_PADDR(pvo));
|
||||||
|
|
||||||
PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
|
PV_LOCK(PVO_PADDR(pvo));
|
||||||
moea64_pvo_remove_from_page_locked(pvo, pg);
|
moea64_pvo_remove_from_page_locked(pvo, pg);
|
||||||
PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
|
PV_UNLOCK(PVO_PADDR(pvo));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pvo_entry *
|
static struct pvo_entry *
|
||||||
@ -2810,7 +2813,7 @@ moea64_dev_direct_mapped(vm_paddr_t pa, vm_size_t size)
|
|||||||
for (pvo = RB_FIND(pvo_tree, &kernel_pmap->pmap_pvo, &key);
|
for (pvo = RB_FIND(pvo_tree, &kernel_pmap->pmap_pvo, &key);
|
||||||
ppa < pa + size; ppa += PAGE_SIZE,
|
ppa < pa + size; ppa += PAGE_SIZE,
|
||||||
pvo = RB_NEXT(pvo_tree, &kernel_pmap->pmap_pvo, pvo)) {
|
pvo = RB_NEXT(pvo_tree, &kernel_pmap->pmap_pvo, pvo)) {
|
||||||
if (pvo == NULL || (pvo->pvo_pte.pa & LPTE_RPGN) != ppa) {
|
if (pvo == NULL || PVO_PADDR(pvo) != ppa) {
|
||||||
error = EFAULT;
|
error = EFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2886,7 +2889,7 @@ moea64_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
|
|||||||
len = MIN(lim - va, sz);
|
len = MIN(lim - va, sz);
|
||||||
pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF);
|
pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF);
|
||||||
if (pvo != NULL && !(pvo->pvo_pte.pa & LPTE_I)) {
|
if (pvo != NULL && !(pvo->pvo_pte.pa & LPTE_I)) {
|
||||||
pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va & ADDR_POFF);
|
pa = PVO_PADDR(pvo) | (va & ADDR_POFF);
|
||||||
moea64_syncicache(pm, va, pa, len);
|
moea64_syncicache(pm, va, pa, len);
|
||||||
}
|
}
|
||||||
va += len;
|
va += len;
|
||||||
@ -3005,7 +3008,7 @@ moea64_scan_pmap()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pa = pvo->pvo_pte.pa & LPTE_RPGN;
|
pa = PVO_PADDR(pvo);
|
||||||
|
|
||||||
if (va & PVO_LARGE) {
|
if (va & PVO_LARGE) {
|
||||||
pa_end = pa + lpsize;
|
pa_end = pa + lpsize;
|
||||||
|
Loading…
Reference in New Issue
Block a user