Module Name:    src
Committed By:   skrll
Date:           Thu Apr 20 08:28:06 UTC 2023

Modified Files:
        src/sys/arch/aarch64/aarch64: pmap.c pmap_machdep.c
        src/sys/arch/aarch64/conf: files.aarch64
        src/sys/arch/aarch64/include: cpufunc.h pmap.h pmap_machdep.h
        src/sys/arch/arm/arm32: pmap.c
        src/sys/arch/arm/conf: files.arm
        src/sys/arch/arm/include/arm32: pmap.h
        src/sys/arch/cats/cats: cats_machdep.c
        src/sys/arch/epoc32/epoc32: machdep.c
        src/sys/arch/evbarm/adi_brh: brh_machdep.c
        src/sys/arch/evbarm/armadaxp: armadaxp_machdep.c
        src/sys/arch/evbarm/g42xxeb: g42xxeb_machdep.c
        src/sys/arch/evbarm/gemini: gemini_machdep.c
        src/sys/arch/evbarm/gumstix: gumstix_machdep.c
        src/sys/arch/evbarm/hdl_g: hdlg_machdep.c
        src/sys/arch/evbarm/imx23_olinuxino: imx23_olinuxino_machdep.c
        src/sys/arch/evbarm/imx31: imx31lk_machdep.c
        src/sys/arch/evbarm/integrator: integrator_machdep.c
        src/sys/arch/evbarm/iq80310: iq80310_machdep.c
        src/sys/arch/evbarm/iq80321: iq80321_machdep.c
        src/sys/arch/evbarm/ixm1200: ixm1200_machdep.c
        src/sys/arch/evbarm/kobo: kobo_machdep.c
        src/sys/arch/evbarm/lubbock: lubbock_machdep.c
        src/sys/arch/evbarm/marvell: marvell_machdep.c
        src/sys/arch/evbarm/mini2440: mini2440_machdep.c
        src/sys/arch/evbarm/netwalker: netwalker_machdep.c
        src/sys/arch/evbarm/nslu2: nslu2_machdep.c
        src/sys/arch/evbarm/smdk2xx0: smdk2410_machdep.c smdk2800_machdep.c
        src/sys/arch/evbarm/tsarm: tsarm_machdep.c
        src/sys/arch/hpcarm/hpcarm: netbookpro_machdep.c pxa2x0_hpc_machdep.c
            sa11x0_hpc_machdep.c
        src/sys/arch/iyonix/iyonix: iyonix_machdep.c
        src/sys/arch/zaurus/zaurus: machdep.c
Added Files:
        src/sys/uvm/pmap: pmap_devmap.c pmap_devmap.h

Log Message:
Provide a shared pmap_devmap implementation and convert all pmap_devmap
arrays to use DEVMAP_ENTRY{,_END}


To generate a diff of this commit:
cvs rdiff -u -r1.148 -r1.149 src/sys/arch/aarch64/aarch64/pmap.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/aarch64/aarch64/pmap_machdep.c
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/aarch64/conf/files.aarch64
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/aarch64/include/cpufunc.h
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/aarch64/include/pmap.h
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/include/pmap_machdep.h
cvs rdiff -u -r1.438 -r1.439 src/sys/arch/arm/arm32/pmap.c
cvs rdiff -u -r1.167 -r1.168 src/sys/arch/arm/conf/files.arm
cvs rdiff -u -r1.173 -r1.174 src/sys/arch/arm/include/arm32/pmap.h
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/cats/cats/cats_machdep.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/epoc32/epoc32/machdep.c
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/evbarm/adi_brh/brh_machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/evbarm/gemini/gemini_machdep.c
cvs rdiff -u -r1.72 -r1.73 src/sys/arch/evbarm/gumstix/gumstix_machdep.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/evbarm/hdl_g/hdlg_machdep.c
cvs rdiff -u -r1.13 -r1.14 \
    src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/evbarm/imx31/imx31lk_machdep.c
cvs rdiff -u -r1.80 -r1.81 \
    src/sys/arch/evbarm/integrator/integrator_machdep.c
cvs rdiff -u -r1.94 -r1.95 src/sys/arch/evbarm/iq80310/iq80310_machdep.c
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/evbarm/iq80321/iq80321_machdep.c
cvs rdiff -u -r1.66 -r1.67 src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/kobo/kobo_machdep.c
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/evbarm/lubbock/lubbock_machdep.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/evbarm/marvell/marvell_machdep.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/mini2440/mini2440_machdep.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/evbarm/netwalker/netwalker_machdep.c
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/evbarm/nslu2/nslu2_machdep.c
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/evbarm/tsarm/tsarm_machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/iyonix/iyonix/iyonix_machdep.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/zaurus/zaurus/machdep.c
cvs rdiff -u -r0 -r1.1 src/sys/uvm/pmap/pmap_devmap.c \
    src/sys/uvm/pmap/pmap_devmap.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/pmap.c
diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.148 src/sys/arch/aarch64/aarch64/pmap.c:1.149
--- src/sys/arch/aarch64/aarch64/pmap.c:1.148	Sun Apr 16 14:01:51 2023
+++ src/sys/arch/aarch64/aarch64/pmap.c	Thu Apr 20 08:28:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.148 2023/04/16 14:01:51 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.149 2023/04/20 08:28:02 skrll Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.148 2023/04/16 14:01:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.149 2023/04/20 08:28:02 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_cpuoptions.h"
@@ -215,7 +215,6 @@ static vaddr_t pmap_maxkvaddr;
 
 vaddr_t virtual_avail, virtual_end;
 vaddr_t virtual_devmap_addr;
-bool pmap_devmap_bootstrap_done = false;
 
 static struct pool_cache _pmap_cache;
 static struct pool_cache _pmap_pv_pool;
@@ -336,10 +335,8 @@ phys_to_pp(paddr_t pa)
 #endif /* DIAGNOSTIC */
 
 
-static const struct pmap_devmap *pmap_devmap_table;
-
-static vsize_t
-pmap_map_chunk(vaddr_t va, paddr_t pa, vsize_t size,
+vsize_t
+pmap_kenter_range(vaddr_t va, paddr_t pa, vsize_t size,
     vm_prot_t prot, u_int flags)
 {
 	pt_entry_t attr;
@@ -352,114 +349,6 @@ pmap_map_chunk(vaddr_t va, paddr_t pa, v
 	return resid;
 }
 
-void
-pmap_devmap_register(const struct pmap_devmap *table)
-{
-	pmap_devmap_table = table;
-}
-
-void
-pmap_devmap_bootstrap(vaddr_t l0pt, const struct pmap_devmap *table)
-{
-	bool done = false;
-	vaddr_t va;
-	int i;
-
-	pmap_devmap_register(table);
-
-	VPRINTF("%s:\n", __func__);
-	for (i = 0; table[i].pd_size != 0; i++) {
-		VPRINTF(" devmap: pa %08lx-%08lx = va %016lx\n",
-		    table[i].pd_pa,
-		    table[i].pd_pa + table[i].pd_size - 1,
-		    table[i].pd_va);
-		va = table[i].pd_va;
-
-		KASSERT((VM_KERNEL_IO_BASE <= va) &&
-		    (va < (VM_KERNEL_IO_BASE + VM_KERNEL_IO_SIZE)));
-
-		/* update and check virtual_devmap_addr */
-		if (virtual_devmap_addr == 0 || virtual_devmap_addr > va) {
-			virtual_devmap_addr = va;
-		}
-
-		pmap_map_chunk(
-		    table[i].pd_va,
-		    table[i].pd_pa,
-		    table[i].pd_size,
-		    table[i].pd_prot,
-		    table[i].pd_flags);
-		done = true;
-	}
-	if (done)
-		pmap_devmap_bootstrap_done = true;
-}
-
-const struct pmap_devmap *
-pmap_devmap_find_va(vaddr_t va, vsize_t size)
-{
-	paddr_t endva;
-	int i;
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	endva = va + size;
-	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if ((va >= pmap_devmap_table[i].pd_va) &&
-		    (endva <= pmap_devmap_table[i].pd_va +
-		              pmap_devmap_table[i].pd_size))
-			return &pmap_devmap_table[i];
-	}
-	return NULL;
-}
-
-const struct pmap_devmap *
-pmap_devmap_find_pa(paddr_t pa, psize_t size)
-{
-	paddr_t endpa;
-	int i;
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	endpa = pa + size;
-	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if (pa >= pmap_devmap_table[i].pd_pa &&
-		    (endpa <= pmap_devmap_table[i].pd_pa +
-		             pmap_devmap_table[i].pd_size))
-			return (&pmap_devmap_table[i]);
-	}
-	return NULL;
-}
-
-vaddr_t
-pmap_devmap_phystov(paddr_t pa)
-{
-	const struct pmap_devmap *table;
-	paddr_t offset;
-
-	table = pmap_devmap_find_pa(pa, 0);
-	if (table == NULL)
-		return 0;
-
-	offset = pa - table->pd_pa;
-	return table->pd_va + offset;
-}
-
-vaddr_t
-pmap_devmap_vtophys(paddr_t va)
-{
-	const struct pmap_devmap *table;
-	vaddr_t offset;
-
-	table = pmap_devmap_find_va(va, 0);
-	if (table == NULL)
-		return 0;
-
-	offset = va - table->pd_va;
-	return table->pd_pa + offset;
-}
 
 void
 pmap_bootstrap(vaddr_t vstart, vaddr_t vend)

Index: src/sys/arch/aarch64/aarch64/pmap_machdep.c
diff -u src/sys/arch/aarch64/aarch64/pmap_machdep.c:1.5 src/sys/arch/aarch64/aarch64/pmap_machdep.c:1.6
--- src/sys/arch/aarch64/aarch64/pmap_machdep.c:1.5	Sun Apr 16 14:01:51 2023
+++ src/sys/arch/aarch64/aarch64/pmap_machdep.c	Thu Apr 20 08:28:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_machdep.c,v 1.5 2023/04/16 14:01:51 skrll Exp $	*/
+/*	$NetBSD: pmap_machdep.c,v 1.6 2023/04/20 08:28:02 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 #define __PMAP_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.5 2023/04/16 14:01:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.6 2023/04/20 08:28:02 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -69,8 +69,6 @@ uint64_t pmap_attr_gp = 0;
 vaddr_t virtual_avail;
 vaddr_t virtual_end;
 
-bool pmap_devmap_bootstrap_done = false;
-
 paddr_t
 vtophys(vaddr_t va)
 {
@@ -647,9 +645,6 @@ pmap_l0table(struct pmap *pm)
 }
 
 
-static const struct pmap_devmap *pmap_devmap_table;
-vaddr_t virtual_devmap_addr;
-
 #define	L1_BLK_MAPPABLE_P(va, pa, size)					\
     ((((va) | (pa)) & L1_OFFSET) == 0 && (size) >= L1_SIZE)
 
@@ -657,8 +652,8 @@ vaddr_t virtual_devmap_addr;
     ((((va) | (pa)) & L2_OFFSET) == 0 && (size) >= L2_SIZE)
 
 
-static vsize_t
-pmap_map_chunk(vaddr_t va, paddr_t pa, vsize_t size,
+vsize_t
+pmap_kenter_range(vaddr_t va, paddr_t pa, vsize_t size,
     vm_prot_t prot, u_int flags)
 {
 	pt_entry_t attr;
@@ -694,88 +689,6 @@ pmap_map_chunk(vaddr_t va, paddr_t pa, v
 	return mapped;
 }
 
-
-void
-pmap_devmap_register(const struct pmap_devmap *table)
-{
-	pmap_devmap_table = table;
-}
-
-
-void
-pmap_devmap_bootstrap(vaddr_t l0pt, const struct pmap_devmap *table)
-{
-	vaddr_t va;
-	int i;
-
-	pmap_devmap_register(table);
-
-	VPRINTF("%s:\n", __func__);
-	for (i = 0; table[i].pd_size != 0; i++) {
-		VPRINTF(" devmap: pa %08lx-%08lx = va %016lx\n",
-		    table[i].pd_pa,
-		    table[i].pd_pa + table[i].pd_size - 1,
-		    table[i].pd_va);
-		va = table[i].pd_va;
-
-		KASSERT((VM_KERNEL_IO_BASE <= va) &&
-		    (va < (VM_KERNEL_IO_BASE + VM_KERNEL_IO_SIZE)));
-
-		/* update and check virtual_devmap_addr */
-		if ((virtual_devmap_addr == 0) ||
-		    (virtual_devmap_addr > va)) {
-			virtual_devmap_addr = va;
-		}
-
-		pmap_map_chunk(
-		    table[i].pd_va,
-		    table[i].pd_pa,
-		    table[i].pd_size,
-		    table[i].pd_prot,
-		    table[i].pd_flags);
-
-		pmap_devmap_bootstrap_done = true;
-	}
-}
-
-
-const struct pmap_devmap *
-pmap_devmap_find_va(vaddr_t va, vsize_t size)
-{
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	const vaddr_t endva = va + size;
-	for (size_t i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if ((va >= pmap_devmap_table[i].pd_va) &&
-		    (endva <= pmap_devmap_table[i].pd_va +
-			      pmap_devmap_table[i].pd_size)) {
-			return &pmap_devmap_table[i];
-		}
-	}
-	return NULL;
-}
-
-
-const struct pmap_devmap *
-pmap_devmap_find_pa(paddr_t pa, psize_t size)
-{
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	const paddr_t endpa = pa + size;
-	for (size_t i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if (pa >= pmap_devmap_table[i].pd_pa &&
-		    (endpa <= pmap_devmap_table[i].pd_pa +
-			      pmap_devmap_table[i].pd_size))
-			return (&pmap_devmap_table[i]);
-	}
-	return NULL;
-}
-
-
 #ifdef MULTIPROCESSOR
 void
 pmap_md_tlb_info_attach(struct pmap_tlb_info *ti, struct cpu_info *ci)

