Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Jul 2020 13:43:49 +0000 (UTC)
From:      Leandro Lupori <luporl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r363222 - head/sys/powerpc/aim
Message-ID:  <202007151343.06FDhnEo030216@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: luporl
Date: Wed Jul 15 13:43:48 2020
New Revision: 363222
URL: https://svnweb.freebsd.org/changeset/base/363222

Log:
  [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

Modified:
  head/sys/powerpc/aim/mmu_oea64.c

Modified: head/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- head/sys/powerpc/aim/mmu_oea64.c	Wed Jul 15 13:26:15 2020	(r363221)
+++ head/sys/powerpc/aim/mmu_oea64.c	Wed Jul 15 13:43:48 2020	(r363222)
@@ -108,6 +108,9 @@ uintptr_t moea64_get_unique_vsid(void);
 #define	VSID_TO_HASH(vsid)	(((vsid) >> 4) & 0xfffff)
 #define	VSID_HASH_MASK		0x0000007fffffffffULL
 
+/* Get physical address from PVO. */
+#define	PVO_PADDR(pvo)		((pvo)->pvo_pte.pa & LPTE_RPGN)
+
 /*
  * Locking semantics:
  *
@@ -1207,7 +1210,7 @@ moea64_unwire(pmap_t pm, vm_offset_t sva, vm_offset_t 
 		    (pvo->pvo_pte.prot & VM_PROT_WRITE)) {
 			if (refchg < 0)
 				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);
 			if (refchg & LPTE_CHG)
@@ -1615,7 +1618,7 @@ moea64_extract(pmap_t pm, vm_offset_t va)
 	if (pvo == NULL)
 		pa = 0;
 	else
-		pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
+		pa = PVO_PADDR(pvo) | (va - PVO_VADDR(pvo));
 	PMAP_UNLOCK(pm);
 
 	return (pa);
@@ -1636,7 +1639,7 @@ moea64_extract_and_hold(pmap_t pmap, vm_offset_t va, v
 	PMAP_LOCK(pmap);
 	pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF);
 	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))
 			m = NULL;
 	}
@@ -1943,7 +1946,7 @@ moea64_kextract(vm_offset_t va)
 	pvo = moea64_pvo_find_va(kernel_pmap, va);
 	KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR,
 	    va));
-	pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
+	pa = PVO_PADDR(pvo) | (va - PVO_VADDR(pvo));
 	PMAP_UNLOCK(kernel_pmap);
 	return (pa);
 }
@@ -2269,7 +2272,7 @@ moea64_pvo_protect( pmap_t pm, struct pvo_entry *pvo, 
 	 */
 	oldprot = pvo->pvo_pte.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
@@ -2284,7 +2287,7 @@ moea64_pvo_protect( pmap_t pm, struct pvo_entry *pvo, 
 		if ((pg->oflags & VPO_UNMANAGED) == 0)
 			vm_page_aflag_set(pg, PGA_EXECUTABLE);
 		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 */
 	if ((pvo->pvo_vaddr & PVO_MANAGED) &&
 	    (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) {
 			refchg |= atomic_readandclear_32(&pg->md.mdpg_attrs);
 			if (refchg & LPTE_CHG)
@@ -2674,7 +2677,7 @@ moea64_pvo_remove_from_page_locked(struct pvo_entry *p
 	/*
 	 * 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 (m != NULL) {
 			LIST_REMOVE(pvo, pvo_vlink);
@@ -2694,11 +2697,11 @@ moea64_pvo_remove_from_page(struct pvo_entry *pvo)
 	vm_page_t pg = NULL;
 
 	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);
-	PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
+	PV_UNLOCK(PVO_PADDR(pvo));
 }
 
 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);
 	    ppa < pa + size; ppa += PAGE_SIZE,
 	    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;
 			break;
 		}
@@ -2886,7 +2889,7 @@ moea64_sync_icache(pmap_t pm, vm_offset_t va, vm_size_
 		len = MIN(lim - va, sz);
 		pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF);
 		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);
 		}
 		va += len;
@@ -3005,7 +3008,7 @@ moea64_scan_pmap()
 			}
 		}
 
-		pa = pvo->pvo_pte.pa & LPTE_RPGN;
+		pa = PVO_PADDR(pvo);
 
 		if (va & PVO_LARGE) {
 			pa_end = pa + lpsize;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007151343.06FDhnEo030216>