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@8 little interestig is frame 3db0 :
c0003da0 <_PsBeginThread>:
/* * Do the necessary prolog after a context switch */ call _PiBeforeBeginThreadc0003da0: 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@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@reactos.com http://reactos.com:8080/mailman/listinfo/ros-dev