Index: src/sys/arch/aarch64/conf/files.aarch64
diff -u src/sys/arch/aarch64/conf/files.aarch64:1.42 src/sys/arch/aarch64/conf/files.aarch64:1.43
--- src/sys/arch/aarch64/conf/files.aarch64:1.42	Sat Nov  5 08:29:17 2022
+++ src/sys/arch/aarch64/conf/files.aarch64	Thu Apr 20 08:28:02 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: files.aarch64,v 1.42 2022/11/05 08:29:17 skrll Exp $
+#	$NetBSD: files.aarch64,v 1.43 2023/04/20 08:28:02 skrll Exp $
 
 defflag opt_cpuoptions.h	AARCH64_ALIGNMENT_CHECK
 defflag opt_cpuoptions.h	AARCH64_EL0_STACK_ALIGNMENT_CHECK
@@ -120,6 +120,7 @@ file	arch/aarch64/aarch64/pmapboot.c
 file	arch/aarch64/aarch64/pmap_page.S
 file	arch/aarch64/aarch64/pmap_machdep.c	pmap_mi
 file	uvm/pmap/pmap.c				pmap_mi
+file	uvm/pmap/pmap_devmap.c
 file	uvm/pmap/pmap_pvt.c
 file	uvm/pmap/pmap_segtab.c			pmap_mi
 file	uvm/pmap/pmap_tlb.c

Index: src/sys/arch/aarch64/include/cpufunc.h
diff -u src/sys/arch/aarch64/include/cpufunc.h:1.25 src/sys/arch/aarch64/include/cpufunc.h:1.26
--- src/sys/arch/aarch64/include/cpufunc.h:1.25	Sat Sep 10 12:14:17 2022
+++ src/sys/arch/aarch64/include/cpufunc.h	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.h,v 1.25 2022/09/10 12:14:17 rillig Exp $	*/
+/*	$NetBSD: cpufunc.h,v 1.26 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -36,6 +36,9 @@
 
 #include <sys/cpu.h>
 
+#include <uvm/uvm_extern.h>
+#include <uvm/pmap/pmap_devmap.h>
+
 extern u_int aarch64_cache_vindexsize;	/* cachesize/way (VIVT/VIPT) */
 extern u_int aarch64_cache_prefer_mask;
 extern u_int cputype;			/* compat arm */
@@ -131,14 +134,12 @@ cpu_clusterid(void)
 static inline bool
 cpu_earlydevice_va_p(void)
 {
-	extern bool pmap_devmap_bootstrap_done;	/* in pmap.c */
-
 	/* This function may be called before enabling MMU, or mapping KVA */
 	if ((reg_sctlr_el1_read() & SCTLR_M) == 0)
 		return false;
 
 	/* device mapping will be available after pmap_devmap_bootstrap() */
-	if (!pmap_devmap_bootstrap_done)
+	if (!pmap_devmap_bootstrapped_p())
 		return false;
 
 	return true;

Index: src/sys/arch/aarch64/include/pmap.h
diff -u src/sys/arch/aarch64/include/pmap.h:1.57 src/sys/arch/aarch64/include/pmap.h:1.58
--- src/sys/arch/aarch64/include/pmap.h:1.57	Thu Nov  3 09:04:56 2022
+++ src/sys/arch/aarch64/include/pmap.h	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.57 2022/11/03 09:04:56 skrll Exp $ */
+/* $NetBSD: pmap.h,v 1.58 2023/04/20 08:28:03 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -80,6 +80,7 @@ pmap_md_tlb_asid_max(void)
 }
 
 #include <uvm/pmap/tlb.h>
+#include <uvm/pmap/pmap_devmap.h>
 #include <uvm/pmap/pmap_tlb.h>
 
 #define KERNEL_PID		0	/* The kernel uses ASID 0 */
@@ -161,22 +162,6 @@ pmap_kvattr(pt_entry_t *ptep, vm_prot_t 
 	return opte;
 }
 
-/* devmap */
-struct pmap_devmap {
-	vaddr_t pd_va;		/* virtual address */
-	paddr_t pd_pa;		/* physical address */
-	psize_t pd_size;	/* size of region */
-	vm_prot_t pd_prot;	/* protection code */
-	u_int pd_flags;		/* flags for pmap_kenter_pa() */
-};
-
-void pmap_devmap_register(const struct pmap_devmap *);
-void pmap_devmap_bootstrap(vaddr_t, const struct pmap_devmap *);
-const struct pmap_devmap *pmap_devmap_find_pa(paddr_t, psize_t);
-const struct pmap_devmap *pmap_devmap_find_va(vaddr_t, vsize_t);
-vaddr_t pmap_devmap_phystov(paddr_t);
-paddr_t pmap_devmap_vtophys(paddr_t);
-
 #define L1_TRUNC_BLOCK(x)	((x) & L1_FRAME)
 #define L1_ROUND_BLOCK(x)	L1_TRUNC_BLOCK((x) + L1_SIZE - 1)
 #define L2_TRUNC_BLOCK(x)	((x) & L2_FRAME)
@@ -186,16 +171,7 @@ paddr_t pmap_devmap_vtophys(paddr_t);
 
 #define DEVMAP_ALIGN(x)		L3_TRUNC_BLOCK((x))
 #define DEVMAP_SIZE(x)		L3_ROUND_BLOCK((x))
-
-#define	DEVMAP_ENTRY(va, pa, sz)				\
-	{							\
-		.pd_va = DEVMAP_ALIGN(va),			\
-		.pd_pa = DEVMAP_ALIGN(pa),			\
-		.pd_size = DEVMAP_SIZE(sz),			\
-		.pd_prot = VM_PROT_READ | VM_PROT_WRITE,	\
-		.pd_flags = PMAP_DEV				\
-	}
-#define	DEVMAP_ENTRY_END	{ 0 }
+#define DEVMAP_FLAGS		PMAP_DEV
 
 /* Hooks for the pool allocator */
 paddr_t vtophys(vaddr_t);
@@ -268,6 +244,8 @@ void pmapboot_enter_range(vaddr_t, paddr
     void (*)(const char *, ...) __printflike(1, 2));
 int pmapboot_protect(vaddr_t, vaddr_t, vm_prot_t);
 
+vsize_t pmap_map_chunk(vaddr_t, vaddr_t, paddr_t, vsize_t, vm_prot_t, u_int);
+
 #if defined(DDB)
 void pmap_db_pte_print(pt_entry_t, int, void (*)(const char *, ...) __printflike(1, 2));
 void pmap_db_pteinfo(vaddr_t, void (*)(const char *, ...) __printflike(1, 2));
@@ -415,6 +393,8 @@ void	pmap_pv_track(paddr_t, psize_t);
 void	pmap_pv_untrack(paddr_t, psize_t);
 void	pmap_pv_protect(paddr_t, vm_prot_t);
 
+vsize_t	pmap_kenter_range(vaddr_t, paddr_t, vsize_t, vm_prot_t, u_int);
+
 #define	PMAP_MAPSIZE1	L2_SIZE
 
 /* for ddb */

Index: src/sys/arch/aarch64/include/pmap_machdep.h
diff -u src/sys/arch/aarch64/include/pmap_machdep.h:1.2 src/sys/arch/aarch64/include/pmap_machdep.h:1.3
--- src/sys/arch/aarch64/include/pmap_machdep.h:1.2	Wed Dec 21 11:39:46 2022
+++ src/sys/arch/aarch64/include/pmap_machdep.h	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_machdep.h,v 1.2 2022/12/21 11:39:46 skrll Exp $	*/
+/*	$NetBSD: pmap_machdep.h,v 1.3 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -111,6 +111,8 @@ void	pmap_md_deactivate_efirt(void);
 
 void	pmap_icache_sync_range(pmap_t, vaddr_t, vaddr_t);
 
+vsize_t	pmap_kenter_range(vaddr_t, paddr_t, vsize_t, vm_prot_t, u_int flags);
+
 #include <uvm/pmap/vmpagemd.h>
 #include <uvm/pmap/pmap.h>
 #include <uvm/pmap/pmap_pvt.h>

Index: src/sys/arch/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.438 src/sys/arch/arm/arm32/pmap.c:1.439
--- src/sys/arch/arm/arm32/pmap.c:1.438	Sun Dec 18 12:02:47 2022
+++ src/sys/arch/arm/arm32/pmap.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.438 2022/12/18 12:02:47 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.439 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -193,7 +193,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.438 2022/12/18 12:02:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.439 2023/04/20 08:28:03 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -7211,88 +7211,28 @@ pmap_unmap_chunk(vaddr_t l1pt, vaddr_t v
 }
 
 
-
-/********************** Static device map routines ***************************/
-
-static const struct pmap_devmap *pmap_devmap_table;
-
-/*
- * Register the devmap table.  This is provided in case early console
- * initialization needs to register mappings created by bootstrap code
- * before pmap_devmap_bootstrap() is called.
- */
-void
-pmap_devmap_register(const struct pmap_devmap *table)
-{
-
-	pmap_devmap_table = table;
-}
-
-/*
- * Map all of the static regions in the devmap table, and remember
- * the devmap table so other parts of the kernel can look up entries
- * later.
- */
-void
-pmap_devmap_bootstrap(vaddr_t l1pt, const struct pmap_devmap *table)
-{
-	int i;
-
-	pmap_devmap_table = table;
-
-	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		const struct pmap_devmap *pdp = &pmap_devmap_table[i];
-
-		KASSERTMSG(VADDR_MAX - pdp->pd_va >= pdp->pd_size - 1, "va %" PRIxVADDR
-		    " sz %" PRIxPSIZE, pdp->pd_va, pdp->pd_size);
-		KASSERTMSG(PADDR_MAX - pdp->pd_pa >= pdp->pd_size - 1, "pa %" PRIxPADDR
-		    " sz %" PRIxPSIZE, pdp->pd_pa, pdp->pd_size);
-		VPRINTF("devmap: %08lx -> %08lx @ %08lx\n", pdp->pd_pa,
-		    pdp->pd_pa + pdp->pd_size - 1, pdp->pd_va);
-
-		pmap_map_chunk(l1pt, pdp->pd_va, pdp->pd_pa, pdp->pd_size,
-		    pdp->pd_prot, pdp->pd_cache);
-	}
-}
-
-const struct pmap_devmap *
-pmap_devmap_find_pa(paddr_t pa, psize_t size)
+vsize_t
+pmap_kenter_range(vaddr_t va, paddr_t pa, vsize_t size, vm_prot_t prot,
+    u_int flags)
 {
-	uint64_t endpa;
-	int i;
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	endpa = (uint64_t)pa + (uint64_t)(size - 1);
+	const vaddr_t root = pmap_devmap_root();
 
-	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if (pa >= pmap_devmap_table[i].pd_pa &&
-		    endpa <= (uint64_t)pmap_devmap_table[i].pd_pa +
-			     (uint64_t)(pmap_devmap_table[i].pd_size - 1))
-			return &pmap_devmap_table[i];
+	int cache;
+	switch (flags) {
+	case PMAP_DEV:
+		cache = PTE_DEV;
+		break;
+	case PMAP_NOCACHE:
+		cache = PTE_NOCACHE;
+		break;
+	default:
+		cache = PTE_CACHE;
+		break;
 	}
 
-	return NULL;
+	return pmap_map_chunk(root, va, pa, size, prot, cache);
 }
 
