KeInvalidateRangeAllCachesNoIpi
VOID __stdcall KeInvalidateRangeAllCachesNoIpi(VOID *BaseAddress, UINT64 Length){
char *v2;
INT64 CFlushSize;
char *v4;
if( (unsigned int)Length >= KiLargestCacheSize )
{
KeInvalidateAllCaches();
}
else
{
v2 = (char *)BaseAddress + (unsigned int)Length;
CFlushSize = KeGetCurrentPrcb()->CFlushSize;
v4 = (char *)((unsigned __int64)BaseAddress & ~(CFlushSize - 1));
if( ((unsigned __int64)KeFeatureBits & 0x800000000i64) != 0 )
{
KiFlushCacheLines(
(unsigned __int64)BaseAddress & ~(CFlushSize - 1),
(~(CFlushSize - 1) & (unsigned __int64)&v2[CFlushSize - 1]) - (_QWORD)v4,
CFlushSize);
}
else
{
for( ; v4 < v2; v4 += CFlushSize )
_mm_clflush(v4);
}
}
}Referenced by:
HalpIommuAllocateAndZeroPageTable
HalpIommuInitializeDmarPageTable
HalpIommuMapLogical
HalpIommuMapLogicalRange
HalpIommuUnmapLogicalRange
IvtInitializeIdentityMappings
KeInvalidateRangeAllCaches
MiFlushCacheForAttributeChange