Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 May 2025 15:27:57 GMT
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 68baf043e48b - main - arm: Make the pmap_kenter signature like arm64
Message-ID:  <202505151527.54FFRvU5071447@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=68baf043e48bac021389f844516ea74ca2d8e115

commit 68baf043e48bac021389f844516ea74ca2d8e115
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2025-05-15 14:50:14 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-05-15 15:09:46 +0000

    arm: Make the pmap_kenter signature like arm64
    
    To support a common pmap_mapdev_attr change pmap_kenter to include the
    size any memory type in the signature.
    
    Reviewed by:    mhorne
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D50307
---
 sys/arm/arm/mem.c      |  4 ++--
 sys/arm/arm/pmap-v6.c  | 43 +++++++++++++++++++++++--------------------
 sys/arm/include/pmap.h |  2 +-
 3 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/sys/arm/arm/mem.c b/sys/arm/arm/mem.c
index 7f149892ab9d..cec253f60b51 100644
--- a/sys/arm/arm/mem.c
+++ b/sys/arm/arm/mem.c
@@ -114,8 +114,8 @@ memrw(struct cdev *dev, struct uio *uio, int flags)
 			if (!address_valid)
 				return (EINVAL);
 			sx_xlock(&tmppt_lock);
-			pmap_kenter((vm_offset_t)_tmppt, v);
-			pmap_tlb_flush(kernel_pmap, (vm_offset_t)_tmppt);
+			pmap_kenter((vm_offset_t)_tmppt, PAGE_SIZE, v,
+			    VM_MEMATTR_DEFAULT);
 			o = (int)uio->uio_offset & PAGE_MASK;
 			c = (u_int)(PAGE_SIZE - ((int)iov->iov_base & PAGE_MASK));
 			c = min(c, (u_int)(PAGE_SIZE - o));
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index fafa8908dcd1..a0e0b007ffaa 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -1150,7 +1150,7 @@ pmap_dump_kextract(vm_offset_t va, pt2_entry_t *pte2p)
  *  After pmap_bootstrap() is called, the following functions for
  *  mappings can be used:
  *
- *  void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
+ *  void pmap_kenter(vm_offset_t va, vm_size_t size, vm_paddr_t pa, int mode);
  *  void pmap_kremove(vm_offset_t va);
  *  vm_offset_t pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end,
  *      int prot);
@@ -1308,11 +1308,28 @@ pmap_kenter_prot_attr(vm_offset_t va, vm_paddr_t pa, uint32_t prot,
 	pte2_store(pte2p, PTE2_KERN(pa, prot, attr));
 }
 
-PMAP_INLINE void
-pmap_kenter(vm_offset_t va, vm_paddr_t pa)
+static __inline void
+pmap_kenter_noflush(vm_offset_t va, vm_size_t size, vm_paddr_t pa, int mode)
 {
+	uint32_t l2attr;
+
+	KASSERT((size & PAGE_MASK) == 0,
+	    ("%s: device mapping not page-sized", __func__));
 
-	pmap_kenter_prot_attr(va, pa, PTE2_AP_KRW, PTE2_ATTR_DEFAULT);
+	l2attr = vm_memattr_to_pte2(mode);
+	while (size != 0) {
+		pmap_kenter_prot_attr(va, pa, PTE2_AP_KRW, l2attr);
+		va += PAGE_SIZE;
+		pa += PAGE_SIZE;
+		size -= PAGE_SIZE;
+	}
+}
+
+PMAP_INLINE void
+pmap_kenter(vm_offset_t va, vm_size_t size, vm_paddr_t pa, int mode)
+{
+	pmap_kenter_noflush(va, size, pa, mode);
+	tlb_flush_range(va, size);
 }
 
 /*
@@ -1453,7 +1470,7 @@ pmap_kenter_temporary(vm_paddr_t pa, int i)
 	/* QQQ: 'i' should be less or equal to MAXDUMPPGS. */
 
 	va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
-	pmap_kenter(va, pa);
+	pmap_kenter_noflush(va, PAGE_SIZE, pa, VM_MEMATTR_DEFAULT);
 	tlb_flush_local(va);
 	return ((void *)crashdumpmap);
 }
@@ -6253,21 +6270,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
 void
 pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
 {
-	vm_offset_t sva;
-	uint32_t l2attr;
-
-	KASSERT((size & PAGE_MASK) == 0,
-	    ("%s: device mapping not page-sized", __func__));
-
-	sva = va;
-	l2attr = vm_memattr_to_pte2(VM_MEMATTR_DEVICE);
-	while (size != 0) {
-		pmap_kenter_prot_attr(va, pa, PTE2_AP_KRW, l2attr);
-		va += PAGE_SIZE;
-		pa += PAGE_SIZE;
-		size -= PAGE_SIZE;
-	}
-	tlb_flush_range(sva, va - sva);
+	pmap_kenter(va, size, pa, VM_MEMATTR_DEVICE);
 }
 
 void
diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h
index 671e2af52423..dcd4e0a83ab1 100644
--- a/sys/arm/include/pmap.h
+++ b/sys/arm/include/pmap.h
@@ -135,7 +135,7 @@ extern ttb_entry_t pmap_kern_ttb; 	/* TTB for kernel pmap */
  * vtopte2().
  */
 void pmap_bootstrap(vm_offset_t);
-void pmap_kenter(vm_offset_t, vm_paddr_t);
+void pmap_kenter(vm_offset_t, vm_size_t, vm_paddr_t, int);
 void pmap_kremove(vm_offset_t);
 bool pmap_page_is_mapped(vm_page_t);
 bool	pmap_ps_enabled(pmap_t pmap);



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