On Sun, Mar 31, 2013 at 06:20:17PM -0600, Ian Lepore wrote:
> On Tue, 2013-02-12 at 16:57 +0000, Konstantin Belousov wrote:
> > Author: kib
> > Date: Tue Feb 12 16:57:20 2013
> > New Revision: 246713
> > URL: http://svnweb.freebsd.org/changeset/base/246713
> > 
> > Log:
> >   Reform the busdma API so that new types may be added without modifying
> >   every architecture's busdma_machdep.c.  It is done by unifying the
> >   bus_dmamap_load_buffer() routines so that they may be called from MI
> >   code.  The MD busdma is then given a chance to do any final processing
> >   in the complete() callback.
> >   
> >   The cam changes unify the bus_dmamap_load* handling in cam drivers.
> >   
> >   The arm and mips implementations are updated to track virtual
> >   addresses for sync().  Previously this was done in a type specific
> >   way.  Now it is done in a generic way by recording the list of
> >   virtuals in the map.
> >   
> >   Submitted by:     jeff (sponsored by EMC/Isilon)
> >   Reviewed by:      kan (previous version), scottl,
> >     mjacob (isp(4), no objections for target mode changes)
> >   Discussed with:        ian (arm changes)
> >   Tested by:        marius (sparc64), mips (jmallet), isci(4) on x86 
> > (jharris),
> >     amd64 (Fabian Keil <freebsd-lis...@fabiankeil.de>)
> > 
> > Added:
> >   head/sys/kern/subr_bus_dma.c   (contents, props changed)
> >   [...]
> 
> I've just discovered that _bus_dmamap_load_vlist() gets a compile
> warning when building tinderbox on an i386 host, while building for PAE
> and XEN:
> 
> cc1: warnings being treated as errors
> /local/build/staging/freebsd/head/src/sys/kern/subr_bus_dma.c: In function 
> '_bus_dmamap_load_vlist':
> /local/build/staging/freebsd/head/src/sys/kern/subr_bus_dma.c:69: warning: 
> cast to pointer from integer of different size [-Wint-to-pointer-cast]
> 
> My build machine is i386 PAE running 8.3 (needs to be that old for our
> build system at $work), so if this is a bogus error caused by building
> -current on such a downlevel system, I appologize in advance for the
> noise.

The warning is bogus in a sense that the code is correct. The bus_addr_t
on the PAE i386 is uint64_t, and since void * is 32bit, the warning
is emited. On the other hand, the promise of the caller of the
_bus_dmamap_load_vlist() is to have the virtual addresses stored in the
ds_addr, so the cast is not problematic.

The warning is useful only in the other direction, IMO, i.e. when casting
wide pointer to narrow integer type.

The warning is obviously specific to the version of the compiler you use.
It is not hard to fix it, could you, please, verify the patch below ?

diff --git a/sys/kern/subr_bus_dma.c b/sys/kern/subr_bus_dma.c
index 45fa9bb..4528601 100644
--- a/sys/kern/subr_bus_dma.c
+++ b/sys/kern/subr_bus_dma.c
@@ -66,8 +66,8 @@ _bus_dmamap_load_vlist(bus_dma_tag_t dmat, bus_dmamap_t map,
        error = 0;
        for (; sglist_cnt > 0; sglist_cnt--, list++) {
                error = _bus_dmamap_load_buffer(dmat, map,
-                   (void *)list->ds_addr, list->ds_len, pmap, flags, NULL,
-                   nsegs);
+                   (void *)(uintptr_t)list->ds_addr, list->ds_len, pmap,
+                   flags, NULL, nsegs);
                if (error)
                        break;
        }

Attachment: pgpsRpWJ2925Q.pgp
Description: PGP signature

Reply via email to