windows-nt/Source/XPSP1/NT/base/ntos/ke/amd64/flush.c
2020-09-26 16:20:57 +08:00

180 lines
3.1 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
flush.c
Abstract:
This module implements AMD64 machine dependent kernel functions to
flush the data and instruction caches on all processors.
Author:
David N. Cutler (davec) 22-Apr-2000
Environment:
Kernel mode only.
Revision History:
--*/
#include "ki.h"
//
// Define prototypes for forward referenced functions.
//
VOID
KiInvalidateAllCachesTarget (
IN PKIPI_CONTEXT SignalDone,
IN PVOID Parameter1,
IN PVOID Parameter2,
IN PVOID Parameter3
);
BOOLEAN
KeInvalidateAllCaches (
IN BOOLEAN AllProcessors
)
/*++
Routine Description:
This function writes back and invalidates the cache on all processors
that are currently running threads which are children of the current
process or on all processors in the host configuration.
Arguments:
AllProcessors - Supplies a boolean value that determines which data
caches are flushed.
Return Value:
TRUE is returned as the function value.
--*/
{
KIRQL OldIrql;
PKPRCB Prcb;
PKPROCESS Process;
KAFFINITY TargetProcessors;
//
// Compute the target set of processors, disable context switching,
// and send the writeback invalidate all to the target processors,
// if any, for execution.
//
#if !defined(NT_UP)
if (AllProcessors != FALSE) {
OldIrql = KeRaiseIrqlToSynchLevel();
Prcb = KeGetCurrentPrcb();
TargetProcessors = KeActiveProcessors;
} else {
KiLockContextSwap(&OldIrql);
Prcb = KeGetCurrentPrcb();
Process = Prcb->CurrentThread->ApcState.Process;
TargetProcessors = Process->ActiveProcessors;
}
//
// Send packet to target processors.
//
TargetProcessors &= Prcb->NotSetMember;
if (TargetProcessors != 0) {
KiIpiSendPacket(TargetProcessors,
KiInvalidateAllCachesTarget,
NULL,
NULL,
NULL);
}
#endif
//
// Invalidate cache on current processor.
//
WritebackInvalidate();
//
// Wait until all target processors have finished and complete packet.
//
#if !defined(NT_UP)
if (TargetProcessors != 0) {
KiIpiStallOnPacketTargets(TargetProcessors);
}
//
// Lower IRQL and unlock as appropriate.
//
if (AllProcessors != FALSE) {
KeLowerIrql(OldIrql);
} else {
KiUnlockContextSwap(OldIrql);
}
#endif
return TRUE;
}
#if !defined(NT_UP)
VOID
KiInvalidateAllCachesTarget (
IN PKIPI_CONTEXT SignalDone,
IN PVOID Parameter1,
IN PVOID Parameter2,
IN PVOID Parameter3
)
/*++
Routine Description:
This is the target function for writeback invalidating the cache on
target processors.
Arguments:
SignalDone - Supplies a pointer to a variable that is cleared when the
requested operation has been performed.
Parameter2 - Parameter3 - not used.
Return Value:
None.
--*/
{
//
// Write back invalidate current cache.
//
KiIpiSignalPacketDone(SignalDone);
WritebackInvalidate();
return;
}
#endif