Re: git: fe9f0b18bf6a - main - busdma: Use char * instead of vm_offset_t for bounce page kernel pointers
Date: Tue, 28 Apr 2026 18:49:24 UTC
Jessica
> On 28 Apr 2026, at 19:43, Oliver Pinter <oliver.pntr@gmail.com> wrote:
>
>
>
> On Thursday, April 23, 2026, John Baldwin <jhb@freebsd.org <mailto:jhb@freebsd.org>> wrote:
>> The branch main has been updated by jhb:
>>
>> URL: https://cgit.FreeBSD.org/src/commit/?id=fe9f0b18bf6a1f881fbe57da716ea429acd539c1 <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"));
>
> These hunks looks different from the commit message.
|= isn’t defined for pointers, but += is, and they’re equivalent
since the LHS is page aligned and the RHS is a page offset.
Jessica