ISDN4BSD (HPS version) is going into ports

Hans Petter Selasky hselasky at c2i.net
Fri Jan 11 10:49:30 UTC 2013


On Thursday 10 January 2013 23:29:56 Andreas Longwitz wrote:
> Hans Petter Selasky wrote:
> > Can you try the attached patch? Revert the previous ones.
> 
> Yes I did, but system always crashes after first ping immediately after
> ihfc_b_setup was called:
> 
> i4b-L1 ihfc1: ihfc_B_setup: fifo(#2/#3), protocol_1=1
> 
> 
> Fatal trap 12: page fault while in kernel mode
> cpuid = 1; apic id = 00
> fault virtual address   = 0xbe
> fault code              = supervisor write, page not present
> instruction pointer     = 0x20:0xc06c7bff
> stack pointer           = 0x28:0xc49e8be8
> frame pointer           = 0x28:0xc49e8bfc
> code segment            = base 0x0, limit 0xfffff, type 0x1b
>                         = DPL 0, pres 1, def32 1, gran 1
> processor eflags        = interrupt enabled, resume, IOPL = 0
> current process         = 12 (swi4: clock)
> [thread pid 12 tid 100006 ]
> Stopped at      _mtx_lock_flags+0x1f:   lock cmpxchgl   %edx,0x10(%ecx)
> db:0:kdb.enter.default> watchdog
> No argument provided, disabling watchdog
> db:0:kdb.enter.default>  run ddbinfo
> db:1:ddbinfo> capture on
> db:1:on>  run lockinfo
> db:2:lockinfo> show lock Giant
>  class: sleep mutex
>  name: Giant
>  flags: {DEF, RECURSE}
>  state: {UNOWNED}
> db:2:Giant>  show lockedvnods
> Locked vnodes
> db:2:lockedvnods>  show lockchain
> thread 100006 (pid 12, swi4: clock) running on CPU 1
> db:2:lockchain>  show sleepchain
> thread 100006 (pid 12, swi4: clock) running on CPU 1
> db:1:sleepchain>  show pcpu
> cpuid        = 1
> dynamic pcpu = 0x3fbcd80
> curthread    = 0xc4d33000: pid 12 "swi4: clock"
> curpcb       = 0xc49e8d80
> fpcurthread  = none
> idlethread   = 0xc4d338a0: tid 100003 "idle: cpu1"
> APIC ID      = 0
> currentldt   = 0x50
> db:1:pcpu>  show allpcpu
> Current CPU: 1
> 
> cpuid        = 0
> dynamic pcpu = 0x61ed80
> curthread    = 0xc4de38a0: pid 12 "irq23: ihfc1"
> curpcb       = 0xe514bd80
> fpcurthread  = none
> idlethread   = 0xc4d335c0: tid 100004 "idle: cpu0"
> APIC ID      = 3
> currentldt   = 0x50
> cpuid        = 1
> dynamic pcpu = 0x3fbcd80
> curthread    = 0xc4d33000: pid 12 "swi4: clock"
> curpcb       = 0xc49e8d80
> fpcurthread  = none
> idlethread   = 0xc4d338a0: tid 100003 "idle: cpu1"
> APIC ID      = 0
> currentldt   = 0x50
> 
> db:1:allpcpu>  bt
> Tracing pid 12 tid 100006 td 0xc4d33000
> _mtx_lock_flags(ae,0,c0bff2a6,f8,c4d33000,...) at _mtx_lock_flags+0x1f
> i4bisppp_start(c5532800,0,c49e8c50,c06fb6fc,c0a3c02c,...) at
> i4bisppp_start+0x5a
> softclock(c0a379c0,c4d33000,0,109,56c88f72,...) at softclock+0x237
> intr_event_execute_handlers(c4d31560,c4d76680,c097e974,52c,c4d766f0,...)
> at intr_event_execute_handlers+0x13b
> ithread_loop(c4d30180,c49e8d28,0,c4d31560,0,...) at ithread_loop+0x6b
> fork_exit(c06b0290,c4d30180,c49e8d28) at fork_exit+0x97
> fork_trampoline() at fork_trampoline+0x8
> --- trap 0, eip = 0, esp = 0xc49e8d60, ebp = 0 ---
> db:1:bt>  ps
>   pid  ppid  pgrp   uid   state   wmesg     wchan    cmd
>  1584  1357  1584  1003  S+      select   0xc63fb0e4 ping
>  1577     1  1562     0  S+      select   0xc5be1a64 isdndecode
>  1576     1  1562     0  S+      select   0xc56cb4a4 isdndecode
>  1575     1  1562     0  S+      select   0xc63fb5e4 isdndecode
>  1542  1094    23     0  S       nanslp   0xc0a37984 sleep
>  1357  1356  1357  1003  Ss+     wait     0xc5fd22b0 bash
> ....
> 100022                   I                           [swi6: task queue]
> 100021                   I                           [swi6: Giant taskq]
> 100019                   I                           [swi5: +]
> 100008                   I                           [swi3: vm]
> 100007                   RunQ                        [swi4: clock]
> 100006                   Run     CPU 1               [swi4: clock]
> 100005                   I                           [swi1: netisr 0]
>    11     0     0     0  RL      (threaded)          idle
> 100004                   CanRun                      [idle: cpu0]
> 100003                   CanRun                      [idle: cpu1]
>     1     0     1     0  SLs     wait     0xc4d31ac0 [init]
>    10     0     0     0  SL      audit_wo 0xc0a53ac0 [audit]
>     0     0     0     0  SLs     (threaded)          kernel
> 100040                   D       -        0xc56ca6c0 [dummynet]
> 100038                   D       -        0xc5534940 [mca taskq]
> 100023                   D       -        0xc4e106c0 [kqueue taskq]
> 100020                   D       -        0xc4e10940 [thread taskq]
> 100018                   D       -        0xc4e10a00 [ffs_trim taskq]
> 100017                   D       -        0xc4e10a40 [acpi_task_2]
> 100016                   D       -        0xc4e10a40 [acpi_task_1]
> 100015                   D       -        0xc4e10a40 [acpi_task_0]
> 100000                   D       sched    0xc0a350a0 [swapper]
> db:1:ps>  show thread
> Thread 100006 at 0xc4d33000:
>  proc (pid 12): 0xc4d31560
>  name: swi4: clock
>  stack: 0xc49e7000-0xc49e8fff
>  flags: 0x50004  pflags: 0x200500
>  state: RUNNING (CPU 1)
>  priority: 52
>  container lock: sched lock 1 (0xc0a3c000)
> db:1:thread>  alltrace
> 
> Tracing command ping pid 1584 tid 100156 td 0xc639f8a0
> sched_switch(c639f8a0,0,104,56ccd79a,15d,...) at sched_switch+0x293
> mi_switch(104,0,c63fb0c0,c63eb000,e754fa2c,...) at mi_switch+0x12f
> sleepq_switch(c639f8a0,0,c0985116,1a5,c639f8a0,...) at sleepq_switch+0xcc
> sleepq_catch_signals(c63fb0c0,0,c639f8a0,e754fa78,c06910f7,...) at
> sleepq_catch_signals+0x52
> sleepq_timedwait_sig(c63fb0e4,0,c0986a0f,101,0,...) at
> sleepq_timedwait_sig+0x1c
> _cv_timedwait_sig(c63fb0e4,c63fb0d0,3e9,c6292b44,58,...) at
> _cv_timedwait_sig+0x1b7
> seltdwait(e754fc18,e754fc20,c62b1300,c639f8a0,e754fac8,...) at
> seltdwait+0xc1
> kern_select(c639f8a0,4,bfbee884,0,0,e754fc60,20,0,f4233) at
> kern_select+0x571
> select(c639f8a0,e754fcec,c,c,c,...) at select+0x66
> syscall(e754fd28) at syscall+0x342
> Xint0x80_syscall() at Xint0x80_syscall+0x21
> --- syscall (93, FreeBSD ELF32, select), eip = 0x881ae053, esp =
> 0xbfbee77c, ebp = 0xbfbfec48 ---
> 
> Tracing command intr pid 12 tid 100028 td 0xc4de38a0
> cpustop_handler(1,e514bb60,c08fe166,0,e514bb0c,...) at cpustop_handler+0x34
> ipi_nmi_handler(0,e514bb0c,c0606dbb,c5510000,c4d31560,...) at
> ipi_nmi_handler+0x2f
> trap(e514bb6c) at trap+0x36
> calltrap() at calltrap+0x6
> --- trap 0x13, eip = 0xc0bd4fd6, esp = 0xe514bbac, ebp = 0xe514bbc4 ---
> avm_pci_chip_read(c50cd000,80,c64a6820,0,c50cd000,...) at
> avm_pci_chip_read+0x56
> filter_rx(e514bc1d,c50cd000,49,c50cde78,20,...) at filter_rx+0x5c
> rx_hdlc(c50cd000,c50cde78,8001ae30,c50cd000,c4d76b80,...) at rx_hdlc+0x5d
> i4b_ipac_rx_program(c50cd000,c50cde78,c4de38a0,e514bc4c,c4d335c0,...) at
> i4b_ipac_rx_program+0x4a
> __ihfc_chip_interrupt(c50cd000,0,c0bfceb7,39b,c4f212c0,...) at
> __ihfc_chip_interrupt+0x171
> ihfc_chip_interrupt(c50cd000,c4de38a0,0,109,4dbdab7e,...) at
> ihfc_chip_interrupt+0x38
> intr_event_execute_handlers(c4d31560,c4d76b80,c097e974,52c,c4d76bf0,...)
> at intr_event_execute_handlers+0x13b
> ithread_loop(c525b040,e514bd28,0,c4d31560,0,...) at ithread_loop+0x6b
> fork_exit(c06b0290,c525b040,e514bd28) at fork_exit+0x97
> fork_trampoline() at fork_trampoline+0x8
> --- trap 0, eip = 0, esp = 0xe514bd60, ebp = 0 ---
> ...
> 
> If I revert the use of isac_remove_stat_fifo_map from your last patch
> and use my i4b_filter.h hack instead, then no crash occurs and D-channel
> is ok.
> 
> >> I will do more work on B-channel analysis. It would be very helpful for
> >> me, if you can give an answer to the following question:
> >> 
> >> After the B-channel is established, the other side starts sending the
> >> following data packet (from isdndecode of the other side):
> >> 
> >> -- TE->NT - unit:00  frame:351318 - time:10.01 11:34:12.595168 -
> >> 
> >>                                               length:18 ----
> >> 
> >> B01:000  ff 03 c0 21 01 d8 00 0e    05 06 31 13 cd b3 03 04
> >> B01:010  c0 23
> >> 
> >> What should we read in avm_pci_b_status_read() with
> >> 
> >>            if(temp == 0) temp = 32;
> >>            
> >>             /* read FIFO */
> >>             bus_space_read_multi_4(t, h, offset + HSCX_FIFO,
> >>             
> >>                 (u_int32_t *)sc->sc_buffer, (temp + 3) / 4);
> >> 
> >> if everything works correct and how many interrupts can we expect for
> >> the message of 18 bytes ?
> > 
> > You should either get 32+32+32+32+32 and so on, or you will get:
> > (18+((number_of_bit_stuffings+7)/8) +2) bytes.
> 
> The other side sends 11 frames of length 18 in B-channel and with my
> last kernel described above I see
> 
> login: i4b-L1 ihfc1: ihfc_B_setup: fifo(#2/#3), protocol_1=1
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=1
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: avm_pci_b_status_read: HSCX_LEN=18, protocol_1=17
> i4b-L1 ihfc1: ihfc_B_setup: fifo(#2/#3), protocol_1=0
> 
> The debug message comes from
> 
>    temp = bus_space_read_1(t, h, offset + HSCX_LEN);
>    if (bootverbose  == 2)
>       IHFC_ERR("HSCX_LEN=%d, protocol_1=%d\n", temp,
>                 f->prot_curr.protocol_1);
>    temp = temp & 0x3F;
>    if(temp == 0) temp = 32;
> 
> This proves that your use of 0x3F is ok.
> I am not sure, but it seems to me, that the use of __aligned for the
> sc_buffer has changed things. In the sourcefile i4b_avm_pci.h of the
> ports version 2.0.6 the __aligned option was not present, you have
> introduced this later in your repository.

Hi,

Looks like you are almost there. I will reply to your other comments later.

Can you try to add a printf in "src/sys/i4b/driver/i4b_isppp.c":

static void
i4bisppp_start(struct ifnet *ifp)
{
        struct i4bisppp_softc *sc = ifp->if_softc;

 printf("ifp=%p sc=%p\n", sc, ifp);

is the "sc" NULL ?

Looks like another issue.

--HPS


More information about the freebsd-isdn mailing list