> (device driver) EMERGENCY: assertion `FDEV_LINUX_local_irq_count[0] ==0' failed in >file ../../../../oskit-20020317+pcmcia/linux/dev/softintr.c, line 121 assertion >`FDEV_LINUX_local_irq_count[0] == 0' failed in file ../../../../oskit-20020317 > +pcmcia/linux/dev/softintr.c, line 121 > > panic in device driver! > Backtrace: fp=299d54 > 0020f2da 00128551 0012856c 0015ca8b 00128caa 00128a2b 0011268c 0013a6ce > 0015170a 001510c2 00156fdc 001285bc 00139d59 001576f3 0012be3c 0012a361 > _exit(1) called; rebooting... >
I have looked into the irq bug and here is what I have found so far. (gdb) bt #0 panic (fmt=0x1a4c56 "\r\npanic in device driver!") at ../../../oskit-20020317+pcmcia/libc/gen/panic.c:31 #1 0x128551 in log_vpanic () at ../../gnumach/oskit/osenv_log.c:156 #2 0x12856c in log_panic (o=0x1c5d40, fmt=0x1b7920 "assertion `FDEV_LINUX_local_irq_count[0] == 0' failed in file ../../../../oskit-20020317+pcmcia/linux/dev/softintr.c, line %d\n") at ../../gnumach/oskit/osenv_log.c:165 #3 0x17bf4b in linux_softintr_handler (arg=0x0) at ../../../../oskit-20020317+pcmcia/linux/dev/softintr.c:121 #4 0x128cb2 in oskit_softint () at ../../gnumach/oskit/osenv_softirq.c:87 #5 0x128a2b in softclock_oskit () at ../../gnumach/oskit/pc/osenv_timer.c:58 #6 0x11268c in softclock () at ../../gnumach/kern/mach_clock.c:305 #7 0x13a4b8 in spl0 () #8 0x1413a7 in intr_enable (s=0x1c6b3c) at ../../../oskit-20020317+pcmcia/dev/osenv_intr.c:67 #9 0x1579fe in OSKIT_LINUX_linux_sti () at ../../../../oskit-20020317+pcmcia/linux/shared/x86/s_intr.c:31 #10 0x179c6c in linux_intr (data=0xa) at ../../../../oskit-20020317+pcmcia/linux/dev/irq.c:100 #11 0x1285bc in irq_handler (iunit=10, old_ipl=1, ret_addr=0x13a109, regs=0x6) at ../../gnumach/oskit/osenv_irq.c:78 #12 0x139c49 in interrupt () #13 0x12bebf in net_push (ioi=0x10143cd0, b=0xaef3104, pkt_size=98) at ../../gnumach/oskit/ds_net.c:293 #14 0x17ad90 in FDEV_LINUX_net_bh () at ../../../../oskit-20020317+pcmcia/linux/dev/net_glue.c:220 #15 0x17bed9 in FDEV_LINUX_do_bottom_half () at ../../../../oskit-20020317+pcmcia/linux/dev/softintr.c:106 #16 0x17bf89 in linux_softintr_handler (arg=0x0) at ../../../../oskit-20020317+pcmcia/linux/dev/softintr.c:129 #17 0x128cb2 in oskit_softint () at ../../gnumach/oskit/osenv_softirq.c:87 #18 0x128a2b in softclock_oskit () at ../../gnumach/oskit/pc/osenv_timer.c:58 #19 0x11268c in softclock () at ../../gnumach/kern/mach_clock.c:305 #20 0x13a5be in splx_cli () #21 0x114fb6 in idle_thread_continue () at ../../gnumach/kern/sched_prim.c:1703 oskit_softint is called in frame 17 and is interrupted in frame 12 and suspended. The interrupt handler is called: static void linux_intr(void *data) { int irq = (int)data; struct pt_regs regs; struct int_handler *hand; struct task_struct *cur = current; kstat.irqs[0][irq]++; local_irq_count[0]++; if ((handlers[irq]->flags & SA_INTERRUPT) == 0) linux_sti(); hand = handlers[irq]; while (hand) { (*hand->func)(irq, hand->dev_id, ®s); hand = hand->next; } local_irq_count[0]--; /* If any linux software handlers pending, schedule a softirq */ if (bh_mask & bh_active) osenv_softirq_schedule(softintr_vector); linux_cli(); current = cur; } After local_irq_count[0]++ the interrupts are enabled again (linux_sti()), then before local_irq_count[0]-- is executed an another softirq is started (frame 6). And in frame 3 the assert is triggered, because local_irq_count[0] is not null. static void linux_softintr_handler(void *arg) { osenv_assert(local_irq_count[0] == 0); osenv_assert(local_bh_count[0] == 0); /* * Interrupts will already be enabled. */ if (bh_mask & bh_active) { struct task_struct *cur = current; do_bottom_half(); current = cur; } } So I do know whats going on, but I don't know whats exactly wrong. Maybe the interrupts should not be enabled while the irq handlers are called? wagi _______________________________________________ Bug-hurd mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-hurd