Date: Thu, 23 Apr 2026 18:16:08 +0000 From: John Baldwin <jhb@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: fe9f0b18bf6a - main - busdma: Use char * instead of vm_offset_t for bounce page kernel pointers Message-ID: <69ea61e8.46e01.b303182@gitrepo.freebsd.org>
index | next in thread | raw e-mail
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:home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69ea61e8.46e01.b303182>
