From 19dc26453832cbafa406f981d7c9bc0a442ddb08 Mon Sep 17 00:00:00 2001 From: dillon Date: Mon, 14 Dec 1998 05:35:56 +0000 Subject: author was assuming that nextpaddr declared *inside* the do loop would survive within the loop. This is not guarenteed by C. I have moved the nextpaddr declaration to outside the do loop. --- sys/amd64/amd64/busdma_machdep.c | 67 ++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 30 deletions(-) (limited to 'sys/amd64') diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index d35967e..30571e5 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: busdma_machdep.c,v 1.10 1998/10/07 03:38:14 gibbs Exp $ + * $Id: busdma_machdep.c,v 1.11 1998/10/13 08:24:33 dg Exp $ */ #include @@ -435,38 +435,45 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, seg = 1; sg->ds_len = 0; - do { - bus_size_t size; - vm_offset_t nextpaddr; /* GCC warning expected */ + { + /* + * note: nextpaddr not used on first loop + */ + vm_offset_t nextpaddr = 0; - paddr = pmap_kextract(vaddr); - size = PAGE_SIZE - (paddr & PAGE_MASK); - if (size > buflen) - size = buflen; + do { + bus_size_t size; - if (map->pagesneeded != 0 - && run_filter(dmat, paddr)) { - paddr = add_bounce_page(dmat, map, vaddr, size); - } + paddr = pmap_kextract(vaddr); + size = PAGE_SIZE - (paddr & PAGE_MASK); + if (size > buflen) + size = buflen; + + if (map->pagesneeded != 0 + && run_filter(dmat, paddr)) { + paddr = add_bounce_page(dmat, map, + vaddr, size); + } - if (sg->ds_len == 0) { - sg->ds_addr = paddr; - sg->ds_len = size; - } else if (paddr == nextpaddr) { - sg->ds_len += size; - } else { - /* Go to the next segment */ - sg++; - seg++; - if (seg > dmat->nsegments) - break; - sg->ds_addr = paddr; - sg->ds_len = size; - } - vaddr += size; - nextpaddr = paddr + size; - buflen -= size; - } while (buflen > 0); + if (sg->ds_len == 0) { + sg->ds_addr = paddr; + sg->ds_len = size; + } else if (paddr == nextpaddr) { + sg->ds_len += size; + } else { + /* Go to the next segment */ + sg++; + seg++; + if (seg > dmat->nsegments) + break; + sg->ds_addr = paddr; + sg->ds_len = size; + } + vaddr += size; + nextpaddr = paddr + size; + buflen -= size; + } while (buflen > 0); + } if (buflen != 0) { printf("bus_dmamap_load: Too many segs! buf_len = 0x%lx\n", -- cgit v1.1