-const struct pmap_devmap *
-pmap_devmap_find_va(vaddr_t va, vsize_t size)
-{
-	int i;
-
-	if (pmap_devmap_table == NULL)
-		return NULL;
-
-	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
-		if (va >= pmap_devmap_table[i].pd_va &&
-		    va + size - 1 <= pmap_devmap_table[i].pd_va +
-				     pmap_devmap_table[i].pd_size - 1)
-			return &pmap_devmap_table[i];
-	}
-
-	return NULL;
-}
 
 /********************** PTE initialization routines **************************/
 

Index: src/sys/arch/arm/conf/files.arm
diff -u src/sys/arch/arm/conf/files.arm:1.167 src/sys/arch/arm/conf/files.arm:1.168
--- src/sys/arch/arm/conf/files.arm:1.167	Fri Oct 28 07:16:34 2022
+++ src/sys/arch/arm/conf/files.arm	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: files.arm,v 1.167 2022/10/28 07:16:34 skrll Exp $
+#	$NetBSD: files.arm,v 1.168 2023/04/20 08:28:03 skrll Exp $
 
 # temporary define to allow easy moving to ../arch/arm/arm32
 defflag				ARM32
@@ -235,6 +235,7 @@ file	kern/kern_cctr.c			arm11
 file	arch/arm/arm32/arm11_pmc.c		arm11_pmc
 file	arch/arm/arm32/cortex_pmc.c		cortex_pmc
 file	arch/arm/arm32/arm32_tlb.c		(cpu_armv7 | cpu_arm11) & (!arm11_compat_mmu & !cpu_pre_armv6)
+file	uvm/pmap/pmap_devmap.c
 file	uvm/pmap/pmap_tlb.c			(cpu_armv7 | cpu_arm11) & (!arm11_compat_mmu & !cpu_pre_armv6)
 
 # generic pmap files for arm32 implementations

Index: src/sys/arch/arm/include/arm32/pmap.h
diff -u src/sys/arch/arm/include/arm32/pmap.h:1.173 src/sys/arch/arm/include/arm32/pmap.h:1.174
--- src/sys/arch/arm/include/arm32/pmap.h:1.173	Sat Apr  2 11:16:07 2022
+++ src/sys/arch/arm/include/arm32/pmap.h	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.173 2022/04/02 11:16:07 skrll Exp $	*/
+/*	$NetBSD: pmap.h,v 1.174 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -79,7 +79,10 @@
 #endif
 #include <arm/cpufunc.h>
 #include <arm/locore.h>
+
 #include <uvm/uvm_object.h>
+
+#include <uvm/pmap/pmap_devmap.h>
 #include <uvm/pmap/pmap_pvt.h>
 #endif
 
@@ -201,29 +204,10 @@ union pmap_cache_state {
 #define	PMAP_CACHE_STATE_ALL	0xffffffffu
 #endif /* !ARM_MMU_EXTENDED */
 
-/*
- * This structure is used by machine-dependent code to describe
- * static mappings of devices, created at bootstrap time.
- */
-struct pmap_devmap {
-	vaddr_t		pd_va;		/* virtual address */
-	paddr_t		pd_pa;		/* physical address */
-	psize_t		pd_size;	/* size of region */
-	vm_prot_t	pd_prot;	/* protection code */
-	int		pd_cache;	/* cache attributes */
-};
 
 #define	DEVMAP_ALIGN(a)	((a) & ~L1_S_OFFSET)
 #define	DEVMAP_SIZE(s)	roundup2((s), L1_S_SIZE)
-#define	DEVMAP_ENTRY(va, pa, sz)			\
-	{						\
-		.pd_va = DEVMAP_ALIGN(va),		\
-		.pd_pa = DEVMAP_ALIGN(pa),		\
-		.pd_size = DEVMAP_SIZE(sz),		\
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,	\
-		.pd_cache = PTE_DEV			\
-	}
-#define	DEVMAP_ENTRY_END	{ 0 }
+#define	DEVMAP_FLAGS	PTE_DEV
 
 /*
  * The pmap structure itself
@@ -419,17 +403,14 @@ void	pmap_postinit(void);
 
 void	vector_page_setprot(int);
 
-const struct pmap_devmap *pmap_devmap_find_pa(paddr_t, psize_t);
-const struct pmap_devmap *pmap_devmap_find_va(vaddr_t, vsize_t);
-
 /* Bootstrapping routines. */
 void	pmap_map_section(vaddr_t, vaddr_t, paddr_t, int, int);
 void	pmap_map_entry(vaddr_t, vaddr_t, paddr_t, int, int);
 vsize_t	pmap_map_chunk(vaddr_t, vaddr_t, paddr_t, vsize_t, int, int);
 void	pmap_unmap_chunk(vaddr_t, vaddr_t, vsize_t);
 void	pmap_link_l2pt(vaddr_t, vaddr_t, pv_addr_t *);
-void	pmap_devmap_bootstrap(vaddr_t, const struct pmap_devmap *);
-void	pmap_devmap_register(const struct pmap_devmap *);
+
+vsize_t pmap_kenter_range(vaddr_t, paddr_t, vsize_t, vm_prot_t, u_int);
 
 /*
  * Special page zero routine for use by the idle loop (no cache cleans).

Index: src/sys/arch/cats/cats/cats_machdep.c
diff -u src/sys/arch/cats/cats/cats_machdep.c:1.93 src/sys/arch/cats/cats/cats_machdep.c:1.94
--- src/sys/arch/cats/cats/cats_machdep.c:1.93	Sat Jan  8 09:02:47 2022
+++ src/sys/arch/cats/cats/cats_machdep.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: cats_machdep.c,v 1.93 2022/01/08 09:02:47 skrll Exp $	*/
+/*	$NetBSD: cats_machdep.c,v 1.94 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*
  * Copyright (c) 1997,1998 Mark Brinicombe.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cats_machdep.c,v 1.93 2022/01/08 09:02:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cats_machdep.c,v 1.94 2023/04/20 08:28:03 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_cats.h"
@@ -173,41 +173,41 @@ int comcnmode = CONMODE;
 
 static const struct pmap_devmap cats_devmap[] = {
 	/* Map 1MB for CSR space */
-	{ DC21285_ARMCSR_VBASE,			DC21285_ARMCSR_BASE,
-	    DC21285_ARMCSR_VSIZE,		VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_ARMCSR_VBASE,
+		     DC21285_ARMCSR_BASE,
+		     DC21285_ARMCSR_VSIZE),
 
 	/* Map 1MB for fast cache cleaning space */
-	{ DC21285_CACHE_FLUSH_VBASE,		DC21285_SA_CACHE_FLUSH_BASE,
-	    DC21285_CACHE_FLUSH_VSIZE,		VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_CACHE },
+	DEVMAP_ENTRY(DC21285_CACHE_FLUSH_VBASE,
+		     DC21285_SA_CACHE_FLUSH_BASE,
+		     DC21285_CACHE_FLUSH_VSIZE),
 
 	/* Map 1MB for PCI IO space */
-	{ DC21285_PCI_IO_VBASE,			DC21285_PCI_IO_BASE,
-	    DC21285_PCI_IO_VSIZE,		VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_PCI_IO_VBASE,
+		     DC21285_PCI_IO_BASE,
+		     DC21285_PCI_IO_VSIZE),
 
 	/* Map 1MB for PCI IACK space */
-	{ DC21285_PCI_IACK_VBASE,		DC21285_PCI_IACK_SPECIAL,
-	    DC21285_PCI_IACK_VSIZE,		VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_PCI_IACK_VBASE,
+		     DC21285_PCI_IACK_SPECIAL,
+		     DC21285_PCI_IACK_VSIZE),
 
 	/* Map 16MB of type 1 PCI config access */
-	{ DC21285_PCI_TYPE_1_CONFIG_VBASE,	DC21285_PCI_TYPE_1_CONFIG,
-	    DC21285_PCI_TYPE_1_CONFIG_VSIZE,	VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_PCI_TYPE_1_CONFIG_VBASE,
+		     DC21285_PCI_TYPE_1_CONFIG,
+		     DC21285_PCI_TYPE_1_CONFIG_VSIZE),
 
 	/* Map 16MB of type 0 PCI config access */
-	{ DC21285_PCI_TYPE_0_CONFIG_VBASE,	DC21285_PCI_TYPE_0_CONFIG,
-	    DC21285_PCI_TYPE_0_CONFIG_VSIZE,	VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_PCI_TYPE_0_CONFIG_VBASE,
+		     DC21285_PCI_TYPE_0_CONFIG,
+		     DC21285_PCI_TYPE_0_CONFIG_VSIZE),
 
 	/* Map 1MB of 32 bit PCI address space for ISA MEM accesses via PCI */
-	{ DC21285_PCI_ISA_MEM_VBASE,		DC21285_PCI_MEM_BASE,
-	    DC21285_PCI_ISA_MEM_VSIZE,		VM_PROT_READ|VM_PROT_WRITE,
-	    PTE_NOCACHE },
+	DEVMAP_ENTRY(DC21285_PCI_ISA_MEM_VBASE,
+		     DC21285_PCI_MEM_BASE,
+		     DC21285_PCI_ISA_MEM_VSIZE),
 
-	{ 0, 0, 0, 0, 0 }
+	DEVMAP_ENTRY_END
 };
 
 #define MAX_PHYSMEM 4

Index: src/sys/arch/epoc32/epoc32/machdep.c
diff -u src/sys/arch/epoc32/epoc32/machdep.c:1.8 src/sys/arch/epoc32/epoc32/machdep.c:1.9
--- src/sys/arch/epoc32/epoc32/machdep.c:1.8	Tue Jul 16 14:41:44 2019
+++ src/sys/arch/epoc32/epoc32/machdep.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.8 2019/07/16 14:41:44 skrll Exp $	*/
+/*	$NetBSD: machdep.c,v 1.9 2023/04/20 08:28:03 skrll Exp $	*/
 /*
  * Copyright (c) 2012, 2013 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.8 2019/07/16 14:41:44 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.9 2023/04/20 08:28:03 skrll Exp $");
 
 #include "clpscom.h"
 #include "clpslcd.h"
@@ -123,29 +123,23 @@ int epoc32_fb_addr;
  * using the 2nd page tables.
  */
 
-#define _A(a)	((a) & ~L1_S_OFFSET)
-#define _S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE - 1))
 static const struct pmap_devmap epoc32_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		ARM7XX_INTRREG_VBASE,		/* included com, lcd-ctrl */
-		_A(ARM7XX_INTRREG_BASE),
-		_S(ARM7XX_INTRREG_SIZE),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		ARM7XX_INTRREG_BASE,
+		ARM7XX_INTRREG_SIZE
+	),
 
-	{ 0, 0, 0, 0, 0 }
+	DEVMAP_ENTRY_END
 };
 static const struct pmap_devmap epoc32_fb_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		ARM7XX_FB_VBASE,
-		_A(ARM7XX_FB_BASE),
-		_S(ARM7XX_FB_SIZE),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		ARM7XX_FB_BASE,
+		ARM7XX_FB_SIZE
+	),
 
