HalpTscAdvSynchToLeader
INT64 __fastcall HalpTscAdvSynchToLeader(UINT64 a1){
unsigned __int64 v1;
__int64 v2;
INT64 v3;
__int64 v4;
unsigned int i;
__int64 v6;
INT64 v7;
__int64 v8;
unsigned int v9;
unsigned int v10;
__int64 v11;
INT64 result;
signed __int32 v13[8];
__int64 v14;
v1 = (unsigned __int64)(unsigned int)a1 << 7;
v2 = (unsigned int)a1;
*(_QWORD *)(v1 + TscRequest + 8) = 0i64;
_InterlockedOr(v13, 0);
_InterlockedExchange((volatile __int32 *)(v1 + TscRequest), 1);
while( *(_DWORD *)(v1 + TscRequest) == 1 )
_mm_pause();
v3 = 0i64;
v4 = 0x7FFFFFFFFFFFFFFFi64;
for( i = 0; i < HalpTscSyncRecalculateSkews; ++i )
{
v6 = v4;
v7 = HalpTscAdvSynchCalculateRemoteDelta((unsigned int)v2, (unsigned int)HalpTscRequestedIterations, 0i64);
v8 = TscRequest;
*(_QWORD *)(v1 + TscRequest + 8) = 0i64;
*(_DWORD *)(v1 + v8 + 4) = 100;
_InterlockedOr(v13, 0);
_InterlockedExchange((volatile __int32 *)(v1 + TscRequest), 2);
while( *(_DWORD *)(v1 + TscRequest) == 2 )
_mm_pause();
v3 = HalpTscAdvSynchCalculateRemoteDelta((unsigned int)v2, (unsigned int)HalpTscRequestedIterations, 0i64);
v4 = (v7 - v3) / 100;
if( v4 >= v6 )
v4 = v6;
}
v9 = 0;
v10 = 0;
*(_DWORD *)(HalpTscSkewOffset + 4 * v2) = v4;
do
{
v11 = v4 - v3;
if( !v9 )
{
*(_QWORD *)(v1 + TscRequest + 8) = v11;
_InterlockedOr(v13, 0);
_InterlockedExchange((volatile __int32 *)(v1 + TscRequest), 1);
while( *(_DWORD *)(v1 + TscRequest) == 1 )
_mm_pause();
}
v3 = HalpTscAdvSynchCalculateRemoteDelta((unsigned int)v2, (unsigned int)HalpTscRequestedIterations, 0i64);
if( !v9 )
{
LODWORD(v14) = v10;
HalpTscTraceProcessorSynchronization(*((unsigned int *)KeGetCurrentPrcb() + 9), (unsigned int)v2, v3, v11, v14);
}
++v9;
if( (unsigned __int64)(v3 + 24) > 0x30 )
v9 = 0;
++v10;
}
while( v10 < 0x32 && v9 < 2 );
result = HalpTscWaves;
*(_DWORD *)(HalpTscWaves + 4 * v2) = v10;
return result;
}Referenced by:
HalpTscAdvSynchLeader