mirror of
https://github.com/reactos/reactos.git
synced 2024-07-12 07:35:10 +00:00
- Implement most of SMP KeFlushEntireTb (currently unused though)
- Update KiTbFlushTimeStamp on both UP and MP after flushing svn path=/trunk/; revision=37127
This commit is contained in:
parent
39d59e06dd
commit
380df53cc2
|
@ -994,6 +994,20 @@ KeGetRecommendedSharedDataAlignment(VOID)
|
||||||
return KeLargestCacheLine;
|
return KeLargestCacheLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
KiFlushTargetEntireTb(IN PKIPI_CONTEXT PacketContext,
|
||||||
|
IN PVOID Ignored1,
|
||||||
|
IN PVOID Ignored2,
|
||||||
|
IN PVOID Ignored3)
|
||||||
|
{
|
||||||
|
/* Signal this packet as done */
|
||||||
|
KiIpiSignalPacketDone(PacketContext);
|
||||||
|
|
||||||
|
/* Flush the TB for the Current CPU */
|
||||||
|
KeFlushCurrentTb();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -1003,19 +1017,50 @@ KeFlushEntireTb(IN BOOLEAN Invalid,
|
||||||
IN BOOLEAN AllProcessors)
|
IN BOOLEAN AllProcessors)
|
||||||
{
|
{
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
KAFFINITY TargetAffinity;
|
||||||
|
PKPRCB Prcb = KeGetCurrentPrcb();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Raise the IRQL for the TB Flush */
|
/* Raise the IRQL for the TB Flush */
|
||||||
OldIrql = KeRaiseIrqlToSynchLevel();
|
OldIrql = KeRaiseIrqlToSynchLevel();
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* FIXME: Support IPI Flush */
|
/* FIXME: Use KiTbFlushTimeStamp to synchronize TB flush */
|
||||||
#error Not yet implemented!
|
|
||||||
|
/* Get the current processor affinity, and exclude ourselves */
|
||||||
|
TargetAffinity = KeActiveProcessors;
|
||||||
|
TargetAffinity &= ~KeGetCurrentPrcb()->SetMember;
|
||||||
|
|
||||||
|
/* Make sure this is MP */
|
||||||
|
if (TargetAffinity)
|
||||||
|
{
|
||||||
|
/* Send an IPI TB flush to the other processors */
|
||||||
|
KiIpiSendPacket(TargetAffinity,
|
||||||
|
KiFlushTargetEntireTb,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Flush the TB for the Current CPU */
|
/* Flush the TB for the Current CPU, and update the flush stamp */
|
||||||
KeFlushCurrentTb();
|
KeFlushCurrentTb();
|
||||||
|
|
||||||
/* Return to Original IRQL */
|
#ifdef CONFIG_SMP
|
||||||
|
/* If this is MP, wait for the other processors to finish */
|
||||||
|
if (TargetAffinity)
|
||||||
|
{
|
||||||
|
/* Sanity check */
|
||||||
|
ASSERT(Prcb == (volatile PKPRCB)KeGetCurrentPrcb());
|
||||||
|
|
||||||
|
/* FIXME: TODO */
|
||||||
|
ASSERTMSG("Not yet implemented\n", FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Update the flush stamp and return to original IRQL */
|
||||||
|
InterlockedExchangeAdd(&KiTbFlushTimeStamp, 1);
|
||||||
KeLowerIrql(OldIrql);
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue