Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jun 2005 02:18:10 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-hackers@freebsd.org
Cc:        Joerg Sonnenberger <joerg@britannica.bec.de>
Subject:   Re: Obvious bug in /sys/i386/include/bus.h (was: bus_at386.h)
Message-ID:  <200506140218.11844.hselasky@c2i.net>
In-Reply-To: <20050613162743.GA769@britannica.bec.de>
References:  <200506131412.38967.hselasky@c2i.net> <200506131758.25671.hselasky@c2i.net> <20050613162743.GA769@britannica.bec.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 13 June 2005 18:27, Joerg Sonnenberger wrote:
> On Mon, Jun 13, 2005 at 05:58:24PM +0200, Hans Petter Selasky wrote:
> > static void
> > filter(struct fifo *f)
> > {
> >   do {
> >      if(!f->len)
> >      {
> >          if(f->m) ...;
> >
> >          f->m = get_mbuf();
> >          if(!f->m) break;
> >
> >          f->len = m->m_len;
> >          f->ptr = m->m_data;
> >      }
> >
> >      /* f->Z_chip is the maximum transfer length */
> >
> >      io_len = min(f->len, f->Z_chip);
>
>  if (io_len == 0)
>   continue;
>
> >      bus_space_write_multi_1(t,h,xxx,f->ptr,io_len);
> >
> >      f->len -= io_len;
> >      f->Z_chip -= io_len;
> >      f->ptr += io_len;
> >
> >   } while(Z_chip);
> > }
>
> [...]
>
> > Adding that extra check for zero transfer length is not going to affect
> > performance at all. If one does that using "C", the compiler can optimize
> > away that "if(count) ..." when "count" is a constant. Besides the i386
> > machine instructions "ins" and "outs" already exhibit that behaviour.
>
> The compiler can only optimize it away if it is known to be a constant.
> But thinking again about it, it should be documented at least whether
> a count of 0 is allowed or not. I think it makes more sense to not allow
> it, but others (you included) might disagree.

Why?

If a count of zero is not allowed, then "bus_space_xxx()" should panic on 
count equal to zero and not freeze the system, so that the user is able to 
find out what is wrong:

#if defined(XXX)
  if(count == 0) panic("not allowed");
#endif

But that is just stupid, why not just return:

#if defined(XXX)
  if(count == 0) return;
#endif

And then I can put:

#define XXX

in my code before including "bus.h". Instead of creating wrappers, just to be 
sure:

#define bus_space_read_multi_1(t,h,off,ptr,count) \
{ if(count) bus_space_read_multi_1(t,h,off,ptr,count); }

Because this is really specific to i386 and amd64. If you look at "alpha", 
"sparc64" and "ia64" they all use "while(count--) ...". So I think the one 
that wrote that code did a mistake.

My theory is that he or her copied:

static __inline void
insb(u_int port, void *addr, size_t cnt)
{
        __asm __volatile("cld; rep; insb"
                         : "+D" (addr), "+c" (cnt)
                         : "d" (port)
                         : "memory");
}

And forgot to add that extra check for count equal to zero, when converting 
"rep" into "loop"!

--HPS



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