Index | Thread | Search

From:
Hans-Jörg Höxer <Hans-Joerg_Hoexer@genua.de>
Subject:
Re: fix bus_dmamap_destroy with bounce buffers
To:
Stefan Fritsch <sf@openbsd.org>
Cc:
<tech@openbsd.org>, <Hans-Joerg_Hoexer@genua.de>
Date:
Tue, 20 Aug 2024 13:15:08 +0200

Download raw body.

Thread
On Tue, Aug 20, 2024 at 09:55:59AM +0200, Stefan Fritsch wrote:
> Hi,
> 
> with bounce buffers, we must pass a larger size to free(). Otherwise 
> various drivers (azalia, xhci) cause a panic if bounce buffering is 
> enabled on KVM/qemu.
> 
> ok?

ok!

> Cheers,
> Stefan
> 
> diff --git a/sys/arch/amd64/amd64/bus_dma.c b/sys/arch/amd64/amd64/bus_dma.c
> index 6ad6583bce9..e758ea9ea05 100644
> --- a/sys/arch/amd64/amd64/bus_dma.c
> +++ b/sys/arch/amd64/amd64/bus_dma.c
> @@ -223,12 +223,18 @@ _bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
>  	size_t mapsize;
>  	struct vm_page **pg;
>  	struct pglist mlist;
> +	int use_bounce_buffer = cpu_sev_guestmode || FORCE_BOUNCE_BUFFER;
>  
>  	if (map->_dm_pgva) {
>  		km_free((void *)map->_dm_pgva, map->_dm_npages << PGSHIFT,
>  		    &kv_any, &kp_none);
>  	}
>  
> +	mapsize = sizeof(struct bus_dmamap) +
> +		(sizeof(bus_dma_segment_t) * (map->_dm_segcnt - 1));
> +	if (use_bounce_buffer)
> +		mapsize += sizeof(struct vm_page *) * map->_dm_npages;
> +
>  	if (map->_dm_pages) {
>  		TAILQ_INIT(&mlist);
>  		for (pg = map->_dm_pages; map->_dm_npages--; pg++) {
> @@ -237,8 +243,6 @@ _bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
>  		uvm_pglistfree(&mlist);
>  	}
>  
> -	mapsize = sizeof(struct bus_dmamap) +
> -		(sizeof(bus_dma_segment_t) * (map->_dm_segcnt - 1));
>  	free(map, M_DEVBUF, mapsize);
>  }
>  
> 

-- 
Dr. Hans-Jörg Höxer                   Hans-Joerg_Hoexer@genua.de
Senior Expert Kryptographie
eXtreme Kernel and Crypto Development

genua GmbH
Domagkstrasse 7, 85551 Kirchheim bei München
tel +49 89 991950-0, fax -999, www.genua.de

Geschäftsführer: Matthias Ochs, Marc Tesch
Amtsgericht München HRB 98238
genua ist ein Unternehmen der Bundesdruckerei-Gruppe.