git: fe9f0b18bf6a - main - busdma: Use char * instead of vm_offset_t for bounce page kernel pointers
Date: Thu, 23 Apr 2026 18:16:08 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=fe9f0b18bf6a1f881fbe57da716ea429acd539c1
commit fe9f0b18bf6a1f881fbe57da716ea429acd539c1
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-04-23 17:05:53 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-04-23 17:05:53 +0000
busdma: Use char * instead of vm_offset_t for bounce page kernel pointers
Effort: CHERI upstreaming
Reviewed by: kib
Sponsored by: AFRL, DARPA
Pull Request: https://github.com/freebsd/freebsd-src/pull/2068
---
sys/arm/arm/busdma_machdep.c | 18 ++++++++----------
sys/arm64/arm64/busdma_bounce.c | 18 ++++++++----------
sys/kern/subr_busdma_bounce.c | 30 +++++++++++++++---------------
sys/powerpc/powerpc/busdma_machdep.c | 20 +++++++++-----------
sys/riscv/riscv/busdma_bounce.c | 18 ++++++++----------
sys/x86/x86/busdma_bounce.c | 26 +++++++++++---------------
6 files changed, 59 insertions(+), 71 deletions(-)
diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c
index 3c65cb8ebbf4..81b8b4a2883a 100644
--- a/sys/arm/arm/busdma_machdep.c
+++ b/sys/arm/arm/busdma_machdep.c
@@ -1002,7 +1002,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
if (map->pagesneeded != 0 && must_bounce(dmat, map, curaddr,
sgsize)) {
- curaddr = add_bounce_page(dmat, map, (vm_offset_t)kvaddr, curaddr,
+ curaddr = add_bounce_page(dmat, map, kvaddr, curaddr,
sgsize);
} else if ((dmat->flags & BUS_DMA_COHERENT) == 0) {
if (map->sync_count > 0) {
@@ -1199,18 +1199,17 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_PREWRITE) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy(datavaddr, (void *)bpage->vaddr,
- bpage->datacount);
+ bcopy(datavaddr, bpage->vaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
if ((dmat->flags & BUS_DMA_COHERENT) == 0)
- dcache_wb_poc(bpage->vaddr,
+ dcache_wb_poc((vm_offset_t)bpage->vaddr,
bpage->busaddr, bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -1232,7 +1231,7 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
bpage = STAILQ_FIRST(&map->bpages);
while (bpage != NULL) {
if ((dmat->flags & BUS_DMA_COHERENT) == 0)
- dcache_inv_poc_dma(bpage->vaddr,
+ dcache_inv_poc_dma((vm_offset_t)bpage->vaddr,
bpage->busaddr, bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -1250,17 +1249,16 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_POSTREAD) {
while (bpage != NULL) {
if ((dmat->flags & BUS_DMA_COHERENT) == 0)
- dcache_inv_poc(bpage->vaddr,
+ dcache_inv_poc((vm_offset_t)bpage->vaddr,
bpage->busaddr, bpage->datacount);
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy((void *)bpage->vaddr, datavaddr,
- bpage->datacount);
+ bcopy(bpage->vaddr, datavaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
bpage = STAILQ_NEXT(bpage, links);
diff --git a/sys/arm64/arm64/busdma_bounce.c b/sys/arm64/arm64/busdma_bounce.c
index ad46e26e406f..74fa611e6d1a 100644
--- a/sys/arm64/arm64/busdma_bounce.c
+++ b/sys/arm64/arm64/busdma_bounce.c
@@ -868,7 +868,7 @@ bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
KASSERT(dmat->common.alignment <= PAGE_SIZE,
("bounced buffer cannot have alignment bigger "
"than PAGE_SIZE: %lu", dmat->common.alignment));
- curaddr = add_bounce_page(dmat, map, (vm_offset_t)kvaddr, curaddr,
+ curaddr = add_bounce_page(dmat, map, kvaddr, curaddr,
sgsize);
} else if ((map->flags & DMAMAP_COHERENT) == 0) {
if (map->sync_count > 0) {
@@ -1047,19 +1047,18 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
if ((op & BUS_DMASYNC_PREWRITE) != 0) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy(datavaddr,
- (void *)bpage->vaddr, bpage->datacount);
+ bcopy(datavaddr, bpage->vaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
if ((map->flags & DMAMAP_COHERENT) == 0)
- cpu_dcache_wb_range((void *)bpage->vaddr,
+ cpu_dcache_wb_range(bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -1067,7 +1066,7 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
} else if ((op & BUS_DMASYNC_PREREAD) != 0) {
while (bpage != NULL) {
if ((map->flags & DMAMAP_COHERENT) == 0)
- cpu_dcache_wbinv_range((void *)bpage->vaddr,
+ cpu_dcache_wbinv_range(bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -1076,18 +1075,17 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
if ((op & BUS_DMASYNC_POSTREAD) != 0) {
while (bpage != NULL) {
if ((map->flags & DMAMAP_COHERENT) == 0)
- cpu_dcache_inv_range((void *)bpage->vaddr,
+ cpu_dcache_inv_range(bpage->vaddr,
bpage->datacount);
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy((void *)bpage->vaddr,
- datavaddr, bpage->datacount);
+ bcopy(bpage->vaddr, datavaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
diff --git a/sys/kern/subr_busdma_bounce.c b/sys/kern/subr_busdma_bounce.c
index 60fe2fc6b2a6..2774128a1ae5 100644
--- a/sys/kern/subr_busdma_bounce.c
+++ b/sys/kern/subr_busdma_bounce.c
@@ -49,9 +49,9 @@
#include <sys/sched.h>
struct bounce_page {
- vm_offset_t vaddr; /* kva of bounce buffer */
+ char *vaddr; /* kva of bounce buffer */
bus_addr_t busaddr; /* Physical address */
- vm_offset_t datavaddr; /* kva of client data */
+ char *datavaddr; /* kva of client data */
#if defined(__amd64__) || defined(__i386__)
vm_page_t datapage[2]; /* physical page(s) of client data */
#else
@@ -282,18 +282,18 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages)
if (bpage == NULL)
break;
#ifdef dmat_domain
- bpage->vaddr = (vm_offset_t)contigmalloc_domainset(PAGE_SIZE,
+ bpage->vaddr = contigmalloc_domainset(PAGE_SIZE,
M_BOUNCE, DOMAINSET_PREF(bz->domain), M_NOWAIT,
0ul, bz->lowaddr, PAGE_SIZE, 0);
#else
- bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_BOUNCE,
+ bpage->vaddr = contigmalloc(PAGE_SIZE, M_BOUNCE,
M_NOWAIT, 0ul, bz->lowaddr, PAGE_SIZE, 0);
#endif
- if (bpage->vaddr == 0) {
+ if (bpage->vaddr == NULL) {
free(bpage, M_BUSDMA);
break;
}
- bpage->busaddr = pmap_kextract(bpage->vaddr);
+ bpage->busaddr = pmap_kextract((vm_offset_t)bpage->vaddr);
mtx_lock(&bounce_lock);
STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links);
total_bpages++;
@@ -327,11 +327,11 @@ reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit)
#if defined(__amd64__) || defined(__i386__)
static bus_addr_t
-add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
+add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, void *vaddr,
vm_paddr_t addr1, vm_paddr_t addr2, bus_size_t size)
#else
static bus_addr_t
-add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
+add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, void *vaddr,
bus_addr_t addr, bus_size_t size)
#endif
{
@@ -370,13 +370,13 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat_flags(dmat) & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
#if defined(__amd64__) || defined(__i386__)
- bpage->vaddr |= addr1 & PAGE_MASK;
- bpage->busaddr |= addr1 & PAGE_MASK;
+ bpage->vaddr += addr1 & PAGE_MASK;
+ bpage->busaddr += addr1 & PAGE_MASK;
KASSERT(addr2 == 0,
("Trying to bounce multiple pages with BUS_DMA_KEEP_PG_OFFSET"));
#else
- bpage->vaddr |= addr & PAGE_MASK;
- bpage->busaddr |= addr & PAGE_MASK;
+ bpage->vaddr += addr & PAGE_MASK;
+ bpage->busaddr += addr & PAGE_MASK;
#endif
}
bpage->datavaddr = vaddr;
@@ -409,7 +409,7 @@ free_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map)
count = 0;
schedule_thread = false;
STAILQ_FOREACH(bpage, &map->bpages, links) {
- bpage->datavaddr = 0;
+ bpage->datavaddr = NULL;
bpage->datacount = 0;
if (dmat_flags(dmat) & BUS_DMA_KEEP_PG_OFFSET) {
@@ -419,8 +419,8 @@ free_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map)
* store a full page of data and/or assume it
* starts on a page boundary.
*/
- bpage->vaddr &= ~PAGE_MASK;
- bpage->busaddr &= ~PAGE_MASK;
+ bpage->vaddr = trunc_page(bpage->vaddr);
+ bpage->busaddr = trunc_page(bpage->busaddr);
}
count++;
}
diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c
index 56feffde8b37..7fe2fd4ff986 100644
--- a/sys/powerpc/powerpc/busdma_machdep.c
+++ b/sys/powerpc/powerpc/busdma_machdep.c
@@ -613,7 +613,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
{
bus_size_t sgsize;
bus_addr_t curaddr;
- vm_offset_t kvaddr, vaddr;
+ char *kvaddr, *vaddr;
int error;
if (segs == NULL)
@@ -628,18 +628,18 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
}
}
- vaddr = (vm_offset_t)buf;
+ vaddr = buf;
while (buflen > 0) {
/*
* Get the physical address for this segment.
*/
if (pmap == kernel_pmap) {
- curaddr = pmap_kextract(vaddr);
+ curaddr = pmap_kextract((vm_offset_t)vaddr);
kvaddr = vaddr;
} else {
- curaddr = pmap_extract(pmap, vaddr);
- kvaddr = 0;
+ curaddr = pmap_extract(pmap, (vm_offset_t)vaddr);
+ kvaddr = NULL;
}
/*
@@ -733,7 +733,7 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_PREWRITE) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
@@ -741,8 +741,7 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
bpage->dataoffs;
}
- bcopy(datavaddr,
- (void *)bpage->vaddr, bpage->datacount);
+ bcopy(datavaddr, bpage->vaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
@@ -754,7 +753,7 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_POSTREAD) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
@@ -762,8 +761,7 @@ bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
bpage->dataoffs;
}
- bcopy((void *)bpage->vaddr,
- datavaddr, bpage->datacount);
+ bcopy(bpage->vaddr, datavaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
diff --git a/sys/riscv/riscv/busdma_bounce.c b/sys/riscv/riscv/busdma_bounce.c
index 0f2d592f4e52..452cead3c6b6 100644
--- a/sys/riscv/riscv/busdma_bounce.c
+++ b/sys/riscv/riscv/busdma_bounce.c
@@ -673,7 +673,7 @@ bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
addr_needs_bounce(dmat, curaddr)) {
sgsize = roundup2(sgsize, dmat->common.alignment);
sgsize = MIN(sgsize, buflen);
- curaddr = add_bounce_page(dmat, map, (vm_offset_t)kvaddr, curaddr,
+ curaddr = add_bounce_page(dmat, map, kvaddr, curaddr,
sgsize);
} else if ((dmat->bounce_flags & BF_COHERENT) == 0) {
if (map->sync_count > 0) {
@@ -850,19 +850,18 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
if ((op & BUS_DMASYNC_PREWRITE) != 0) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy(datavaddr,
- (void *)bpage->vaddr, bpage->datacount);
+ bcopy(datavaddr, bpage->vaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
if ((dmat->bounce_flags & BF_COHERENT) == 0)
- cpu_dcache_wb_range(bpage->vaddr,
+ cpu_dcache_wb_range((vm_offset_t)bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -870,7 +869,7 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
} else if ((op & BUS_DMASYNC_PREREAD) != 0) {
while (bpage != NULL) {
if ((dmat->bounce_flags & BF_COHERENT) == 0)
- cpu_dcache_wbinv_range(bpage->vaddr,
+ cpu_dcache_wbinv_range((vm_offset_t)bpage->vaddr,
bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
@@ -879,18 +878,17 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
if ((op & BUS_DMASYNC_POSTREAD) != 0) {
while (bpage != NULL) {
if ((dmat->bounce_flags & BF_COHERENT) == 0)
- cpu_dcache_inv_range(bpage->vaddr,
+ cpu_dcache_inv_range((vm_offset_t)bpage->vaddr,
bpage->datacount);
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
if (datavaddr == NULL) {
tempvaddr = pmap_quick_enter_page(
bpage->datapage);
datavaddr = tempvaddr + bpage->dataoffs;
}
- bcopy((void *)bpage->vaddr,
- datavaddr, bpage->datacount);
+ bcopy(bpage->vaddr, datavaddr, bpage->datacount);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
diff --git a/sys/x86/x86/busdma_bounce.c b/sys/x86/x86/busdma_bounce.c
index bc48c60448da..bd700d4d55be 100644
--- a/sys/x86/x86/busdma_bounce.c
+++ b/sys/x86/x86/busdma_bounce.c
@@ -687,7 +687,7 @@ bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
{
bus_size_t sgsize;
vm_paddr_t curaddr;
- vm_offset_t kvaddr, vaddr;
+ char *kvaddr, *vaddr;
int error;
if (map == NULL)
@@ -705,17 +705,17 @@ bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
}
}
- vaddr = (vm_offset_t)buf;
+ vaddr = buf;
while (buflen > 0) {
/*
* Get the physical address for this segment.
*/
if (pmap == kernel_pmap) {
- curaddr = pmap_kextract(vaddr);
+ curaddr = pmap_kextract((vm_offset_t)vaddr);
kvaddr = vaddr;
} else {
- curaddr = pmap_extract(pmap, vaddr);
- kvaddr = 0;
+ curaddr = pmap_extract(pmap, (vm_offset_t)vaddr);
+ kvaddr = NULL;
}
/*
@@ -879,7 +879,7 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
if ((op & BUS_DMASYNC_PREWRITE) != 0) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
datacount1 = bpage->datacount;
if (datavaddr == NULL) {
tempvaddr =
@@ -889,8 +889,7 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
datacount1);
}
- bcopy(datavaddr,
- (void *)bpage->vaddr, datacount1);
+ bcopy(datavaddr, bpage->vaddr, datacount1);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
@@ -907,8 +906,7 @@ bounce_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map,
*/
datavaddr = pmap_quick_enter_page(bpage->datapage[1]);
datacount2 = bpage->datacount - datacount1;
- bcopy(datavaddr,
- (void *)(bpage->vaddr + datacount1), datacount2);
+ bcopy(datavaddr, bpage->vaddr + datacount1, datacount2);
pmap_quick_remove_page(datavaddr);
next_w:
@@ -920,7 +918,7 @@ next_w:
if ((op & BUS_DMASYNC_POSTREAD) != 0) {
while (bpage != NULL) {
tempvaddr = NULL;
- datavaddr = (void *)bpage->datavaddr;
+ datavaddr = bpage->datavaddr;
datacount1 = bpage->datacount;
if (datavaddr == NULL) {
tempvaddr =
@@ -930,8 +928,7 @@ next_w:
datacount1);
}
- bcopy((void *)bpage->vaddr, datavaddr,
- datacount1);
+ bcopy(bpage->vaddr, datavaddr, datacount1);
if (tempvaddr != NULL)
pmap_quick_remove_page(tempvaddr);
@@ -948,8 +945,7 @@ next_w:
*/
datavaddr = pmap_quick_enter_page(bpage->datapage[1]);
datacount2 = bpage->datacount - datacount1;
- bcopy((void *)(bpage->vaddr + datacount1),
- datavaddr, datacount2);
+ bcopy(bpage->vaddr + datacount1, datavaddr, datacount2);
pmap_quick_remove_page(datavaddr);
next_r: