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()); }