cvs commit: src/sys/alpha/alpha support.s src/sys/i386/i386 identcpu.c support.s src/sys/i386/include md_var.h src/sys/i386/isa npx.c src/sys/ia64/ia64 support.s src/sys/powerpc/powerpc bcopy.c sr

Bruce Evans bde at zeta.org.au
Fri Apr 4 22:22:43 PST 2003


On Fri, 4 Apr 2003, Dag-Erling [iso-8859-1] Smørgrav wrote:

> Kris Kennaway <kris at obsecurity.org> writes:
> > On Fri, Apr 04, 2003 at 09:29:55AM -0800, Dag-Erling Smorgrav wrote:
> > >   Define ovbcopy() as a macro which expands to the equivalent bcopy() call,
> > >   to take care of the KAME IPv6 code which needs ovbcopy() because NetBSD's
> > >   bcopy() doesn't handle overlap like ours.
> > Was this for optimization reasons, hysterical raisins, or some other reason?
>
> The existence of ovbcopy()?  I imagine it was just an API issue,
> someone didn't feel comfortable assuming that the kernel bcopy()
> handles overlap when the userland version doesn't.  In FreeBSD

I think the problem is more the reverse.  The userland bcopy() has handled
overlap (and has been documented to do so) since at least FreeBSD-1.1.
It's hard to see how the BSD bcopy() family could work if bcopy() didn't
handle overlap, since this family has no other member corresponding to
Standard C's memmove().

> however, ovbcopy() has always (for appropriate values of "always")
> been an alias for or duplicate of bcopy().  On i386, ovbcopy() was an
> alternate name for bcopy from its inception in revision 1.1 of
> locore.s (originally from 386BSD) until revision 1.40 (late 1996) when
> Bruce made it a trampoline (and bcopy() a function pointer) to allow
> for multiple processor-specific versions.  On powerpc, it was a

I only made bzero a function pointer.  bcopy() and ovbcopy() are still
functions.  They just use a trampoline internally.

> separate function but an exact duplicate of bcopy() (which itself is a
> wrapper for memcpy()).  On all other platforms, it was an alternate
> name for bcopy().
>
> In NetBSD, the situation is a little confused, because most platforms
> use a generic C implementation of bcopy() (in libkern) which handles
> overlap, but some use optimized assembler versions which don't, and
> these platforms have ovbcopy() - but the only part of the tree which
> actually uses ovbcopy() is the IPv6 stack (KAME), and it has its own
> version (a macro wrapper for memmove()) so in effect the real
> ovbcopy() is never used.

Urgh.  This is a good example of the morass you can get into with
micro-optimizations, especally when everyone/everyarch doesn't know
about and/or want all of their details.  And this is without even
the complications for memcpy vs bcopy, compiler builtins for memcpy
and C inlines for memcpy.

> The current situation in FreeBSD (after my commits) is much like that
> in NetBSD, except we have no real ovbcopy() at all, just a macro in
> <sys/systm.h> for KAME's benefit.

The main problem with the commit is not mentioned in its log message:
changing bzero from a function pointer back to a function breaks
binary compatibility of many modules.  In defence of this, 5.0 breaks
binary compatibility of most modules for other reasons.

Bruce


More information about the cvs-src mailing list