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 _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@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(a)reactos.com
http://reactos.com:8080/mailman/listinfo/ros-dev