[ros-dev] SMP - Recursive bugcheck
Hartmut Birr
hartmut.birr at gmx.de
Sun Dec 12 21:00:34 CET 2004
Hi,
the bugcheck from the ipi routine occurs, if one processor requests a
function which must be execute synchronous on all processors and if one
processor doesn't execute the function within 5 seconds. Currently it
exist only one of such a function. The function is MiFlushTlbIpiRoutine
which is called if a memory mapping is changed or deleted. I've add the
time limit to the ipi execution to stop all execution if one processor
hangs. Usually the call frames are not interesting. The interesting part
is why the ipi is not delivered. Can you describe your hardware a little
bit? If you use a early P2B-DS board from asus, possible you must add a
hardware fix (moving a 0 ohm resistor). Can you enable the debug prints
from MpsTimerHandler in apic.c? You must change all the '#if 0' to '#if
1' in MpsTimerHandler. If you enable this lines, you should have a
second computer for debug prints.
- Hartmut
David Kredba schrieb:
> With current cvs tree, booted from freeldr floppy and hdd, same config
> I got :
>
> (ke/ipi.c: 114) Waiting longer than 5 seconds to start the ipi routine
>
> KeBugCheck at ke/ipi.c: 115
>
> ntoskrnl.exe : misc KeBugCheck and _KiIpiServiceRoutine at 8
> little interestig is frame 3db0 :
>
> c0003da0 <_PsBeginThread>:
>
> /*
> * Do the necessary prolog after a context switch
> */
> call _PiBeforeBeginThread
> c0003da0: e8 b1 ec 0a 00 call c00b2a56
> <_PiBeforeBeginThread>
>
> /*
> * Call the actual start of the thread
> */
> movl 4(%esp), %ebx /* Start routine */
> c0003da5: 8b 5c 24 04 mov 0x4(%esp),%ebx
> movl 8(%esp), %eax /* Start context */
> c0003da9: 8b 44 24 08 mov 0x8(%esp),%eax
> pushl %eax
> c0003dad: 50 push %eax
> call *%ebx /* Call the start routine */
> c0003dae: ff d3 call *%ebx
> addl $4, %esp
> c0003db0: 83 c4 04 add $0x4,%esp
>
> /*
> * Terminate the thread
> */
>
>
> hal.dll :
>
> First frame is 186a0 :
>
> Ki386EnableInterrupts();
> 18693: fb sti
> #if 0
> DbgPrint("(%s:%d) MpsIpiHandler on CPU%d, current irql is %d\n",
> __FILE__,__LINE__, KeGetCurrentProcessorNumber(),
> KeGetCurrentIrql());
> #endif
>
> KiIpiServiceRoutine(NULL, NULL);
> 18694: 83 ec 08 sub $0x8,%esp
> 18697: 6a 00 push $0x0
> 18699: 6a 00 push $0x0
> 1869b: e8 20 31 00 00 call 1b7c0
> <_KiIpiServiceRoutine at 8>
> 186a0: 83 c4 08 add $0x8,%esp
>
> #if 0
> DbgPrint("(%s:%d) MpsIpiHandler on CPU%d done\n",
> __FILE__,__LINE__, KeGetCurrentProcessorNumber());
> #endif
>
> Ki386DisableInterrupts();
>
> the second frame is : 190ff
>
> 000190e0 <_MpsIpiInterrupt>:
>
> .global _MpsIpiInterrupt
> _MpsIpiInterrupt:
> /* Save registers */
> BEFORE
> 190e0: fc cld
> 190e1: 60 pusha
> 190e2: 1e push %ds
> 190e3: 06 push %es
> 190e4: 0f a0 push %fs
> 190e6: 0f a8 push %gs
> 190e8: b8 10 00 00 00 mov $0x10,%eax
> 190ed: 8e d8 mov %eax,%ds
> 190ef: 8e c0 mov %eax,%es
> 190f1: 8e e8 mov %eax,%gs
> 190f3: b8 30 00 00 00 mov $0x30,%eax
> 190f8: 8e e0 mov %eax,%fs
>
> /* Call the C handler */
> call _MpsIpiHandler
> 190fa: e8 78 f5 ff ff call 18677 <_MpsIpiHandler>
>
> /* Return to the caller */
> AFTER
> 190ff: 0f a9 pop %gs
> 19101: 0f a1 pop %fs
> 19103: 07 pop %es
> 19104: 1f pop %ds
> 19105: 61 popa
> iret
> 19106: cf iret
>
> 00019107 <_MpsErrorInterrupt>:
>
>
> Regards, David
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.com
> http://reactos.com:8080/mailman/listinfo/ros-dev
>
>
More information about the Ros-dev
mailing list