David Kredba schrieb:
(apic.c:782) MpsIpiHandler on CPU1, current irql is
29
(ke/ipi.c:114) Waiting longer than 5 seconds after executing the ipi
routine
KeBugCheck at ke/ipi.c:115
Bug detected (code 0 param 0 0 0 0)
The bug code is undefined. Please use an existing code instead.
Hi David,
it seems, that the ipi's are delivered correctly between the processors
and that at least one processor has executed the requested routine. I've
add more debug prints. I hope to see, at which point the execution of
the ipi routine stops. Please attach my patch and try it again.
- Hartmut
E:\Sandbox\ros_mp\reactos>set CVS_RSH=SSH2
E:\Sandbox\ros_mp\reactos>d:\programme\cvsnt\cvs.exe -z6 -d
:ext:hbirr@osexperts.com:/CVS/ReactOS diff -u ntoskrnl\include\config.h ntoskrnl\ke\ipi.c
Index: ntoskrnl/include/config.h
===================================================================
RCS file: /CVS/ReactOS/reactos/ntoskrnl/include/config.h,v
retrieving revision 1.3
diff -u -r1.3 config.h
--- ntoskrnl/include/config.h 10 Dec 2004 14:58:26 -0000 1.3
+++ ntoskrnl/include/config.h 19 Dec 2004 11:44:34 -0000
@@ -11,7 +11,7 @@
* It could happen that some messages are lost if the processor is halted before
* the message queue was flushed.
*/
-#undef SERIALIZE_DBGPRINT
+#define SERIALIZE_DBGPRINT
/********** mm/ppool.c **********/
Index: ntoskrnl/ke/ipi.c
===================================================================
RCS file: /CVS/ReactOS/reactos/ntoskrnl/ke/ipi.c,v
retrieving revision 1.4
diff -u -r1.4 ipi.c
--- ntoskrnl/ke/ipi.c 27 Nov 2004 16:32:10 -0000 1.4
+++ ntoskrnl/ke/ipi.c 19 Dec 2004 11:44:34 -0000
@@ -57,7 +57,7 @@
ASSERT(KeGetCurrentIrql() == IPI_LEVEL);
- DPRINT("KiIpiServiceRoutine\n");
+ DbgPrint("(%s:%d) CPU%d, KiIpiServiceRoutine\n", __FILE__, __LINE__,
KeGetCurrentProcessorNumber());
Pcr = KeGetCurrentKPCR();
@@ -88,13 +88,15 @@
CurrentTime = KeQueryPerformanceCounter(NULL);
if (CurrentTime.QuadPart > StartTime.QuadPart + Count * Frequency.QuadPart)
{
- DPRINT1("Waiting longer than %d seconds to start the ipi routine\n",
Count);
+ DbgPrint("(%s:%d) CPU%d, waiting longer than %d seconds to start the ipi
routine\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber(), Count);
KEBUGCHECK(0);
}
#endif
}
}
+ DbgPrint("(%s:%d) CPU%d, before executing the worker routine\n",
__FILE__,__LINE__, KeGetCurrentProcessorNumber());
((VOID
STDCALL(*)(PVOID))(Pcr->PrcbData.SignalDone->WorkerRoutine))(Pcr->PrcbData.SignalDone->CurrentPacket[0]);
+ DbgPrint("(%s:%d) CPU%d, after executing the worker routine\n",
__FILE__,__LINE__, KeGetCurrentProcessorNumber());
do
{
Processor = 1 << KeGetCurrentProcessorNumber();
@@ -111,7 +113,7 @@
CurrentTime = KeQueryPerformanceCounter(NULL);
if (CurrentTime.QuadPart > StartTime.QuadPart + Count * Frequency.QuadPart)
{
- DPRINT1("Waiting longer than %d seconds after executing the ipi
routine\n", Count);
+ DbgPrint("(%s:%d) CPU%d, waiting longer than %d seconds after executing the
ipi routine\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber(), Count);
KEBUGCHECK(0);
}
#endif
@@ -120,7 +122,7 @@
InterlockedExchangePointer(&Pcr->PrcbData.SignalDone, NULL);
Pcr->PrcbData.IpiFrozen &= ~IPI_REQUEST_FUNCTIONCALL;
}
- DPRINT("KiIpiServiceRoutine done\n");
+ DbgPrint("(%s:%d) CPU%d, KiIpiServiceRoutine done\n", __FILE__, __LINE__,
KeGetCurrentProcessorNumber());
return TRUE;
}
@@ -171,7 +173,7 @@
KIRQL oldIrql;
ULONG TargetSet;
- DPRINT("KeIpiGenericCall on CPU%d\n", KeGetCurrentProcessorNumber());
+ DbgPrint("(%s:%d) KeIpiGenericCall on CPU%d\n", __FILE__, __LINE__,
KeGetCurrentProcessorNumber());
KeRaiseIrql(SYNCH_LEVEL, &oldIrql);
@@ -185,7 +187,7 @@
KeLowerIrql(oldIrql);
- DPRINT("KeIpiGenericCall on CPU%d done\n", KeGetCurrentProcessorNumber());
+ DbgPrint("(%s:%d) KeIpiGenericCall on CPU%d done\n", __FILE__, __LINE__,
KeGetCurrentProcessorNumber());
}