-	{ 0, 0, 0, 0, 0 }
+	DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/evbarm/adi_brh/brh_machdep.c
diff -u src/sys/arch/evbarm/adi_brh/brh_machdep.c:1.51 src/sys/arch/evbarm/adi_brh/brh_machdep.c:1.52
--- src/sys/arch/evbarm/adi_brh/brh_machdep.c:1.51	Tue Aug 17 22:00:27 2021
+++ src/sys/arch/evbarm/adi_brh/brh_machdep.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: brh_machdep.c,v 1.51 2021/08/17 22:00:27 andvar Exp $	*/
+/*	$NetBSD: brh_machdep.c,v 1.52 2023/04/20 08:28:03 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: brh_machdep.c,v 1.51 2021/08/17 22:00:27 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: brh_machdep.c,v 1.52 2023/04/20 08:28:03 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -259,69 +259,47 @@ cpu_reboot(int howto, char *bootstr)
 
 /* Static device mappings. */
 static const struct pmap_devmap brh_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	BRH_PCI_CONF_VBASE,
 	BECC_PCI_CONF_BASE,
-	BRH_PCI_CONF_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_PCI_CONF_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_PCI_MEM1_VBASE,
 	BECC_PCI_MEM1_BASE,
-	BRH_PCI_MEM1_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_PCI_MEM1_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_PCI_MEM2_VBASE,
 	BECC_PCI_MEM2_BASE,
-	BRH_PCI_MEM2_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_PCI_MEM2_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_UART1_VBASE,
 	BRH_UART1_BASE,
-	BRH_UART1_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_UART1_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_UART2_VBASE,
 	BRH_UART2_BASE,
-	BRH_UART2_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_UART2_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_LED_VBASE,
 	BRH_LED_BASE,
-	BRH_LED_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_LED_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_PCI_IO_VBASE,
 	BECC_PCI_IO_BASE,
-	BRH_PCI_IO_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	BRH_PCI_IO_VSIZE
+    ),
+    DEVMAP_ENTRY(
 	BRH_BECC_VBASE,
 	BECC_REG_BASE,
-	BRH_BECC_VSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	BRH_BECC_VSIZE
+    ),
+    DEVMAP_ENTRY_END
 };
 
 static void

