Re: git: fe9f0b18bf6a - main - busdma: Use char * instead of vm_offset_t for bounce page kernel pointers

From: Jessica Clarke <jrtc27_at_freebsd.org>
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