Author: nwhitehorn
Date: Fri Apr  9 01:14:11 2010
New Revision: 206405
URL: http://svn.freebsd.org/changeset/base/206405

Log:
  Fix a bug where bus_dma_load_xxx() would not bounce misaligned buffers
  due to rounding the buffer's physical address to the beginning of its
  page. This fixes a panic in arge(4) when using PPPoE.
  
  Reported by:  Jakob van Santen <vansanten at wisc dot edu>
  Reviewed by:  gonzo
  Obtained from:        amd64

Modified:
  head/sys/mips/mips/busdma_machdep.c

Modified: head/sys/mips/mips/busdma_machdep.c
==============================================================================
--- head/sys/mips/mips/busdma_machdep.c Thu Apr  8 19:34:55 2010        
(r206404)
+++ head/sys/mips/mips/busdma_machdep.c Fri Apr  9 01:14:11 2010        
(r206405)
@@ -687,16 +687,21 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
                 * Count the number of bounce pages
                 * needed in order to complete this transfer
                 */
-               vaddr = trunc_page((vm_offset_t)buf);
+               vaddr = (vm_offset_t)buf;
                vendaddr = (vm_offset_t)buf + buflen;
 
                while (vaddr < vendaddr) {
+                       bus_size_t sg_len;
+
                        KASSERT(kernel_pmap == pmap, ("pmap is not kernel 
pmap"));
+                       sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK);
                        paddr = pmap_kextract(vaddr);
                        if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) &&
-                           run_filter(dmat, paddr) != 0)
+                           run_filter(dmat, paddr) != 0) {
+                               sg_len = roundup2(sg_len, dmat->alignment);
                                map->pagesneeded++;
-                       vaddr += PAGE_SIZE;
+                       }
+                       vaddr += sg_len;
                }
                CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded);
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to