Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Dec 2012 06:34:20 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r243973 - in projects/physbio/sys: arm/arm ia64/ia64 powerpc/powerpc sparc64/sparc64 x86/x86
Message-ID:  <201212070634.qB76YKu1035425@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Fri Dec  7 06:34:20 2012
New Revision: 243973
URL: http://svnweb.freebsd.org/changeset/base/243973

Log:
   - Normalize load_buffer() address space handling by always requiring a
     valid pmap pointer.
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  projects/physbio/sys/arm/arm/busdma_machdep-v6.c
  projects/physbio/sys/arm/arm/busdma_machdep.c
  projects/physbio/sys/ia64/ia64/busdma_machdep.c
  projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
  projects/physbio/sys/sparc64/sparc64/bus_machdep.c
  projects/physbio/sys/sparc64/sparc64/iommu.c
  projects/physbio/sys/x86/x86/busdma_machdep.c

Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -669,7 +669,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 		vendaddr = (vm_offset_t)buf + buflen;
 
 		while (vaddr < vendaddr) {
-			if (__predict_true(map->pmap == pmap_kernel()))
+			if (__predict_true(map->pmap == kernel_pmap))
 				paddr = pmap_kextract(vaddr);
 			else
 				paddr = pmap_extract(map->pmap, vaddr);
@@ -718,6 +718,7 @@ static __inline int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
 			bus_dmamap_t map,
 			void *buf, bus_size_t buflen,
+			pmap_t pmap,
 			int flags,
 			bus_dma_segment_t *segs,
 			int *segp)
@@ -737,12 +738,13 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 	sl = NULL;
 	vaddr = (vm_offset_t)buf;
 	bmask = ~(dmat->boundary - 1);
+	map->pmap = pmap;
 
 	for (seg = *segp; buflen > 0 ; ) {
 		/*
 		 * Get the physical address for this segment.
 		 */
-		if (__predict_true(map->pmap == pmap_kernel()))
+		if (__predict_true(map->pmap == kernel_pmap))
 			curaddr = pmap_kextract(vaddr);
 		else
 			curaddr = pmap_extract(map->pmap, vaddr);
@@ -848,10 +850,9 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	flags |= BUS_DMA_WAITOK;
 	map->callback = callback;
 	map->callback_arg = callback_arg;
-	map->pmap = kernel_pmap;
 
-	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, flags,
-		     dmat->segments, &nsegs);
+	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
+	    flags, dmat->segments, &nsegs);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -887,7 +888,6 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 	int error;
 
 	M_ASSERTPKTHDR(m0);
-	map->pmap = kernel_pmap;
 
 	flags |= BUS_DMA_NOWAIT;
 	*nsegs = -1;
