From 56a4dfb98103bbb0b4d95bc28d1893a14e77ad5a Mon Sep 17 00:00:00 2001 From: Maxime Henrion Date: Sat, 12 Mar 2005 02:43:50 +0000 Subject: [PATCH] Fix a long-standing bug in alpha's implementation of busdma. We need to OR the physical address with alpha_XXX_dmamap_or to get the DMA address, like the name of the variable suggests. However, while we were doing this correctly in the alpha_XXX_dmamap() macro, the busdma code added the variable to the physical address instead of or'ing it. Fortunately and if my math is not entirely wrong, you would need more than 128GB of RAM and a device able to do DMA in 64bits to experience the bug. Spotted by: cognet --- sys/alpha/alpha/busdma_machdep.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/alpha/alpha/busdma_machdep.c b/sys/alpha/alpha/busdma_machdep.c index 1ecc896dbdf9..f2aa85994bbb 100644 --- a/sys/alpha/alpha/busdma_machdep.c +++ b/sys/alpha/alpha/busdma_machdep.c @@ -578,7 +578,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, } if (sg->ds_len == 0) { - sg->ds_addr = paddr + alpha_XXX_dmamap_or; + sg->ds_addr = paddr | alpha_XXX_dmamap_or; sg->ds_len = size; } else if (paddr == nextpaddr) { sg->ds_len += size; @@ -588,7 +588,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, seg++; if (seg > dmat->nsegments) break; - sg->ds_addr = paddr + alpha_XXX_dmamap_or; + sg->ds_addr = paddr | alpha_XXX_dmamap_or; sg->ds_len = size; } vaddr += size; @@ -668,7 +668,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, * previous segment if possible. */ if (first) { - segs[seg].ds_addr = curaddr + alpha_XXX_dmamap_or; + segs[seg].ds_addr = curaddr | alpha_XXX_dmamap_or; segs[seg].ds_len = sgsize; first = 0; } else { @@ -680,7 +680,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, else { if (++seg >= dmat->nsegments) break; - segs[seg].ds_addr = curaddr + alpha_XXX_dmamap_or; + segs[seg].ds_addr = curaddr | alpha_XXX_dmamap_or; segs[seg].ds_len = sgsize; } }