Index: src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c
diff -u src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.17 src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.18
--- src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.17	Tue Jul 16 14:41:44 2019
+++ src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: armadaxp_machdep.c,v 1.17 2019/07/16 14:41:44 skrll Exp $	*/
+/*	$NetBSD: armadaxp_machdep.c,v 1.18 2023/04/20 08:28:03 skrll Exp $	*/
 /*******************************************************************************
 Copyright (C) Marvell International Ltd. and its affiliates
 
@@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
 *******************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.17 2019/07/16 14:41:44 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.18 2023/04/20 08:28:03 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -187,24 +187,15 @@ axp_system_reset(void)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap devmap[] = {
-	{
-		/* Internal registers */
-		.pd_va = _A(MARVELL_INTERREGS_VBASE),
-		.pd_pa = _A(MARVELL_INTERREGS_PBASE),
-		.pd_size = _S(MVSOC_INTERREGS_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
-	{0, 0, 0, 0, 0}
+	DEVMAP_ENTRY_FLAGS(MARVELL_INTERREGS_VBASE,
+			   MARVELL_INTERREGS_PBASE,
+			   MVSOC_INTERREGS_SIZE,
+			   VM_PROT_READ | VM_PROT_WRITE,
+			   PMAP_NOCACHE),
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 static inline pd_entry_t *
 read_ttb(void)
 {

Index: src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c
diff -u src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c:1.39 src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c:1.40
--- src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c:1.39	Sun Jul  3 19:58:42 2022
+++ src/sys/arch/evbarm/g42xxeb/g42xxeb_machdep.c	Thu Apr 20 08:28:03 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: g42xxeb_machdep.c,v 1.39 2022/07/03 19:58:42 andvar Exp $ */
+/*	$NetBSD: g42xxeb_machdep.c,v 1.40 2023/04/20 08:28:03 skrll Exp $ */
 
 /*
  * Copyright (c) 2002, 2003, 2004, 2005  Genetec Corporation.
@@ -335,53 +335,40 @@ read_ttb(void)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap g42xxeb_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	    G42XXEB_PLDREG_VBASE,
-	    _A(G42XXEB_PLDREG_BASE),
-	    _S(G42XXEB_PLDREG_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    G42XXEB_PLDREG_BASE,
+	    G42XXEB_PLDREG_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    G42XXEB_GPIO_VBASE,
-	    _A(PXA2X0_GPIO_BASE),
-	    _S(PXA250_GPIO_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_GPIO_BASE,
+	    PXA250_GPIO_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    G42XXEB_CLKMAN_VBASE,
-	    _A(PXA2X0_CLKMAN_BASE),
-	    _S(PXA2X0_CLKMAN_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_CLKMAN_BASE,
+	    PXA2X0_CLKMAN_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    G42XXEB_INTCTL_VBASE,
-	    _A(PXA2X0_INTCTL_BASE),
-	    _S(PXA2X0_INTCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_INTCTL_BASE,
+	    PXA2X0_INTCTL_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    G42XXEB_FFUART_VBASE,
-	    _A(PXA2X0_FFUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_FFUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    G42XXEB_BTUART_VBASE,
-	    _A(PXA2X0_BTUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {0, 0, 0, 0,}
+	    PXA2X0_BTUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
-
 /*
  * vaddr_t initarm(...)
  *

Index: src/sys/arch/evbarm/gemini/gemini_machdep.c
diff -u src/sys/arch/evbarm/gemini/gemini_machdep.c:1.33 src/sys/arch/evbarm/gemini/gemini_machdep.c:1.34
--- src/sys/arch/evbarm/gemini/gemini_machdep.c:1.33	Sat Nov 28 14:02:30 2020
+++ src/sys/arch/evbarm/gemini/gemini_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: gemini_machdep.c,v 1.33 2020/11/28 14:02:30 skrll Exp $	*/
+/*	$NetBSD: gemini_machdep.c,v 1.34 2023/04/20 08:28:04 skrll Exp $	*/
 
 /* adapted from:
  *	NetBSD: sdp24xx_machdep.c,v 1.4 2008/08/27 11:03:10 matt Exp
@@ -129,7 +129,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gemini_machdep.c,v 1.33 2020/11/28 14:02:30 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gemini_machdep.c,v 1.34 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -418,90 +418,66 @@ cpu_reboot(int howto, char *bootstr)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap devmap[] = {
 	/* Global regs */
-	{
-		.pd_va = _A(GEMINI_GLOBAL_VBASE),
-		.pd_pa = _A(GEMINI_GLOBAL_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_GLOBAL_VBASE,
+			   GEMINI_GLOBAL_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* Watchdog */
-	{
-		.pd_va = _A(GEMINI_WATCHDOG_VBASE),
-		.pd_pa = _A(GEMINI_WATCHDOG_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_WATCHDOG_VBASE,
+			   GEMINI_WATCHDOG_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
+
+	DEVMAP_ENTRY_FLAGS(GEMINI_WATCHDOG_VBASE,
+			   GEMINI_WATCHDOG_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* UART */
-	{
-		.pd_va = _A(GEMINI_UART_VBASE),
-		.pd_pa = _A(GEMINI_UART_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_UART_VBASE,
+			   GEMINI_UART_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* LPCHC */
-	{
-		.pd_va = _A(GEMINI_LPCHC_VBASE),
-		.pd_pa = _A(GEMINI_LPCHC_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_LPCHC_VBASE,
+			   GEMINI_LPCHC_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* LPCIO */
-	{
-		.pd_va = _A(GEMINI_LPCIO_VBASE),
-		.pd_pa = _A(GEMINI_LPCIO_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_LPCIO_VBASE,
+			   GEMINI_LPCIO_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* Timers */
-	{
-		.pd_va = _A(GEMINI_TIMER_VBASE),
-		.pd_pa = _A(GEMINI_TIMER_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_TIMER_VBASE,
+			   GEMINI_TIMER_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 	/* DRAM Controller */
-	{
-		.pd_va = _A(GEMINI_DRAMC_VBASE),
-		.pd_pa = _A(GEMINI_DRAMC_BASE),
-		.pd_size = _S(L1_S_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_DRAMC_VBASE,
+			   GEMINI_DRAMC_BASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 
 #if defined(MEMORY_DISK_DYNAMIC)
 	/* Ramdisk */
-	{
-		.pd_va = _A(GEMINI_RAMDISK_VBASE),
-		.pd_pa = _A(GEMINI_RAMDISK_PBASE),
-		.pd_size = _S(GEMINI_RAMDISK_SIZE),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
+	DEVMAP_ENTRY_FLAGS(GEMINI_RAMDISK_VBASE,
+			   GEMINI_RAMDISK_PBASE,
+			   L1_S_SIZE,
+			   PMAP_NOCACHE),
 #endif
 
-	{0}	/* list terminator */
+	/* list terminator */
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 #ifdef DDB
 static void gemini_db_trap(int where)
 {

Index: src/sys/arch/evbarm/gumstix/gumstix_machdep.c
diff -u src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.72 src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.73
--- src/sys/arch/evbarm/gumstix/gumstix_machdep.c:1.72	Sat Oct 29 13:10:25 2022
+++ src/sys/arch/evbarm/gumstix/gumstix_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: gumstix_machdep.c,v 1.72 2022/10/29 13:10:25 jmcneill Exp $ */
+/*	$NetBSD: gumstix_machdep.c,v 1.73 2023/04/20 08:28:04 skrll Exp $ */
 /*
  * Copyright (C) 2005, 2006, 2007  WIDE Project and SOUM Corporation.
  * All rights reserved.
@@ -277,74 +277,52 @@ read_ttb(void)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap gumstix_devmap[] = {
 #if defined(GUMSTIX)
-	{
+	DEVMAP_ENTRY(
 		GUMSTIX_GPIO_VBASE,
-		_A(PXA2X0_GPIO_BASE),
-		_S(PXA250_GPIO_SIZE),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_GPIO_BASE,
+		PXA250_GPIO_SIZE
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_CLKMAN_VBASE,
-		_A(PXA2X0_CLKMAN_BASE),
-		_S(PXA2X0_CLKMAN_SIZE),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_CLKMAN_BASE,
+		PXA2X0_CLKMAN_SIZE
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_INTCTL_VBASE,
-		_A(PXA2X0_INTCTL_BASE),
-		_S(PXA2X0_INTCTL_SIZE),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_INTCTL_BASE,
+		PXA2X0_INTCTL_SIZE
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_FFUART_VBASE,
-		_A(PXA2X0_FFUART_BASE),
-		_S(4 * COM_NPORTS),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_FFUART_BASE,
+		4 * COM_NPORTS
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_STUART_VBASE,
-		_A(PXA2X0_STUART_BASE),
-		_S(4 * COM_NPORTS),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_STUART_BASE,
+		4 * COM_NPORTS
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_BTUART_VBASE,
-		_A(PXA2X0_BTUART_BASE),
-		_S(4 * COM_NPORTS),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_BTUART_BASE,
+		4 * COM_NPORTS
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_HWUART_VBASE,
-		_A(PXA2X0_HWUART_BASE),
-		_S(4 * COM_NPORTS),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
+		PXA2X0_HWUART_BASE,
+		4 * COM_NPORTS
+	),
+	DEVMAP_ENTRY(
 		GUMSTIX_LCDC_VBASE,
-		_A(PXA2X0_LCDC_BASE),
-		_S(4 * COM_NPORTS),
-		VM_PROT_READ | VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		PXA2X0_LCDC_BASE,
+		4 * COM_NPORTS
+	),
 #endif
-	{ 0, 0, 0, 0, 0 }
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 extern uint32_t *uboot_args;
 
 /*

Index: src/sys/arch/evbarm/hdl_g/hdlg_machdep.c
diff -u src/sys/arch/evbarm/hdl_g/hdlg_machdep.c:1.33 src/sys/arch/evbarm/hdl_g/hdlg_machdep.c:1.34
--- src/sys/arch/evbarm/hdl_g/hdlg_machdep.c:1.33	Tue Jan  4 10:38:04 2022
+++ src/sys/arch/evbarm/hdl_g/hdlg_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: hdlg_machdep.c,v 1.33 2022/01/04 10:38:04 skrll Exp $	*/
+/*	$NetBSD: hdlg_machdep.c,v 1.34 2023/04/20 08:28:04 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdlg_machdep.c,v 1.33 2022/01/04 10:38:04 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdlg_machdep.c,v 1.34 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -171,37 +171,25 @@ static const struct pmap_devmap hdlg_dev
      * Map the on-board devices VA == PA so that we can access them
      * with the MMU on or off.
      */
-    {
+    DEVMAP_ENTRY(
 	HDLG_OBIO_BASE,
 	HDLG_OBIO_BASE,
-	HDLG_OBIO_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
+	HDLG_OBIO_SIZE
+    ),
 
-    {
+    DEVMAP_ENTRY(
 	HDLG_IOW_VBASE,
 	VERDE_OUT_XLATE_IO_WIN0_BASE,
-	VERDE_OUT_XLATE_IO_WIN_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
+	VERDE_OUT_XLATE_IO_WIN_SIZE
+    ),
 
-   {
+    DEVMAP_ENTRY(
 	HDLG_80321_VBASE,
 	VERDE_PMMR_BASE,
-	VERDE_PMMR_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
-
-   {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	VERDE_PMMR_SIZE
+    ),
+
+    DEVMAP_ENTRY_END
 };
 
 static void

Index: src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c
diff -u src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c:1.13 src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c:1.14
--- src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c:1.13	Fri Dec  3 13:27:38 2021
+++ src/sys/arch/evbarm/imx23_olinuxino/imx23_olinuxino_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/* $Id: imx23_olinuxino_machdep.c,v 1.13 2021/12/03 13:27:38 andvar Exp $ */
+/* $Id: imx23_olinuxino_machdep.c,v 1.14 2023/04/20 08:28:04 skrll Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -91,20 +91,14 @@ do {									\
 /*
  * Static device map for i.MX23 peripheral address space.
  */
-#define _A(a)	((a) & ~L1_S_OFFSET)
-#define _S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
 static const struct pmap_devmap devmap[] = {
-	{
-		_A(APBH_BASE),			/* Virtual address. */
-		_A(APBH_BASE),			/* Physical address. */
-		_S(APBH_SIZE + APBX_SIZE),	/* APBX located after APBH. */
-		VM_PROT_READ|VM_PROT_WRITE,	/* Protection bits. */
-		PTE_NOCACHE			/* Cache attributes. */
-	},
-	{ 0, 0, 0, 0, 0 }
+	DEVMAP_ENTRY(	
+		APBH_BASE,		/* Virtual address. */
+		APBH_BASE,		/* Physical address. */
+		APBH_SIZE + APBX_SIZE	/* APBX located after APBH. */
+	),
+	DEVMAP_ENTRY_END
 };
-#undef _A
-#undef _S
 
 static struct plcom_instance imx23_pi = {
 	.pi_type = PLCOM_TYPE_PL011,

Index: src/sys/arch/evbarm/imx31/imx31lk_machdep.c
diff -u src/sys/arch/evbarm/imx31/imx31lk_machdep.c:1.29 src/sys/arch/evbarm/imx31/imx31lk_machdep.c:1.30
--- src/sys/arch/evbarm/imx31/imx31lk_machdep.c:1.29	Tue Aug 17 22:00:28 2021
+++ src/sys/arch/evbarm/imx31/imx31lk_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: imx31lk_machdep.c,v 1.29 2021/08/17 22:00:28 andvar Exp $ */
+/* $NetBSD: imx31lk_machdep.c,v 1.30 2023/04/20 08:28:04 skrll Exp $ */
 
 /*
  * Startup routines for the ZOOM iMX31 LITEKIT.
@@ -110,7 +110,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imx31lk_machdep.c,v 1.29 2021/08/17 22:00:28 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imx31lk_machdep.c,v 1.30 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -302,18 +302,13 @@ cpu_reboot(int howto, char *bootstr)
  * with kernel's page table which we build up in initarm().
  */
 
-#define _A(a)   ((a) & ~L1_S_OFFSET)
-#define _S(s)   (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap imx31lk_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	IMX31LITEKIT_UART1_VBASE,
-	_A(UART1_BASE),
-	_S(L1_S_SIZE),
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-	{0, 0, 0, 0, 0 }
+	UART1_BASE,
+	L1_S_SIZE
+    ),
+    DEVMAP_ENTRY_END
 };
 
 #ifndef MEMSTART

Index: src/sys/arch/evbarm/integrator/integrator_machdep.c
diff -u src/sys/arch/evbarm/integrator/integrator_machdep.c:1.80 src/sys/arch/evbarm/integrator/integrator_machdep.c:1.81
--- src/sys/arch/evbarm/integrator/integrator_machdep.c:1.80	Tue Aug 10 06:47:49 2021
+++ src/sys/arch/evbarm/integrator/integrator_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: integrator_machdep.c,v 1.80 2021/08/10 06:47:49 skrll Exp $	*/
+/*	$NetBSD: integrator_machdep.c,v 1.81 2023/04/20 08:28:04 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001,2002 ARM Ltd
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: integrator_machdep.c,v 1.80 2021/08/10 06:47:49 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: integrator_machdep.c,v 1.81 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -264,47 +264,33 @@ cpu_reboot(int howto, char *bootstr)
 /* Statically mapped devices. */
 static const struct pmap_devmap integrator_devmap[] = {
 #if NPLCOM > 0 && defined(PLCONSOLE)
-	{
+	DEVMAP_ENTRY(
 		UART0_BOOT_BASE,
 		IFPGA_IO_BASE + IFPGA_UART0,
-		1024 * 1024,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE
-	},
+		1024 * 1024
+	),
 
-	{
+	DEVMAP_ENTRY(
 		UART1_BOOT_BASE,
 		IFPGA_IO_BASE + IFPGA_UART1,
-		1024 * 1024,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE
-	},
+		1024 * 1024
+	),
 #endif
 #if NPCI > 0
-	{
+	DEVMAP_ENTRY(
 		IFPGA_PCI_IO_VBASE,
 		IFPGA_PCI_IO_BASE,
-		IFPGA_PCI_IO_VSIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE
-	},
+		IFPGA_PCI_IO_VSIZE
+	),
 
-	{
+	DEVMAP_ENTRY(
 		IFPGA_PCI_CONF_VBASE,
 		IFPGA_PCI_CONF_BASE,
-		IFPGA_PCI_CONF_VSIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE
-	},
+		IFPGA_PCI_CONF_VSIZE
+	),
 #endif
 
-	{
-		0,
-		0,
-		0,
-		0,
-		0
-	}
+	DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/evbarm/iq80310/iq80310_machdep.c
diff -u src/sys/arch/evbarm/iq80310/iq80310_machdep.c:1.94 src/sys/arch/evbarm/iq80310/iq80310_machdep.c:1.95
--- src/sys/arch/evbarm/iq80310/iq80310_machdep.c:1.94	Tue Aug 17 22:00:28 2021
+++ src/sys/arch/evbarm/iq80310/iq80310_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: iq80310_machdep.c,v 1.94 2021/08/17 22:00:28 andvar Exp $	*/
+/*	$NetBSD: iq80310_machdep.c,v 1.95 2023/04/20 08:28:04 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iq80310_machdep.c,v 1.94 2021/08/17 22:00:28 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iq80310_machdep.c,v 1.95 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -263,42 +263,28 @@ static const struct pmap_devmap iq80310_
      * Map the on-board devices VA == PA so that we can access them
      * with the MMU on or off.
      */
-    {
+    DEVMAP_ENTRY(
 	IQ80310_OBIO_BASE,
 	IQ80310_OBIO_BASE,
-	IQ80310_OBIO_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	IQ80310_OBIO_SIZE
+    ),
+    DEVMAP_ENTRY(
 	IQ80310_PIOW_VBASE,
 	I80312_PCI_XLATE_PIOW_BASE,
-	I80312_PCI_XLATE_IOSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	I80312_PCI_XLATE_IOSIZE
+    ),
+    DEVMAP_ENTRY(
 	IQ80310_SIOW_VBASE,
 	I80312_PCI_XLATE_SIOW_BASE,
-	I80312_PCI_XLATE_IOSIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-    {
+	I80312_PCI_XLATE_IOSIZE
+    ),
+    DEVMAP_ENTRY(
 	IQ80310_80312_VBASE,
 	I80312_PMMR_BASE,
-	I80312_PMMR_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-
-    {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	I80312_PMMR_SIZE
+    ),
+
+    DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/evbarm/iq80321/iq80321_machdep.c
diff -u src/sys/arch/evbarm/iq80321/iq80321_machdep.c:1.64 src/sys/arch/evbarm/iq80321/iq80321_machdep.c:1.65
--- src/sys/arch/evbarm/iq80321/iq80321_machdep.c:1.64	Tue Aug 17 22:00:28 2021
+++ src/sys/arch/evbarm/iq80321/iq80321_machdep.c	Thu Apr 20 08:28:04 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: iq80321_machdep.c,v 1.64 2021/08/17 22:00:28 andvar Exp $	*/
+/*	$NetBSD: iq80321_machdep.c,v 1.65 2023/04/20 08:28:04 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iq80321_machdep.c,v 1.64 2021/08/17 22:00:28 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iq80321_machdep.c,v 1.65 2023/04/20 08:28:04 skrll Exp $");
 
 #include "opt_console.h"
 #include "opt_ddb.h"
@@ -303,41 +303,29 @@ cpu_reboot(int howto, char *bootstr)
 
 /* Static device mappings. */
 static const struct pmap_devmap iq80321_devmap[] = {
-    /*
-     * Map the on-board devices VA == PA so that we can access them
-     * with the MMU on or off.
-     */
-    {
-	IQ80321_OBIO_BASE,
-	IQ80321_OBIO_BASE,
-	IQ80321_OBIO_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-
-    {
-	IQ80321_IOW_VBASE,
-	VERDE_OUT_XLATE_IO_WIN0_BASE,
-	VERDE_OUT_XLATE_IO_WIN_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
-
-   {
-	IQ80321_80321_VBASE,
-	VERDE_PMMR_BASE,
-	VERDE_PMMR_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
-
-   {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	/*
+	 * Map the on-board devices VA == PA so that we can access them
+	 * with the MMU on or off.
+	 */
+	DEVMAP_ENTRY(
+		IQ80321_OBIO_BASE,
+		IQ80321_OBIO_BASE,
+		IQ80321_OBIO_SIZE
+	),
+
+	DEVMAP_ENTRY(
+		IQ80321_IOW_VBASE,
+		VERDE_OUT_XLATE_IO_WIN0_BASE,
+		VERDE_OUT_XLATE_IO_WIN_SIZE
+	),
+
+	DEVMAP_ENTRY(
+		IQ80321_80321_VBASE,
+		VERDE_PMMR_BASE,
+		VERDE_PMMR_SIZE
+   	),
+
+	DEVMAP_ENTRY_END
 };
 
 static void

Index: src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c
diff -u src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c:1.66 src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c:1.67
--- src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c:1.66	Tue Aug 17 22:00:28 2021
+++ src/sys/arch/evbarm/ixm1200/ixm1200_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: ixm1200_machdep.c,v 1.66 2021/08/17 22:00:28 andvar Exp $ */
+/*	$NetBSD: ixm1200_machdep.c,v 1.67 2023/04/20 08:28:05 skrll Exp $ */
 
 /*
  * Copyright (c) 2002, 2003
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ixm1200_machdep.c,v 1.66 2021/08/17 22:00:28 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ixm1200_machdep.c,v 1.67 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -263,48 +263,32 @@ cpu_reboot(int howto, char *bootstr)
 /* Static device mappings. */
 static const struct pmap_devmap ixm1200_devmap[] = {
 	/* StrongARM System and Peripheral Registers */
-	{
+	DEVMAP_ENTRY(
 		IXP12X0_SYS_VBASE,
 		IXP12X0_SYS_HWBASE,
-		IXP12X0_SYS_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP12X0_SYS_SIZE
+	),
 	/* PCI Registers Accessible Through StrongARM Core */
-	{
+	DEVMAP_ENTRY(
 		IXP12X0_PCI_VBASE, IXP12X0_PCI_HWBASE,
-		IXP12X0_PCI_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP12X0_PCI_SIZE
+	),
 	/* PCI Registers Accessible Through I/O Cycle Access */
-	{
+	DEVMAP_ENTRY(
 		IXP12X0_PCI_IO_VBASE, IXP12X0_PCI_IO_HWBASE,
-		IXP12X0_PCI_IO_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP12X0_PCI_IO_SIZE
+	),
 	/* PCI Type0 Configuration Space */
-	{
+	DEVMAP_ENTRY(
 		IXP12X0_PCI_TYPE0_VBASE, IXP12X0_PCI_TYPE0_HWBASE,
-		IXP12X0_PCI_TYPE0_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP12X0_PCI_TYPE0_SIZE
+	),
 	/* PCI Type1 Configuration Space */
-	{
+	DEVMAP_ENTRY(
 		IXP12X0_PCI_TYPE1_VBASE, IXP12X0_PCI_TYPE1_HWBASE,
-		IXP12X0_PCI_TYPE1_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-	{
-		0,
-		0,
-		0,
-		0,
-		0
-	},
+		IXP12X0_PCI_TYPE1_SIZE
+	),
+	DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/evbarm/kobo/kobo_machdep.c
diff -u src/sys/arch/evbarm/kobo/kobo_machdep.c:1.8 src/sys/arch/evbarm/kobo/kobo_machdep.c:1.9
--- src/sys/arch/evbarm/kobo/kobo_machdep.c:1.8	Wed Jul 24 12:33:18 2019
+++ src/sys/arch/evbarm/kobo/kobo_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobo_machdep.c,v 1.8 2019/07/24 12:33:18 hkenken Exp $	*/
+/*	$NetBSD: kobo_machdep.c,v 1.9 2023/04/20 08:28:05 skrll Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003, 2005, 2010  Genetec Corporation.
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobo_machdep.c,v 1.8 2019/07/24 12:33:18 hkenken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobo_machdep.c,v 1.9 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_evbarm_boardtype.h"
 #include "opt_arm_debug.h"
@@ -193,24 +193,16 @@ int comcnmode = CONMODE;
  * using the 2nd page tables.
  */
 
-#define _A(a)   ((a) & ~L1_S_OFFSET)
-#define _S(s)   (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 const struct pmap_devmap kobo_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		/* for UART2, IOMUXC */
-		.pd_va = _A(KOBO_IO_VBASE0),
-		.pd_pa = _A(KOBO_IO_PBASE0),
-		.pd_size = _S(L1_S_SIZE * 4),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
-	{0}
+		KOBO_IO_VBASE0,
+		KOBO_IO_PBASE0,
+		L1_S_SIZE * 4
+	),
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 #ifndef MEMSTART
 #define MEMSTART	0x70000000
 #endif

Index: src/sys/arch/evbarm/lubbock/lubbock_machdep.c
diff -u src/sys/arch/evbarm/lubbock/lubbock_machdep.c:1.42 src/sys/arch/evbarm/lubbock/lubbock_machdep.c:1.43
--- src/sys/arch/evbarm/lubbock/lubbock_machdep.c:1.42	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/evbarm/lubbock/lubbock_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: lubbock_machdep.c,v 1.42 2021/08/17 22:00:29 andvar Exp $ */
+/*	$NetBSD: lubbock_machdep.c,v 1.43 2023/04/20 08:28:05 skrll Exp $ */
 
 /*
  * Copyright (c) 2002, 2003, 2005  Genetec Corporation.  All rights reserved.
@@ -112,7 +112,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lubbock_machdep.c,v 1.42 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lubbock_machdep.c,v 1.43 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -347,53 +347,41 @@ read_ttb(void)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap lubbock_devmap[] = {
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_OBIO_VBASE,
-	    _A(LUBBOCK_OBIO_PBASE),
-	    _S(LUBBOCK_OBIO_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    LUBBOCK_OBIO_PBASE,
+	    LUBBOCK_OBIO_SIZE
     },
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_GPIO_VBASE,
-	    _A(PXA2X0_GPIO_BASE),
-	    _S(PXA250_GPIO_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    PXA2X0_GPIO_BASE,
+	    PXA250_GPIO_SIZE
     },
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_CLKMAN_VBASE,
-	    _A(PXA2X0_CLKMAN_BASE),
-	    _S(PXA2X0_CLKMAN_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    PXA2X0_CLKMAN_BASE,
+	    PXA2X0_CLKMAN_SIZE
     },
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_INTCTL_VBASE,
-	    _A(PXA2X0_INTCTL_BASE),
-	    _S(PXA2X0_INTCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    PXA2X0_INTCTL_BASE,
+	    PXA2X0_INTCTL_SIZE
     },
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_FFUART_VBASE,
-	    _A(PXA2X0_FFUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    PXA2X0_FFUART_BASE,
+	    4 * COM_NPORTS
     },
-    {
+    DEVMAP_ENTRY{
 	    LUBBOCK_BTUART_VBASE,
-	    _A(PXA2X0_BTUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+	    PXA2X0_BTUART_BASE,
+	    4 * COM_NPORTS
     },
 
-    {0, 0, 0, 0,}
+    DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 /*
  * vaddr_t initarm(...)
  *

Index: src/sys/arch/evbarm/marvell/marvell_machdep.c
diff -u src/sys/arch/evbarm/marvell/marvell_machdep.c:1.37 src/sys/arch/evbarm/marvell/marvell_machdep.c:1.38
--- src/sys/arch/evbarm/marvell/marvell_machdep.c:1.37	Mon Aug 30 00:04:30 2021
+++ src/sys/arch/evbarm/marvell/marvell_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: marvell_machdep.c,v 1.37 2021/08/30 00:04:30 rin Exp $ */
+/*	$NetBSD: marvell_machdep.c,v 1.38 2023/04/20 08:28:05 skrll Exp $ */
 /*
  * Copyright (c) 2007, 2008, 2010 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: marvell_machdep.c,v 1.37 2021/08/30 00:04:30 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: marvell_machdep.c,v 1.38 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -257,19 +257,14 @@ read_ttb(void)
  * registers segment-aligned and segment-rounded in order to avoid
  * using the 2nd page tables.
  */
-#define _A(a)	((a) & ~L1_S_OFFSET)
-#define _S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
 
 static struct pmap_devmap marvell_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		MARVELL_INTERREGS_VBASE,
-		_A(MARVELL_INTERREGS_PBASE),
-		_S(MVSOC_INTERREGS_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
-
-	{ 0, 0, 0, 0, 0 }
+		MARVELL_INTERREGS_PBASE,
+		MVSOC_INTERREGS_SIZE
+	),
+	DEVMAP_ENTRY_END
 };
 
 extern uint32_t *u_boot_args[];

Index: src/sys/arch/evbarm/mini2440/mini2440_machdep.c
diff -u src/sys/arch/evbarm/mini2440/mini2440_machdep.c:1.19 src/sys/arch/evbarm/mini2440/mini2440_machdep.c:1.20
--- src/sys/arch/evbarm/mini2440/mini2440_machdep.c:1.19	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/evbarm/mini2440/mini2440_machdep.c	Thu Apr 20 08:28:05 2023
@@ -131,7 +131,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mini2440_machdep.c,v 1.19 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mini2440_machdep.c,v 1.20 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -362,9 +362,6 @@ cpu_reboot(int howto, char *bootstr)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 #define	_V(n)	(MINI2440_IO_VBASE + (n) * L1_S_SIZE)
 
 #define	GPIO_VBASE	_V(0)
@@ -374,37 +371,30 @@ cpu_reboot(int howto, char *bootstr)
 
 static const struct pmap_devmap mini2440_devmap[] = {
 	/* GPIO registers */
-	{
+	DEVMAP_ENTRY{
 		GPIO_VBASE,
-		_A(S3C2440_GPIO_BASE),
-		_S(S3C2440_GPIO_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{
+		S3C2440_GPIO_BASE,
+		S3C2440_GPIO_SIZE
+	),
+	DEVMAP_ENTRY({
 		INTCTL_VBASE,
-		_A(S3C2440_INTCTL_BASE),
-		_S(S3C2440_INTCTL_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{
+		S3C2440_INTCTL_BASE,
+		S3C2440_INTCTL_SIZE
+	),
+	DEVMAP_ENTRY({
 		CLKMAN_VBASE,
-		_A(S3C2440_CLKMAN_BASE),
-		_S(S3C24X0_CLKMAN_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{	/* UART registers for UART0, 1, 2. */
+		S3C2440_CLKMAN_BASE),
+		S3C24X0_CLKMAN_SIZE
+	),
+	/* UART registers for UART0, 1, 2. */
+	DEVMAP_ENTRY({
 		UART_VBASE,
-		_A(S3C2440_UART0_BASE),
-		_S(S3C2440_UART_BASE(3) - S3C2440_UART0_BASE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-
-	{ 0, 0, 0, 0 }
+		S3C2440_UART0_BASE),
+		S3C2440_UART_BASE(3) - S3C2440_UART0_BASE
+	),
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 static inline	pd_entry_t *
 read_ttb(void)
 {

Index: src/sys/arch/evbarm/netwalker/netwalker_machdep.c
diff -u src/sys/arch/evbarm/netwalker/netwalker_machdep.c:1.26 src/sys/arch/evbarm/netwalker/netwalker_machdep.c:1.27
--- src/sys/arch/evbarm/netwalker/netwalker_machdep.c:1.26	Wed Jul 24 12:33:18 2019
+++ src/sys/arch/evbarm/netwalker/netwalker_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: netwalker_machdep.c,v 1.26 2019/07/24 12:33:18 hkenken Exp $	*/
+/*	$NetBSD: netwalker_machdep.c,v 1.27 2023/04/20 08:28:05 skrll Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003, 2005, 2010  Genetec Corporation.
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netwalker_machdep.c,v 1.26 2019/07/24 12:33:18 hkenken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netwalker_machdep.c,v 1.27 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_evbarm_boardtype.h"
 #include "opt_arm_debug.h"
@@ -207,24 +207,16 @@ int comcnmode = CONMODE;
  * with kernel's page table which we build up in initarm().
  */
 
-#define _A(a)   ((a) & ~L1_S_OFFSET)
-#define _S(s)   (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap netwalker_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		/* for UART1, IOMUXC */
-		.pd_va = _A(NETWALKER_IO_VBASE0),
-		.pd_pa = _A(NETWALKER_IO_PBASE0),
-		.pd_size = _S(L1_S_SIZE * 4),
-		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
-		.pd_cache = PTE_NOCACHE
-	},
-	{0}
+		NETWALKER_IO_VBASE0,
+		NETWALKER_IO_PBASE0,
+		L1_S_SIZE * 4
+	),
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 #ifndef MEMSTART
 #define MEMSTART	0x90000000
 #endif

Index: src/sys/arch/evbarm/nslu2/nslu2_machdep.c
diff -u src/sys/arch/evbarm/nslu2/nslu2_machdep.c:1.35 src/sys/arch/evbarm/nslu2/nslu2_machdep.c:1.36
--- src/sys/arch/evbarm/nslu2/nslu2_machdep.c:1.35	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/evbarm/nslu2/nslu2_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: nslu2_machdep.c,v 1.35 2021/08/17 22:00:29 andvar Exp $	*/
+/*	$NetBSD: nslu2_machdep.c,v 1.36 2023/04/20 08:28:05 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -94,7 +94,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nslu2_machdep.c,v 1.35 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nslu2_machdep.c,v 1.36 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -345,66 +345,48 @@ cpu_reboot(int howto, char *bootstr)
 /* Static device mappings. */
 static const struct pmap_devmap nslu2_devmap[] = {
 	/* Physical/Virtual address for I/O space */
-	{
+	DEVMAP_ENTRY(
 		IXP425_IO_VBASE,
 		IXP425_IO_HWBASE,
-		IXP425_IO_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP425_IO_SIZE
+	),
 
 	/* Expansion Bus */
-	{
+	DEVMAP_ENTRY(
 		IXP425_EXP_VBASE,
 		IXP425_EXP_HWBASE,
-		IXP425_EXP_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP425_EXP_SIZE
+	),
 
 	/* IXP425 PCI Configuration */
-	{
+	DEVMAP_ENTRY(
 		IXP425_PCI_VBASE,
 		IXP425_PCI_HWBASE,
-		IXP425_PCI_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP425_PCI_SIZE
+	),
 
 	/* SDRAM Controller */
-	{
+	DEVMAP_ENTRY(
 		IXP425_MCU_VBASE,
 		IXP425_MCU_HWBASE,
-		IXP425_MCU_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP425_MCU_SIZE
+	),
 
 	/* PCI Memory Space */
-	{
+	DEVMAP_ENTRY(
 		IXP425_PCI_MEM_VBASE,
 		IXP425_PCI_MEM_HWBASE,
-		IXP425_PCI_MEM_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		IXP425_PCI_MEM_SIZE
+	),
 
 	/* Flash memory */
-	{
+	DEVMAP_ENTRY(
 		NSLU2_FLASH_VBASE,
 		NSLU2_FLASH_HWBASE,
-		NSLU2_FLASH_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE,
-		PTE_NOCACHE,
-	},
+		NSLU2_FLASH_SIZE
+	),
 
-	{
-		0,
-		0,
-		0,
-		0,
-		0,
-	}
+	DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c
diff -u src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c:1.45 src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c:1.46
--- src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c:1.45	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/evbarm/smdk2xx0/smdk2410_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: smdk2410_machdep.c,v 1.45 2021/08/17 22:00:29 andvar Exp $ */
+/*	$NetBSD: smdk2410_machdep.c,v 1.46 2023/04/20 08:28:05 skrll Exp $ */
 
 /*
  * Copyright (c) 2002, 2003 Fujitsu Component Limited
@@ -105,7 +105,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smdk2410_machdep.c,v 1.45 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smdk2410_machdep.c,v 1.46 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -328,9 +328,6 @@ cpu_reboot(int howto, char *bootstr)
  * using the 2nd page tables.
  */
 
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 #define	_V(n)	(SMDK2410_IO_VBASE + (n) * L1_S_SIZE)
 
 #define	GPIO_VBASE	_V(0)
@@ -343,37 +340,31 @@ cpu_reboot(int howto, char *bootstr)
 
 static const struct pmap_devmap smdk2410_devmap[] = {
 	/* GPIO registers */
-	{
+	DEVMAP_ENTRY(
 		GPIO_VBASE,
-		_A(S3C2410_GPIO_BASE),
-		_S(S3C2410_GPIO_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{
+		S3C2410_GPIO_BASE,
+		S3C2410_GPIO_SIZE
+	),
+	DEVMAP_ENTRY(
 		INTCTL_VBASE,
-		_A(S3C2410_INTCTL_BASE),
-		_S(S3C2410_INTCTL_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{
+		S3C2410_INTCTL_BASE,
+		S3C2410_INTCTL_SIZE
+	),
+	DEVMAP_ENTRY(
 		CLKMAN_VBASE,
-		_A(S3C2410_CLKMAN_BASE),
-		_S(S3C24X0_CLKMAN_SIZE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{	/* UART registers for UART0, 1, 2. */
+		S3C2410_CLKMAN_BASE,
+		S3C24X0_CLKMAN_SIZE
+	),
+	/* UART registers for UART0, 1, 2. */
+	DEVMAP_ENTRY(
 		UART_VBASE,
-		_A(S3C2410_UART0_BASE),
-		_S(S3C2410_UART_BASE(3) - S3C2410_UART0_BASE),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
+		S3C2410_UART0_BASE,
+		S3C2410_UART_BASE(3) - S3C2410_UART0_BASE
+	),
 
-	{ 0, 0, 0, 0 }
+	DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 static inline	pd_entry_t *
 read_ttb(void)
 {

Index: src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c
diff -u src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c:1.50 src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c:1.51
--- src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c:1.50	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/evbarm/smdk2xx0/smdk2800_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: smdk2800_machdep.c,v 1.50 2021/08/17 22:00:29 andvar Exp $ */
+/*	$NetBSD: smdk2800_machdep.c,v 1.51 2023/04/20 08:28:05 skrll Exp $ */
 
 /*
  * Copyright (c) 2002, 2003, 2005 Fujitsu Component Limited
@@ -106,7 +106,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smdk2800_machdep.c,v 1.50 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smdk2800_machdep.c,v 1.51 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_console.h"
@@ -312,13 +312,12 @@ cpu_reboot(int howto, char *bootstr)
  * at the same position.
  */
 static const struct pmap_devmap smdk2800_devmap[] = {
-	{
+	DEVMAP_ENTRY(
 		SMDK2800_IO_AREA_VBASE,
 		S3C2800_PERIPHERALS,
-		S3C2800_PERIPHERALS_SIZE,
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-	},
-	{ 0, 0, 0, 0 }
+		S3C2800_PERIPHERALS_SIZE
+	),
+	DEVMAP_ENTRY_END
 };
 
 #define ioreg_vaddr(pa)	((pa) - S3C2800_PERIPHERALS + SMDK2800_IO_AREA_VBASE)

Index: src/sys/arch/evbarm/tsarm/tsarm_machdep.c
diff -u src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.34 src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.35
--- src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.34	Sun Jul  3 19:58:42 2022
+++ src/sys/arch/evbarm/tsarm/tsarm_machdep.c	Thu Apr 20 08:28:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tsarm_machdep.c,v 1.34 2022/07/03 19:58:42 andvar Exp $ */
+/*	$NetBSD: tsarm_machdep.c,v 1.35 2023/04/20 08:28:05 skrll Exp $ */
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tsarm_machdep.c,v 1.34 2022/07/03 19:58:42 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tsarm_machdep.c,v 1.35 2023/04/20 08:28:05 skrll Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_console.h"
@@ -306,50 +306,36 @@ cpu_reboot(int howto, char *bootstr)
 
 /* Static device mappings. */
 static const struct pmap_devmap tsarm_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	EP93XX_AHB_VBASE,
 	EP93XX_AHB_HWBASE,
-	EP93XX_AHB_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
+	EP93XX_AHB_SIZE
+    ),
 
-    {
+    DEVMAP_ENTRY(
 	EP93XX_APB_VBASE,
 	EP93XX_APB_HWBASE,
-	EP93XX_APB_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
+	EP93XX_APB_SIZE
+    ),
 
 	/*
 	 * IO8 and IO16 space *must* be mapped contiguously with
 	 * IO8_VA == IO16_VA - 64 Mbytes.  ISA busmap driver depends
 	 * on that!
 	 */
-    {
+    DEVMAP_ENTRY(
 	TS7XXX_IO8_VBASE,
 	TS7XXX_IO8_HWBASE,
-	TS7XXX_IO8_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
+	TS7XXX_IO8_SIZE
+    ),
 
-    {
+    DEVMAP_ENTRY(
 	TS7XXX_IO16_VBASE,
 	TS7XXX_IO16_HWBASE,
-	TS7XXX_IO16_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
-
-   {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	TS7XXX_IO16_SIZE
+    ),
+
+    DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c
diff -u src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c:1.1 src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c:1.2
--- src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c:1.1	Sat Aug  6 03:53:40 2011
+++ src/sys/arch/hpcarm/hpcarm/netbookpro_machdep.c	Thu Apr 20 08:28:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbookpro_machdep.c,v 1.1 2011/08/06 03:53:40 kiyohara Exp $	*/
+/*	$NetBSD: netbookpro_machdep.c,v 1.2 2023/04/20 08:28:06 skrll Exp $	*/
 /*
  * Copyright (c) 2011 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbookpro_machdep.c,v 1.1 2011/08/06 03:53:40 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbookpro_machdep.c,v 1.2 2023/04/20 08:28:06 skrll Exp $");
 
 #include <sys/systm.h>
 #include <sys/device.h>
@@ -64,16 +64,14 @@ static int __unused enable_console(void 
 static void disable_consoles(void);
 static void cn_nonprobe(struct consdev *);
 
-#define	_A(a)	((a) & L1_S_FRAME)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & L1_S_FRAME)
 const struct pmap_devmap machdep_devmap[] = {
-	{	/* Framebuffer */
+	/* Framebuffer */
+	DEVMAP_ENTRY(
 		0x14000000,
-		_A(0x14000000),
-		_S(0x00400000),
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
+		0x14000000,
+		0x00400000
 	},
-	{ 0, 0, 0, 0, 0, }
+	DEVMAP_ENTRY_END
 };
 
 static struct pxa2x0_gpioconf netbookpro_boarddep_gpioconf[] = {

Index: src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c
diff -u src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c:1.30 src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c:1.31
--- src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c:1.30	Tue Aug 17 22:00:29 2021
+++ src/sys/arch/hpcarm/hpcarm/pxa2x0_hpc_machdep.c	Thu Apr 20 08:28:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pxa2x0_hpc_machdep.c,v 1.30 2021/08/17 22:00:29 andvar Exp $	*/
+/*	$NetBSD: pxa2x0_hpc_machdep.c,v 1.31 2023/04/20 08:28:06 skrll Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.30 2021/08/17 22:00:29 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pxa2x0_hpc_machdep.c,v 1.31 2023/04/20 08:28:06 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_dram_pages.h"
@@ -163,56 +163,45 @@ static void	fakecninit(void);
 #define	PXA2X0_BTUART_VBASE	0xfd500000
 #define	PXA2X0_STUART_VBASE	0xfd600000
 
-#define	_A(a)	((a) & L1_S_FRAME)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & L1_S_FRAME)
 const struct pmap_devmap pxa2x0_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	    PXA2X0_GPIO_VBASE,
-	    _A(PXA2X0_GPIO_BASE),
-	    _S(PXA2X0_GPIO_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_GPIO_BASE,
+	    PXA2X0_GPIO_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_CLKMAN_VBASE,
-	    _A(PXA2X0_CLKMAN_BASE),
-	    _S(PXA2X0_CLKMAN_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_CLKMAN_BASE,
+	    PXA2X0_CLKMAN_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_INTCTL_VBASE,
-	    _A(PXA2X0_INTCTL_BASE),
-	    _S(PXA2X0_INTCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_INTCTL_BASE,
+	    PXA2X0_INTCTL_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_MEMCTL_VBASE,
-	    _A(PXA2X0_MEMCTL_BASE),
-	    _S(PXA2X0_MEMCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_MEMCTL_BASE,
+	    PXA2X0_MEMCTL_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_FFUART_VBASE,
-	    _A(PXA2X0_FFUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_FFUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_BTUART_VBASE,
-	    _A(PXA2X0_BTUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_BTUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    PXA2X0_STUART_VBASE,
-	    _A(PXA2X0_STUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
+	    PXA2X0_STUART_BASE,
+	    4 * COM_NPORTS
+    ),
 
-    { 0, 0, 0, 0, 0, }
+    DEVMAP_ENTRY_END
 };
-#undef	_A
-#undef	_S
 extern const struct pmap_devmap machdep_devmap[];
 
 

Index: src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c
diff -u src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c:1.21 src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c:1.22
--- src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c:1.21	Mon Oct 11 14:36:05 2021
+++ src/sys/arch/hpcarm/hpcarm/sa11x0_hpc_machdep.c	Thu Apr 20 08:28:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: sa11x0_hpc_machdep.c,v 1.21 2021/10/11 14:36:05 rin Exp $	*/
+/*	$NetBSD: sa11x0_hpc_machdep.c,v 1.22 2023/04/20 08:28:06 skrll Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.21 2021/10/11 14:36:05 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sa11x0_hpc_machdep.c,v 1.22 2023/04/20 08:28:06 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_dram_pages.h"
@@ -158,13 +158,12 @@ extern void *__sleep_ctx;
  */
 static const struct pmap_devmap sa11x0_devmap[] = {
 	/* Physical/virtual address for UART #3. */
-	{
+	DEVMAP_ENTRY(
 		SACOM3_VBASE,
 		SACOM3_BASE,
-		0x24,
-		VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE
-	},
-	{ 0, 0, 0, 0, 0 }
+		0x24
+	),
+	DEVMAP_ENTRY_END
 };
 
 /*

Index: src/sys/arch/iyonix/iyonix/iyonix_machdep.c
diff -u src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.31 src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.32
--- src/sys/arch/iyonix/iyonix/iyonix_machdep.c:1.31	Sun Jan  2 16:42:10 2022
+++ src/sys/arch/iyonix/iyonix/iyonix_machdep.c	Thu Apr 20 08:28:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: iyonix_machdep.c,v 1.31 2022/01/02 16:42:10 christos Exp $	*/
+/*	$NetBSD: iyonix_machdep.c,v 1.32 2023/04/20 08:28:06 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iyonix_machdep.c,v 1.31 2022/01/02 16:42:10 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iyonix_machdep.c,v 1.32 2023/04/20 08:28:06 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -317,45 +317,31 @@ static const struct pmap_devmap iyonix_d
      * Map the on-board devices VA == PA so that we can access them
      * with the MMU on or off.
      */
-    {
+    DEVMAP_ENTRY(
 	IYONIX_OBIO_BASE,
 	IYONIX_OBIO_BASE,
-	IYONIX_OBIO_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-    },
+	IYONIX_OBIO_SIZE
+    ),
 
-    {
+    DEVMAP_ENTRY(
 	IYONIX_IOW_VBASE,
 	VERDE_OUT_XLATE_IO_WIN0_BASE,
-	VERDE_OUT_XLATE_IO_WIN_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
+	VERDE_OUT_XLATE_IO_WIN_SIZE
+   ),
 
-   {
+   DEVMAP_ENTRY(
 	IYONIX_80321_VBASE,
 	VERDE_PMMR_BASE,
-	VERDE_PMMR_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
+	VERDE_PMMR_SIZE
+   ),
 
-   {
+   DEVMAP_ENTRY(
 	IYONIX_FLASH_BASE,
 	IYONIX_FLASH_BASE,
-	IYONIX_FLASH_SIZE,
-	VM_PROT_READ|VM_PROT_WRITE,
-	PTE_NOCACHE,
-   },
-
-   {
-	0,
-	0,
-	0,
-	0,
-	0,
-    }
+	IYONIX_FLASH_SIZE
+   ),
+
+   DEVMAP_ENTRY_END
 };
 
 /* Read out the Machine ID from the flash, and stash it away for later use. */

Index: src/sys/arch/zaurus/zaurus/machdep.c
diff -u src/sys/arch/zaurus/zaurus/machdep.c:1.50 src/sys/arch/zaurus/zaurus/machdep.c:1.51
--- src/sys/arch/zaurus/zaurus/machdep.c:1.50	Sun Jul  3 19:58:42 2022
+++ src/sys/arch/zaurus/zaurus/machdep.c	Thu Apr 20 08:28:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.50 2022/07/03 19:58:42 andvar Exp $	*/
+/*	$NetBSD: machdep.c,v 1.51 2023/04/20 08:28:06 skrll Exp $	*/
 /*	$OpenBSD: zaurus_machdep.c,v 1.25 2006/06/20 18:24:04 todd Exp $	*/
 
 /*
@@ -107,7 +107,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.50 2022/07/03 19:58:42 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.51 2023/04/20 08:28:06 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -484,77 +484,61 @@ read_ttb(void)
  * registers segment-aligned and segment-rounded in order to avoid
  * using the 2nd page tables.
  */
-#define	_A(a)	((a) & ~L1_S_OFFSET)
-#define	_S(s)	(((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
-
 static const struct pmap_devmap zaurus_devmap[] = {
-    {
+    DEVMAP_ENTRY(
 	    ZAURUS_GPIO_VBASE,
-	    _A(PXA2X0_GPIO_BASE),
-	    _S(PXA2X0_GPIO_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_GPIO_BASE,
+	    PXA2X0_GPIO_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_CLKMAN_VBASE,
-	    _A(PXA2X0_CLKMAN_BASE),
-	    _S(PXA2X0_CLKMAN_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_CLKMAN_BASE,
+	    PXA2X0_CLKMAN_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_INTCTL_VBASE,
-	    _A(PXA2X0_INTCTL_BASE),
-	    _S(PXA2X0_INTCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_INTCTL_BASE,
+	    PXA2X0_INTCTL_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_MEMCTL_VBASE,
-	    _A(PXA2X0_MEMCTL_BASE),
-	    _S(PXA2X0_MEMCTL_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_MEMCTL_BASE,
+	    PXA2X0_MEMCTL_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_SCOOP0_VBASE,
-	    _A(C3000_SCOOP0_BASE),
-	    _S(SCOOP_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    C3000_SCOOP0_BASE,
+	    SCOOP_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_SCOOP1_VBASE,
-	    _A(C3000_SCOOP1_BASE),
-	    _S(SCOOP_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    C3000_SCOOP1_BASE,
+	    SCOOP_SIZE
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_FFUART_VBASE,
-	    _A(PXA2X0_FFUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_FFUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_BTUART_VBASE,
-	    _A(PXA2X0_BTUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_BTUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_STUART_VBASE,
-	    _A(PXA2X0_STUART_BASE),
-	    _S(4 * COM_NPORTS),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
-    {
+	    PXA2X0_STUART_BASE,
+	    4 * COM_NPORTS
+    ),
+    DEVMAP_ENTRY(
 	    ZAURUS_POWMAN_VBASE,
-	    _A(PXA2X0_POWMAN_BASE),
-	    _S(PXA2X0_POWMAN_SIZE),
-	    VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE,
-    },
+	    PXA2X0_POWMAN_BASE,
+	    PXA2X0_POWMAN_SIZE
+    ),
 
-    {0, 0, 0, 0, 0,}
+    DEVMAP_ENTRY_END
 };
 
-#undef	_A
-#undef	_S
-
 void green_on(int virt);
 void
 green_on(int virt)

Added files:

Index: src/sys/uvm/pmap/pmap_devmap.c
diff -u /dev/null src/sys/uvm/pmap/pmap_devmap.c:1.1
--- /dev/null	Thu Apr 20 08:28:06 2023
+++ src/sys/uvm/pmap/pmap_devmap.c	Thu Apr 20 08:28:02 2023
@@ -0,0 +1,173 @@
+/*	$NetBSD: pmap_devmap.c,v 1.1 2023/04/20 08:28:02 skrll Exp $	*/
+
+/*-
+ * Copyright (c) 2022 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: pmap_devmap.c,v 1.1 2023/04/20 08:28:02 skrll Exp $");
+
+
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include <uvm/uvm.h>
+#include <uvm/uvm_extern.h>
+#include <uvm/pmap/pmap_devmap.h>
+
+
+static const struct pmap_devmap *pd_table;
+static vaddr_t pd_root;
+
+bool pmap_devmap_bootstrap_done = false;
+
+bool
+pmap_devmap_bootstrapped_p(void)
+{
+	return pmap_devmap_bootstrap_done;
+}
+
+
+vaddr_t
+pmap_devmap_root(void)
+{
+	return pd_root;
+}
+
+/*
+ * Register the devmap table.  This is provided in case early console
+ * initialization needs to register mappings created by bootstrap code
+ * before pmap_devmap_bootstrap() is called.
+ */
+void
+pmap_devmap_register(const struct pmap_devmap *table)
+{
+
+	pd_table = table;
+}
+
+/*
+ * Map all of the static regions in the devmap table, and remember
+ * the devmap table so other parts of the kernel can look up entries
+ * later.
+ */
+void
+pmap_devmap_bootstrap(vaddr_t root, const struct pmap_devmap *table)
+{
+	UVMHIST_FUNC(__func__);
+	UVMHIST_CALLARGS(maphist, "(root=%#jx, table=%p)", root,
+	    (uintptr_t)table, 0, 0);
+
+	bool done = false;
+
+	pd_root = root;
+	pd_table = table;
+
+	for (size_t i = 0; table[i].pd_size != 0; i++) {
+		const struct pmap_devmap * const pdp = &table[i];
+		const vaddr_t vmax = __type_max_u(vaddr_t);
+		const vaddr_t pmax = __type_max_u(paddr_t);
+
+		KASSERT(pdp->pd_size != 0);
+		KASSERTMSG(vmax - pdp->pd_va >= pdp->pd_size - 1,
+		    "va %" PRIxVADDR " sz %" PRIxPSIZE, pdp->pd_va,
+		    pdp->pd_size);
+		KASSERTMSG(pmax - pdp->pd_pa >= pdp->pd_size - 1,
+		    "pa %" PRIxPADDR " sz %" PRIxPSIZE, pdp->pd_pa,
+		    pdp->pd_size);
+		UVMHIST_LOG(maphist,
+		    "pa %#jx -> %#jx @ va %#jx -> %#jx",
+		    pdp->pd_pa, pdp->pd_pa + pdp->pd_size - 1,
+		    pdp->pd_va, pdp->pd_va + pdp->pd_size - 1);
+
+		pmap_kenter_range(pdp->pd_va, pdp->pd_pa, pdp->pd_size,
+		    pdp->pd_prot, pdp->pd_flags);
+		done = true;
+	}
+	if (done)
+		pmap_devmap_bootstrap_done = true;
+}
+
+/*
+ * Find the table entry that fully covers the physical address
+ * range [pa, pa + size)
+ */
+const struct pmap_devmap *
+pmap_devmap_find_pa(paddr_t pa, psize_t size)
+{
+	if (pd_table == NULL)
+		return NULL;
+
+	for (size_t i = 0; pd_table[i].pd_size != 0; i++) {
+		const paddr_t pd_pa = pd_table[i].pd_pa;
+		const psize_t pd_sz = pd_table[i].pd_size;
+
+		if (pa < pd_pa)
+			continue;
+
+		const psize_t pdiff = pa - pd_pa;
+
+		if (pd_sz < pdiff)
+			continue;
+
+		if (pd_sz - pdiff >= size)
+			return &pd_table[i];
+	}
+
+	return NULL;
+}
+
+/*
+ * Find the table entry that fully covers the virtual address
+ * range [va, va + size)
+ */
+const struct pmap_devmap *
+pmap_devmap_find_va(vaddr_t va, vsize_t size)
+{
+	if (pd_table == NULL)
+		return NULL;
+
+	for (size_t i = 0; pd_table[i].pd_size != 0; i++) {
+		const vaddr_t pd_va = pd_table[i].pd_va;
+		const vsize_t pd_sz = pd_table[i].pd_size;
+
+		if (va < pd_va)
+			continue;
+
+		const vsize_t vdiff = va - pd_va;
+
+		if (pd_sz < vdiff)
+			continue;
+
+		if (pd_sz - vdiff >= size)
+			return &pd_table[i];
+
+	}
+
+	return NULL;
+}
Index: src/sys/uvm/pmap/pmap_devmap.h
diff -u /dev/null src/sys/uvm/pmap/pmap_devmap.h:1.1
--- /dev/null	Thu Apr 20 08:28:06 2023
+++ src/sys/uvm/pmap/pmap_devmap.h	Thu Apr 20 08:28:02 2023
@@ -0,0 +1,66 @@
+/*	$NetBSD: pmap_devmap.h,v 1.1 2023/04/20 08:28:02 skrll Exp $	*/
+
+/*-
+ * Copyright (c) 2022 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef	_UVM_PMAP_DEVMAP_H_
+#define	_UVM_PMAP_DEVMAP_H_
+
+typedef struct pmap_devmap {
+	vaddr_t		pd_va;		/* virtual address */
+	paddr_t		pd_pa;		/* physical address */
+	psize_t		pd_size;	/* size of region */
+	vm_prot_t	pd_prot;	/* protection code */
+	u_int		pd_flags;	/* flags for pmap_kenter_{pa,range} */
+} pmap_devmap_t;
+
+
+bool pmap_devmap_bootstrapped_p(void);
+void pmap_devmap_register(const struct pmap_devmap *);
+void pmap_devmap_bootstrap(vaddr_t, const struct pmap_devmap *);
+vaddr_t pmap_devmap_root(void);
+const struct pmap_devmap *pmap_devmap_find_pa(paddr_t, psize_t);
+const struct pmap_devmap *pmap_devmap_find_va(vaddr_t, vsize_t);
+
+#define	DEVMAP_ENTRY_FLAGS(va, pa, sz, fl)			\
+{								\
+	.pd_va = DEVMAP_ALIGN(va),				\
+	.pd_pa = DEVMAP_ALIGN(pa),				\
+	.pd_size = DEVMAP_SIZE(sz),				\
+	.pd_prot = VM_PROT_READ | VM_PROT_WRITE,		\
+	.pd_flags = (fl),					\
+}
+
+#define	DEVMAP_ENTRY(va, pa, sz)				\
+	DEVMAP_ENTRY_FLAGS(va, pa, sz, DEVMAP_FLAGS)
+
+#define	DEVMAP_ENTRY_END	{ 0 }
+
+#endif	/* _UVM_PMAP_DEVMAP_H_ */

Reply via email to