git: 120a5e3e195f - main - DMAP_TO_VM_PAGE: Wrapper macro to map direct map address to a page
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 23 Apr 2026 18:16:28 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=120a5e3e195f1f780d89ce689e23654422285d62
commit 120a5e3e195f1f780d89ce689e23654422285d62
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-04-23 17:05:55 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-04-23 17:05:55 +0000
DMAP_TO_VM_PAGE: Wrapper macro to map direct map address to a page
Effort: CHERI upstreaming
Suggested by: kib
Reviewed by: kib
Sponsored by: AFRL, DARPA
Pull Request: https://github.com/freebsd/freebsd-src/pull/2068
---
sys/amd64/amd64/pmap.c | 30 ++++++++++++++---------------
sys/arm64/arm64/pmap.c | 4 ++--
sys/compat/linuxkpi/common/src/linux_page.c | 2 +-
sys/kern/uipc_ktls.c | 2 +-
sys/powerpc/aim/mmu_radix.c | 6 +++---
sys/powerpc/booke/pmap_64.c | 10 +++++-----
sys/powerpc/powerpc/uma_machdep.c | 2 +-
sys/riscv/riscv/pmap.c | 4 ++--
sys/vm/vm_page.h | 2 ++
9 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 60a5b5a2da9a..6f8f767c40bd 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -4834,7 +4834,7 @@ pmap_release(pmap_t pmap)
KASSERT(CPU_EMPTY(&pmap->pm_active),
("releasing active pmap %p", pmap));
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_pmltop));
+ m = DMAP_TO_VM_PAGE(pmap->pm_pmltop);
if (pmap_is_la57(pmap)) {
for (i = NPML5EPG / 2; i < NPML5EPG; i++)
@@ -4863,7 +4863,7 @@ pmap_release(pmap_t pmap)
pmap_pt_page_count_pinit(pmap, -1);
if (pmap->pm_pmltopu != NULL) {
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_pmltopu));
+ m = DMAP_TO_VM_PAGE(pmap->pm_pmltopu);
pmap_free_pt_page(NULL, m, false);
pmap_pt_page_count_pinit(pmap, -1);
}
@@ -5348,7 +5348,7 @@ reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
PV_STAT(counter_u64_add(pc_chunk_count, -1));
PV_STAT(counter_u64_add(pc_chunk_frees, 1));
/* Entire chunk is free; return it. */
- m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m_pc = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m_pc->phys_addr);
mtx_lock(&pvc->pvc_lock);
TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
@@ -5449,7 +5449,7 @@ free_pv_chunk_dequeued(struct pv_chunk *pc)
PV_STAT(counter_u64_add(pc_chunk_frees, 1));
counter_u64_add(pv_page_count, -1);
/* entire chunk is free, return it */
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m->phys_addr);
vm_page_unwire_noq(m);
vm_page_free(m);
@@ -10711,7 +10711,7 @@ retry:
goto retry;
mphys = VM_PAGE_TO_PHYS(m);
*pde = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
- PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde))->ref_count++;
+ DMAP_TO_VM_PAGE(pde)->ref_count++;
} else {
MPASS((*pde & X86_PG_PS) == 0);
mphys = *pde & PG_FRAME;
@@ -10829,7 +10829,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
*pde = pa | pg_g | X86_PG_PS | X86_PG_RW |
X86_PG_V | X86_PG_A | pg_nx |
pmap_cache_bits(kernel_pmap, mattr, true);
- PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde))->ref_count++;
+ DMAP_TO_VM_PAGE(pde)->ref_count++;
inc = NBPDR;
} else {
pte = pmap_large_map_pte(va);
@@ -10837,7 +10837,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
*pte = pa | pg_g | X86_PG_RW | X86_PG_V |
X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap,
mattr, false);
- PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte))->ref_count++;
+ DMAP_TO_VM_PAGE(pte)->ref_count++;
inc = PAGE_SIZE;
}
}
@@ -10905,7 +10905,7 @@ pmap_large_unmap(void *svaa, vm_size_t len)
pd, len));
pde_store(pde, 0);
inc = NBPDR;
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
+ m = DMAP_TO_VM_PAGE(pde);
m->ref_count--;
if (m->ref_count == 0) {
*pdpe = 0;
@@ -10919,12 +10919,12 @@ pmap_large_unmap(void *svaa, vm_size_t len)
(u_long)pte, *pte));
pte_clear(pte);
inc = PAGE_SIZE;
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
+ m = DMAP_TO_VM_PAGE(pte);
m->ref_count--;
if (m->ref_count == 0) {
*pde = 0;
SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
+ m = DMAP_TO_VM_PAGE(pde);
m->ref_count--;
if (m->ref_count == 0) {
*pdpe = 0;
@@ -11227,7 +11227,7 @@ pmap_pti_wire_pte(void *pte)
vm_page_t m;
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
+ m = DMAP_TO_VM_PAGE(pte);
m->ref_count++;
}
@@ -11237,7 +11237,7 @@ pmap_pti_unwire_pde(void *pde, bool only_ref)
vm_page_t m;
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
+ m = DMAP_TO_VM_PAGE(pde);
MPASS(only_ref || m->ref_count > 1);
pmap_pti_free_page(m);
}
@@ -11249,7 +11249,7 @@ pmap_pti_unwire_pte(void *pte, vm_offset_t va)
pd_entry_t *pde;
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
+ m = DMAP_TO_VM_PAGE(pte);
if (pmap_pti_free_page(m)) {
pde = pmap_pti_pde(va);
MPASS((*pde & (X86_PG_PS | X86_PG_V)) == X86_PG_V);
@@ -12343,8 +12343,8 @@ DB_SHOW_COMMAND(ptpages, pmap_ptpages)
ptpages_show_pml4(pg, NPML4EPG, PG_V);
}
} else {
- ptpages_show_pml4(PHYS_TO_VM_PAGE(DMAP_TO_PHYS(
- pmap->pm_pmltop)), NUP4ML4E, PG_V);
+ ptpages_show_pml4(DMAP_TO_VM_PAGE(pmap->pm_pmltop), NUP4ML4E,
+ PG_V);
}
}
#endif
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index 4e216ea01ab5..a0f8bbb4bed0 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -3459,7 +3459,7 @@ reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
/* Entire chunk is free; return it. */
- m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m_pc = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m_pc->phys_addr);
mtx_lock(&pvc->pvc_lock);
TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
@@ -3561,7 +3561,7 @@ free_pv_chunk_dequeued(struct pv_chunk *pc)
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
/* entire chunk is free, return it */
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m->phys_addr);
vm_page_unwire_noq(m);
vm_page_free(m);
diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c
index 39edb34545b7..b91115a5ff16 100644
--- a/sys/compat/linuxkpi/common/src/linux_page.c
+++ b/sys/compat/linuxkpi/common/src/linux_page.c
@@ -241,7 +241,7 @@ linux_free_kmem(vm_offset_t addr, unsigned int order)
} else {
vm_page_t page;
- page = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(addr));
+ page = DMAP_TO_VM_PAGE(addr);
linux_free_pages(page, order);
}
}
diff --git a/sys/kern/uipc_ktls.c b/sys/kern/uipc_ktls.c
index 5e8bf3ba8a5d..41b18b29929b 100644
--- a/sys/kern/uipc_ktls.c
+++ b/sys/kern/uipc_ktls.c
@@ -461,7 +461,7 @@ ktls_buffer_release(void *arg __unused, void **store, int count)
int i, j;
for (i = 0; i < count; i++) {
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(store[i]));
+ m = DMAP_TO_VM_PAGE(store[i]);
for (j = 0; j < atop(ktls_maxlen); j++) {
(void)vm_page_unwire_noq(m + j);
vm_page_free(m + j);
diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c
index 63159107d856..dd3cb5128fd2 100644
--- a/sys/powerpc/aim/mmu_radix.c
+++ b/sys/powerpc/aim/mmu_radix.c
@@ -1497,7 +1497,7 @@ reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
/* Entire chunk is free; return it. */
- m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m_pc = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m_pc->phys_addr);
mtx_lock(&pv_chunks_mutex);
TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
@@ -1587,7 +1587,7 @@ free_pv_chunk(struct pv_chunk *pc)
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
/* entire chunk is free, return it */
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m->phys_addr);
vm_page_unwire_noq(m);
vm_page_free(m);
@@ -3649,7 +3649,7 @@ radix_pgd_release(void *arg __unused, void **store, int count)
* XXX selectively remove dmap and KVA entries so we don't
* need to bzero
*/
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(store[i]));
+ m = DMAP_TO_VM_PAGE(store[i]);
for (int j = page_count-1; j >= 0; j--) {
vm_page_unwire_noq(&m[j]);
SLIST_INSERT_HEAD(&free, &m[j], plinks.s.ss);
diff --git a/sys/powerpc/booke/pmap_64.c b/sys/powerpc/booke/pmap_64.c
index 6e08103f315c..08449b9407ae 100644
--- a/sys/powerpc/booke/pmap_64.c
+++ b/sys/powerpc/booke/pmap_64.c
@@ -275,7 +275,7 @@ get_pgtbl_page(pmap_t pmap, void **ptr_tbl, uint32_t index,
}
return (page);
}
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(page));
+ m = DMAP_TO_VM_PAGE(page);
page = ptr_tbl[index];
vm_page_unwire_noq(m);
vm_page_free_zero(m);
@@ -339,19 +339,19 @@ ptbl_unhold(pmap_t pmap, vm_offset_t va)
ptbl = pdir[pdir_idx];
/* decrement hold count */
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(ptbl));
+ m = DMAP_TO_VM_PAGE(ptbl);
if (!unhold_free_page(pmap, m))
return (0);
pdir[pdir_idx] = NULL;
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pdir));
+ m = DMAP_TO_VM_PAGE(pdir);
if (!unhold_free_page(pmap, m))
return (1);
pdir_l1[pdir_l1_idx] = NULL;
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pdir_l1));
+ m = DMAP_TO_VM_PAGE(pdir_l1);
if (!unhold_free_page(pmap, m))
return (1);
@@ -372,7 +372,7 @@ ptbl_hold(pmap_t pmap, pte_t *ptbl)
KASSERT((pmap != kernel_pmap),
("ptbl_hold: holding kernel ptbl!"));
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(ptbl));
+ m = DMAP_TO_VM_PAGE(ptbl);
m->ref_count++;
}
diff --git a/sys/powerpc/powerpc/uma_machdep.c b/sys/powerpc/powerpc/uma_machdep.c
index f5e3b8b3356d..637690b52695 100644
--- a/sys/powerpc/powerpc/uma_machdep.c
+++ b/sys/powerpc/powerpc/uma_machdep.c
@@ -80,7 +80,7 @@ uma_small_free(void *mem, vm_size_t size, u_int8_t flags)
vm_page_t m;
if (hw_direct_map)
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(mem));
+ m = DMAP_TO_VM_PAGE(mem);
else {
m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)mem));
pmap_kremove((vm_offset_t)mem);
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index a49265250850..0cac747334a9 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -1924,7 +1924,7 @@ pmap_release(pmap_t pmap)
finish:
npages = pmap->pm_stage == PM_STAGE2 ? 4 : 1;
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_top));
+ m = DMAP_TO_VM_PAGE(pmap->pm_top);
for (i = 0; i < npages; i++) {
vm_page_unwire_noq(m);
vm_page_free(m);
@@ -2132,7 +2132,7 @@ free_pv_chunk(struct pv_chunk *pc)
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
/* entire chunk is free, return it */
- m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
+ m = DMAP_TO_VM_PAGE(pc);
dump_drop_page(m->phys_addr);
vm_page_unwire_noq(m);
vm_page_free(m);
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index a091310ffd17..d0c1027a5f40 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -461,6 +461,8 @@ extern long first_page; /* first physical page number */
*/
vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa);
+#define DMAP_TO_VM_PAGE(va) PHYS_TO_VM_PAGE(DMAP_TO_PHYS(va))
+
/*
* vm_page allocation arguments for the functions vm_page_alloc(),
* vm_page_alloc_contig(), vm_page_alloc_noobj(), vm_page_grab(), and