Port-sparc64 archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Trap 0x34 panic on 5.1 on Blade 100



On Thu, 12 May 2011, George Harvey wrote:

> On Sat, 7 May 2011 23:45:52 +0100
> George Harvey <fr30%dial.pipex.com@localhost> wrote:
> 
> > On Sat, 7 May 2011 09:18:26 +0200
> > Martin Husemann <martin%duskware.de@localhost> wrote:
> > 
> > > On Sat, May 07, 2011 at 12:13:02AM +0100, George Harvey wrote:
> > > > Are there any kernel debug options I could set to get a more readable
> > > > traceback?
> > > 
> > > If this is not a production server, you probably want ddb.onpanic = 1
> > > in /etc/sysctl.conf.
> > 
> > Looks like it could be the gem driver, I switched to a 3Com Ethernet
> > card and it stopped crashing.
> 
> After further testing, it appears that I only get panics when using the
> on-board gem interface with a 100Mb half-duplex connection.
> Specifically, when connected to a 3Com SuperStack II Dual Speed Hub 500.
> With a full-duplex switch connection, or even with an old 10Mb hub, I
> don't get any panics. The following backtrace is from a panic caused
> by starting xterm over ssh. FTP and NFS also produce similar panics:
> 
> blade100# trap type 0x34: cpu 0, pc=137b108 npc=137b10c 
> pstate=44800006<PRIV,IE> kernel trap 34: mem address not aligned
> Stopped in pid 451.1 (sshd) at  netbsd:m_xhalf+0x8:
>  ld [%o0 + 0 x20], %g2
> db> bt
> bpf_mtap(2ed0e00, c78c0f0, 0, 800, 2, 0) at netbsd:bpf_mtap+0xd4
> gem_rint(c78c000, 80000000, 17d8, 1ff00400000, 4, 4000) at
> netbsd:gem_rint+0x2cc

Hm.  Are you using the packer filter?  Looks like it's not accessing 
unaligned data properly.  Lessee... best to get a full disassembly of the 
function, but assuming %o0 didn't change the signature is 
m_xhalf(const struct mbuf *m, uint32_t k, int *err)
so it's trying to load something 32-bytes into the mbuf.

Here's your mbuf header:

struct m_hdr {
        struct  mbuf *mh_next;          /* next buffer in chain */
        struct  mbuf *mh_nextpkt;       /* next chain in queue/record */
        char   *mh_data;                /* location of data */
        struct  mowner *mh_owner;       /* mbuf owner */
        int     mh_len;                 /* amount of data in this mbuf */
        int     mh_flags;               /* flags; see below */
        paddr_t mh_paddr;               /* physical address of mbuf */
        short   mh_type;                /* type of data in this mbuf */
};

So... that should be the mh_len field.

The code does this:

static int
m_xhalf(const struct mbuf *m, uint32_t k, int *err)
{
        int len;
        u_char *cp;
        struct mbuf *m0;

        *err = 1;
        MINDEX(len, m, k);
        cp = mtod(m, u_char *) + k;
        if (len >= k + 2) {
                *err = 0;
                return EXTRACT_SHORT(cp);
        }
        m0 = m->m_next;
        if (m0 == 0)
                return 0;
        *err = 0;
        return (cp[0] << 8) | mtod(m0, u_char *)[0];
}

Looks like it's probably bombing inside MINDEX.  

Hm.  I don't see how this could possibly be happening since the mbuf is 
manipulated just before the call to bpf_mtap:

                m = rxs->rxs_mbuf;
                if (gem_add_rxbuf(sc, i) != 0) {
                        GEM_COUNTER_INCR(sc, sc_ev_rxnobuf);
                        ifp->if_ierrors++;
                        GEM_INIT_RXDESC(sc, i);
                        bus_dmamap_sync(sc->sc_dmatag, rxs->rxs_dmamap, 0,
                            rxs->rxs_dmamap->dm_mapsize, 
BUS_DMASYNC_PREREAD);
                        continue;
                }
                m->m_data += 2; /* We're already off by two */

                m->m_pkthdr.rcvif = ifp;
                m->m_pkthdr.len = m->m_len = len;

                /*
                 * Pass this up to any BPF listeners, but only
                 * pass it up the stack if it's for us.
                 */
                bpf_mtap(ifp, m);


That code should also get an alignment fault if the mbuf is not aligned.  
I think it's probably an issue with bpf.



Eduardo



Home | Main Index | Thread Index | Old Index