summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>1998-12-14 05:35:56 +0000
committerdillon <dillon@FreeBSD.org>1998-12-14 05:35:56 +0000
commit19dc26453832cbafa406f981d7c9bc0a442ddb08 (patch)
tree9dfcf4a0404244786d664fe6b1909f1d9b08a0d8 /sys/amd64
parent2d7053a5cccfba39ef4fc12a781d476cf49c86f9 (diff)
downloadFreeBSD-src-19dc26453832cbafa406f981d7c9bc0a442ddb08.zip
FreeBSD-src-19dc26453832cbafa406f981d7c9bc0a442ddb08.tar.gz
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.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/busdma_machdep.c67
1 files changed, 37 insertions, 30 deletions
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 <sys/param.h>
@@ -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",
OpenPOWER on IntegriCloud