@@ -899,7 +899,8 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
-						flags, segs, nsegs);
+						kernel_pmap, flags, segs,
+						nsegs);
 			}
 		}
 	} else {
@@ -957,6 +958,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
+	pmap_t pmap;
 
 	flags |= BUS_DMA_NOWAIT;
 	resid = uio->uio_resid;
@@ -965,9 +967,9 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	if (uio->uio_segflg == UIO_USERSPACE) {
 		KASSERT(uio->uio_td != NULL,
 			("bus_dmamap_load_uio: USERSPACE but no proc"));
-		map->pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
+		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
 	} else
-		map->pmap = kernel_pmap;
+		pmap = kernel_pmap;
 
 	nsegs = -1;
 	error = 0;
@@ -982,7 +984,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 
 		if (minlen > 0) {
 			error = _bus_dmamap_load_buffer(dmat, map,
-					addr, minlen, flags,
+					addr, minlen, pmap, flags,
 					dmat->segments, &nsegs);
 			resid -= minlen;
 		}

Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -710,7 +710,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 		vendaddr = (vm_offset_t)buf + buflen;
 
 		while (vaddr < vendaddr) {
-			if (__predict_true(pmap == pmap_kernel()))
+			if (__predict_true(pmap == kernel_pmap))
 				paddr = pmap_kextract(vaddr);
 			else
 				paddr = pmap_extract(pmap, vaddr);
@@ -781,7 +781,7 @@ bus_dmamap_load_buffer(bus_dma_tag_t dma
 		 * XXX Don't support checking for coherent mappings
 		 * XXX in user address space.
 		 */
-		if (__predict_true(pmap == pmap_kernel())) {
+		if (__predict_true(pmap == kernel_pmap)) {
 			if (pmap_get_pde_pte(pmap, vaddr, &pde, &ptep) == FALSE)
 				return (EFAULT);
 
@@ -951,7 +951,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 			if (m->m_len > 0) {
 				error = bus_dmamap_load_buffer(dmat,
 				    dmat->segments, map, m->m_data, m->m_len,
-				    pmap_kernel(), flags, &nsegs);
+				    kernel_pmap, flags, &nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -995,7 +995,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 			if (m->m_len > 0) {
 				error = bus_dmamap_load_buffer(dmat, segs, map,
 						m->m_data, m->m_len,
-						pmap_kernel(), flags,
+						kernel_pmap, flags,
 						nsegs);
 				map->len += m->m_len;
 			}

Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -486,7 +486,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
  */
 static int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
-    bus_size_t buflen, struct thread *td, int flags,
+    bus_size_t buflen, pmap_t pmap, int flags,
     bus_dma_segment_t *segs, int *segp)
 {
 	bus_size_t sgsize;
@@ -494,16 +494,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 	vm_offset_t vaddr;
 	bus_addr_t paddr;
 	int seg;
-	pmap_t pmap;
 
 	if (map == NULL)
 		map = &nobounce_dmamap;
 
-	if (td != NULL)
-		pmap = vmspace_pmap(td->td_proc->p_vmspace);
-	else
-		pmap = NULL;
-
 	if ((dmat->lowaddr < paddr_max || dmat->boundary > 0 ||
 	    dmat->alignment > 1) && map != &nobounce_dmamap &&
 	    map->pagesneeded == 0) {
@@ -517,10 +511,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		vendaddr = (vm_offset_t)buf + buflen;
 
 		while (vaddr < vendaddr) {
-			if (pmap != NULL)
-				paddr = pmap_extract(pmap, vaddr);
-			else
+			if (pmap == kernel_pmap)
 				paddr = pmap_kextract(vaddr);
+			else
+				paddr = pmap_extract(pmap, vaddr);
 			if (run_filter(dmat, paddr, 0) != 0)
 				map->pagesneeded++;
 			vaddr += PAGE_SIZE;
@@ -558,10 +552,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		/*
 		 * Get the physical address for this segment.
 		 */
-		if (pmap)
-			curaddr = pmap_extract(pmap, vaddr);
-		else
+		if (pmap == kernel_pmap)
 			curaddr = pmap_kextract(vaddr);
+		else
+			curaddr = pmap_extract(pmap, vaddr);
 
 		/*
 		 * Compute the segment size, and adjust counts.
@@ -634,8 +628,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		map->callback_arg = callback_arg;
 	}
 
-	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	    dmat->segments, &nsegs);
+	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
+	    flags, dmat->segments, &nsegs);
 
 	if (error == EINPROGRESS)
 		return (error);
@@ -668,7 +662,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
-				    m->m_data, m->m_len, NULL, flags,
+				    m->m_data, m->m_len, kernel_pmap, flags,
 				    dmat->segments, &nsegs);
 			}
 		}
@@ -703,7 +697,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
-				    m->m_data, m->m_len, NULL, flags,
+				    m->m_data, m->m_len, kernel_pmap, flags,
 				    segs, nsegs);
 			}
 		}
@@ -725,17 +719,18 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
-	struct thread *td = NULL;
+	pmap_t pmap;
 
 	flags |= BUS_DMA_NOWAIT;
 	resid = uio->uio_resid;
 	iov = uio->uio_iov;
 
 	if (uio->uio_segflg == UIO_USERSPACE) {
-		td = uio->uio_td;
+		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
 		KASSERT(td != NULL,
 			("bus_dmamap_load_uio: USERSPACE but no proc"));
-	}
+	} else
+		pmap = kernel_pmap;
 
 	nsegs = -1;
 	error = 0;

Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -601,10 +601,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 			bus_size_t sg_len;
 
 			sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK);
-			if (pmap)
-				paddr = pmap_extract(pmap, vaddr);
-			else
+			if (pmap == kernel_pmap)
 				paddr = pmap_kextract(vaddr);
+			else
+				paddr = pmap_extract(pmap, vaddr);
 			if (run_filter(dmat, paddr) != 0) {
 				sg_len = roundup2(sg_len, dmat->alignment);
 				map->pagesneeded++;
@@ -646,10 +646,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		/*
 		 * Get the physical address for this segment.
 		 */
-		if (pmap)
-			curaddr = pmap_extract(pmap, vaddr);
-		else
+		if (pmap == kernel_pmap)
 			curaddr = pmap_kextract(vaddr);
+		else
+			curaddr = pmap_extract(pmap, vaddr);
 
 		/*
 		 * Compute the segment size, and adjust counts.
@@ -724,8 +724,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	}
 
 	map->nsegs = -1;
-	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     map->segments, &map->nsegs);
+	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
+	    flags, map->segments, &map->nsegs);
 	map->nsegs++;
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
@@ -779,7 +779,7 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
-						NULL, flags,
+						kernel_pmap, flags,
 						map->segments, &map->nsegs);
 			}
 		}
@@ -824,7 +824,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
-						NULL, flags,
+						kernel_pmap, flags,
 						segs, nsegs);
 			}
 		}
@@ -871,7 +871,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 			("bus_dmamap_load_uio: USERSPACE but no proc"));
 		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
 	} else
-		pmap = NULL;
+		pmap = kernel_pmap;
 
 	map->nsegs = -1;
 	error = 0;

Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -331,19 +331,13 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat,
  */
 static int
 _nexus_dmamap_load_buffer(bus_dma_tag_t dmat, void *buf, bus_size_t buflen,
-    struct thread *td, int flags,
+    pmap_t pmap, int flags,
     bus_dma_segment_t *segs, int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
 	vm_offset_t vaddr = (vm_offset_t)buf;
 	int seg;
-	pmap_t pmap;
-
-	if (td != NULL)
-		pmap = vmspace_pmap(td->td_proc->p_vmspace);
-	else
-		pmap = NULL;
 
 	bmask  = ~(dmat->dt_boundary - 1);
 
@@ -351,10 +345,10 @@ _nexus_dmamap_load_buffer(bus_dma_tag_t 
 		/*
 		 * Get the physical address for this segment.
 		 */
-		if (pmap)
-			curaddr = pmap_extract(pmap, vaddr);
-		else
+		if (pmap == kernel_pmap)
 			curaddr = pmap_kextract(vaddr);
+		else
+			curaddr = pmap_extract(pmap, vaddr);
 
 		/*
 		 * Compute the segment size, and adjust counts.
@@ -426,8 +420,8 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu
 	int error, nsegs;
 
 	nsegs = -1;
-	error = _nexus_dmamap_load_buffer(dmat, buf, buflen, NULL, flags,
-	    dmat->dt_segments, &nsegs);
+	error = _nexus_dmamap_load_buffer(dmat, buf, buflen, kernel_pmap,
+	    flags, dmat->dt_segments, &nsegs);
 
 	if (error == 0) {
 		(*callback)(callback_arg, dmat->dt_segments, nsegs + 1, 0);
@@ -457,7 +451,7 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _nexus_dmamap_load_buffer(dmat,
-				    m->m_data, m->m_len,NULL, flags,
+				    m->m_data, m->m_len, kernel_pmap, flags,
 				    dmat->dt_segments, &nsegs);
 			}
 		}
@@ -492,7 +486,7 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
 				error = _nexus_dmamap_load_buffer(dmat,
-				    m->m_data, m->m_len, NULL, flags,
+				    m->m_data, m->m_len, kernel_pmap, flags,
 				    segs, nsegs);
 			}
 		}
@@ -514,15 +508,15 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 	int nsegs, error, i;
 	bus_size_t resid;
 	struct iovec *iov;
-	struct thread *td = NULL;
+	pmap_t pmap;
 
 	resid = uio->uio_resid;
 	iov = uio->uio_iov;
 
 	if (uio->uio_segflg == UIO_USERSPACE) {
-		td = uio->uio_td;
-		KASSERT(td != NULL, ("%s: USERSPACE but no proc", __func__));
-	}
+		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
+	} else
+		pmap = kernel_pmap;
 
 	nsegs = -1;
 	error = 0;
@@ -537,7 +531,7 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 
 		if (minlen > 0) {
 			error = _nexus_dmamap_load_buffer(dmat, addr, minlen,
-			    td, flags, dmat->dt_segments, &nsegs);
+			    pmap, flags, dmat->dt_segments, &nsegs);
 			resid -= minlen;
 		}
 	}

Modified: projects/physbio/sys/sparc64/sparc64/iommu.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -851,14 +851,13 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, 
  */
 static int
 iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct thread *td,
+    bus_dmamap_t map, void *buf, bus_size_t buflen, pmap_t pmap,
     int flags, bus_dma_segment_t *segs, int *segp)
 {
 	bus_addr_t amask, dvmaddr, dvmoffs;
 	bus_size_t sgsize, esize;
 	vm_offset_t vaddr, voffs;
 	vm_paddr_t curaddr;
-	pmap_t pmap = NULL;
 	int error, firstpg, sgcnt;
 	u_int slot;
 
@@ -866,9 +865,6 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t 
 	if (buflen > dt->dt_maxsize)
 		return (EINVAL);
 
-	if (td != NULL)
-		pmap = vmspace_pmap(td->td_proc->p_vmspace);
-
 	vaddr = (vm_offset_t)buf;
 	voffs = vaddr & IO_PAGE_MASK;
 	amask = (*segp == -1) ? dt->dt_alignment - 1 : 0;
@@ -888,10 +884,10 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t 
 		/*
 		 * Get the physical address for this page.
 		 */
-		if (pmap != NULL)
-			curaddr = pmap_extract(pmap, vaddr);
-		else
+		if (pmap == kernel_pmap)
 			curaddr = pmap_kextract(vaddr);
+		else
+			curaddr = pmap_extract(pmap, vaddr);
 
 		/*
 		 * Compute the segment size, and adjust counts.
@@ -973,8 +969,8 @@ iommu_dvmamap_load(bus_dma_tag_t dt, bus
 	iommu_map_remq(is, map);
 	IS_UNLOCK(is);
 
-	error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen, NULL,
-	    flags, dt->dt_segments, &seg);
+	error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen,
+	    kernel_pmap, flags, dt->dt_segments, &seg);
 
 	IS_LOCK(is);
 	iommu_map_insq(is, map);
@@ -1017,8 +1013,8 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt
 			if (m->m_len == 0)
 				continue;
 			error = iommu_dvmamap_load_buffer(dt, is, map,
-			    m->m_data, m->m_len, NULL, flags, dt->dt_segments,
-			    &nsegs);
+			    m->m_data, m->m_len, kernel_pmap, flags,
+			    dt->dt_segments, &nsegs);
 		}
 	} else
 		error = EINVAL;
@@ -1065,7 +1061,7 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t
 			if (m->m_len == 0)
 				continue;
 			error = iommu_dvmamap_load_buffer(dt, is, map,
-			    m->m_data, m->m_len, NULL, flags, segs,
+			    m->m_data, m->m_len, kernel_pmap, flags, segs,
 			    nsegs);
 		}
 	} else
@@ -1093,6 +1089,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 	struct thread *td = NULL;
 	bus_size_t minlen, resid;
 	int nsegs = -1, error = 0, i;
+	pmap-t pmap;
 
 	if ((map->dm_flags & DMF_LOADED) != 0) {
 #ifdef DIAGNOSTIC
@@ -1110,9 +1107,11 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 
 	if (uio->uio_segflg == UIO_USERSPACE) {
 		td = uio->uio_td;
-		KASSERT(td != NULL,
+		KASSERT(uio->uio_td != NULL,
 		    ("%s: USERSPACE but no proc", __func__));
-	}
+		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
+	} else
+		pmap = kernel_pmap;
 
 	for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) {
 		/*
@@ -1124,7 +1123,7 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 			continue;
 
 		error = iommu_dvmamap_load_buffer(dt, is, map,
-		    iov[i].iov_base, minlen, td, flags, dt->dt_segments,
+		    iov[i].iov_base, minlen, pmap, flags, dt->dt_segments,
 		    &nsegs);
 		resid -= minlen;
 	}

Modified: projects/physbio/sys/x86/x86/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 06:05:34 2012	(r243972)
+++ projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 06:34:20 2012	(r243973)
@@ -604,10 +604,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
 			bus_size_t sg_len;
 
 			sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK);
-			if (pmap)
-				paddr = pmap_extract(pmap, vaddr);
-			else
+			if (pmap == kernel_pmap)
 				paddr = pmap_kextract(vaddr);
+			else
+				paddr = pmap_extract(pmap, vaddr);
 			if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) &&
 			    run_filter(dmat, paddr) != 0) {
 				sg_len = roundup2(sg_len, dmat->alignment);
@@ -680,10 +680,10 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		/*
 		 * Get the physical address for this segment.
 		 */
-		if (pmap)
-			curaddr = pmap_extract(pmap, vaddr);
-		else
+		if (pmap == kernel_pmap)
 			curaddr = pmap_kextract(vaddr);
+		else
+			curaddr = pmap_extract(pmap, vaddr);
 
 		/*
 		 * Compute the segment size, and adjust counts.
@@ -758,8 +758,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 		map->callback_arg = callback_arg;
 	}
 
-	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, NULL, flags,
-	     dmat->segments, &nsegs);
+	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
+	    flags, dmat->segments, &nsegs);
 
 	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
 	    __func__, dmat, dmat->flags, error, nsegs + 1);
@@ -806,7 +806,7 @@ _bus_dmamap_load_mbuf_sg(bus_dma_tag_t d
 			if (m->m_len > 0) {
 				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
-						NULL, flags,
+						kernel_pmap, flags,
 						segs, nsegs);
 			}
 		}
@@ -875,7 +875,7 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 			("bus_dmamap_load_uio: USERSPACE but no proc"));
 		pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace);
 	} else
-		pmap = NULL;
+		pmap = kernel_pmap;
 
 	nsegs = -1;
 	error = 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212070634.qB76YKu1035425>