PMD analysis of a panic in ohci.c

From: Bjoern Fischer <bfischer_at_Techfak.Uni-Bielefeld.DE>
Date: Thu, 12 Feb 2004 14:15:57 +0100
Hello,

with a recent -CURRENT I got a panic while moving the mouse the first
time since I booted my IBM laptop or while starting usbd(8).
I can keep the dump for a while, so if someone needs to talk me through
deeper analysis.

Bjoern Fischer

I wrote some comments into the gdb session...

#0  doadump () at ../../../kern/kern_shutdown.c:240
240             dumping++;
(kgdb) bt
#0  doadump () at ../../../kern/kern_shutdown.c:240
#1  0xc052db7a in boot (howto=256) at ../../../kern/kern_shutdown.c:374
#2  0xc052dfdb in __panic () at ../../../kern/kern_shutdown.c:552
#3  0xc06ae286 in trap_fatal (frame=0xcd150c4c, eva=0)
    at ../../../i386/i386/trap.c:819
#4  0xc06adef2 in trap_pfault (frame=0xcd150c4c, usermode=0, eva=8)
    at ../../../i386/i386/trap.c:733
#5  0xc06ada6d in trap (frame=
      {tf_fs = -1052049384, tf_es = -854261744, tf_ds = -1068236784, tf_edi = 0,
 tf_esi = -1052088320, tf_ebp = -854258512, tf_isp = -854258568, tf_ebx = -10298
86976, tf_edx = 0, tf_ecx = -1029886976, tf_eax = 1862656, tf_trapno = 12, tf_er
r = 2, tf_eip = -1068700480, tf_cs = 8, tf_eflags = 66055, tf_esp = -1030074368,
 tf_ss = -1029887024}) at ../../../i386/i386/trap.c:420
#6  0xc04cecc0 in ohci_softintr (v=0xc29a5000) at ../../../dev/usb/ohci.c:1438
#7  0xc04e0d42 in usb_schedsoftintr (bus=0x0) at ../../../dev/usb/usb.c:840
#8  0xc04ce8d1 in ohci_intr1 (sc=0xc29a5000) at ../../../dev/usb/ohci.c:1216
#9  0xc04ce73f in ohci_intr (p=0xc29a5000) at ../../../dev/usb/ohci.c:1145
#10 0xc0517328 in ithread_loop (arg=0xc2953200)
    at ../../../kern/kern_intr.c:547
#11 0xc0515f58 in fork_exit (callout=0xc0517150 <ithread_loop>, arg=0x0, 
    frame=0x0) at ../../../kern/kern_fork.c:802
(kgdb) frame 6
#6  0xc04cecc0 in ohci_softintr (v=0xc29a5000) at ../../../dev/usb/ohci.c:1438
1438                            opipe->sed->ed.ed_headp = htole32(p->physaddr);
(kgdb) list
1433                                    n = p->nexttd;
1434                                    ohci_free_std(sc, p);
1435                            }
1436
1437                            /* clear halt */
1438                            opipe->sed->ed.ed_headp = htole32(p->physaddr);
1439                            OWRITE4(sc, OHCI_COMMAND_STATUS, OHCI_CLF);
1440
1441                            if (cc == OHCI_CC_STALL)
1442                                    xfer->status = USBD_STALLED;
(kgdb) print opipe
$1 = (struct ohci_pipe *) 0xc2953900
(kgdb) print opipe->sed
$2 = (ohci_soft_ed_t *) 0x0

!! ok, opipe is initialized as (struct ohci_pipe *)xfer->pipe, which
!! is a (struct usbd_pipe *)

(kgdb) print xfer->pipe
$3 = (struct usbd_pipe *) 0xc2953900
(kgdb) print *(xfer->pipe)
$4 = {iface = 0x0, device = 0xc2953b00, endpoint = 0xc2953b24, refcnt = 1, 
  running = 0 '\0', aborting = 0 '\0', queue = {stqh_first = 0x0, 
    stqh_last = 0xc2953914}, next = {le_next = 0x0, le_prev = 0x0}, 
  intrxfer = 0x0, repeat = 0 '\0', interval = -1, methods = 0xc0721d1c}
(kgdb) print *(opipe)
$5 = {pipe = {iface = 0x0, device = 0xc2953b00, endpoint = 0xc2953b24, 
    refcnt = 1, running = 0 '\0', aborting = 0 '\0', queue = {
      stqh_first = 0x0, stqh_last = 0xc2953914}, next = {le_next = 0x0, 
      le_prev = 0x0}, intrxfer = 0x0, repeat = 0 '\0', interval = -1, 
    methods = 0xc0721d1c}, sed = 0x0, aborting = 0, tail = {td = 0x0, 
    itd = 0x0}, u = {ctl = {reqdma = {block = 0x0, offs = 0, len = 0}, 
      length = 0, setup = 0x0, data = 0x0, stat = 0x0}, intr = {nslots = 0, 
      pos = 0}, bulk = {length = 0, isread = 0}, iso = {next = 0, inuse = 0}}}

!! seems like ohci_softintr() expects xfer->pipe to point really to a
!! whole struct ohci_pipe, not just the struct usbd_pipe part. Either
!! somehow the remainder of (struct ohci_pipe *)xfer->pipe was not
!! initialized properly, or it is simply a struct usbd_pipe.
Received on Thu Feb 12 2004 - 04:15:30 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:42 UTC