KiInitializeCacheErrataSupport
UINT8 __stdcall KiInitializeCacheErrataSupport(UINT8 LastProcessor){
unsigned int v3;
unsigned int *PoolWithTag;
unsigned int *v5;
unsigned int v6;
unsigned int *i;
if( KiTLBCOverride )
{
KiDisableCacheErrataSource();
if( !LastProcessor )
return 1;
LABEL_3:
KiCacheErrataMonitor = 0i64;
return 1;
}
if( !LastProcessor )
return 1;
v3 = KeNumberProcessors_0;
if( (_DWORD)KeNumberProcessors_0 == 1 )
{
KiTLBCOverride = KeNumberProcessors_0;
KiDisableCacheErrataSource();
goto LABEL_3;
}
PoolWithTag = (unsigned int *)ExAllocatePoolWithTag(
NonPagedPoolNx,
16 * ((unsigned int)KeNumberProcessors_0 + 16i64),
0x2020654Bui64);
v5 = PoolWithTag;
if( PoolWithTag )
{
*PoolWithTag = 0x393870 / v3;
KeInitializeProfileCallback((INT64)(PoolWithTag + 2), (INT64)KiMonitorCacheErrata, 0i64, 0);
v6 = 0;
for( i = v5 + 64; v6 < v3; *(i - 1) = v6 % v3 )
{
*(_QWORD *)i = -1i64;
i[2] = 0;
i += 4;
++v6;
}
_InterlockedExchange64(&KiCacheErrataMonitor, (__int64)v5);
KeSetIntervalProfile(*v5, ProfileTime);
if( KeStartProfile((ULONG_PTR)(v5 + 2)) )
return 1;
}
return 0;
}Referenced by:
KiInitMachineDependent