EmonConfigureCounter
UINT64 __stdcall EmonConfigureCounter(UINT64 a1, CHAR a2, INT64 a3, UINT64 a4, CHAR a5){
int v5;
__int64 v6;
char v7;
unsigned int v8;
__int64 v9;
UINT64 result;
unsigned int v11;
UINT64 v12;
UINT64 v13;
int v14;
unsigned __int64 v15;
unsigned __int64 v16;
__int64 v17;
v5 = a3;
v6 = (unsigned int)a4;
v7 = a1;
if( (unsigned int)a1 >= *(&CmpDummyThreadEvent + 1223) )
{
v14 = a1 - *(&CmpDummyThreadEvent + 1223);
v15 = __readmsr(0x38Fu);
v16 = ~(15i64 << (4 * ((unsigned __int8)a1 - *(&CmpDummyThreadEvent + 4892)))) & __readmsr(0x38Du);
if( a2 )
{
v16 |= v6;
if( a5 )
v16 |= 8i64 << (4 * (unsigned __int8)v14);
if( *(&CmpDummyThreadEvent + 1236) < 0x40u )
v17 = (1i64 << *(&CmpDummyThreadEvent + 4944)) - 1;
else
v17 = -1i64;
__writemsr(v14 + 777, v17 & -(a5 != 0 ? a3 : 0));
_bittestandset64((__int64 *)&v15, (unsigned int)(v14 + 32));
}
else
{
_bittestandreset64((__int64 *)&v15, (unsigned int)(v14 + 32));
}
__writemsr(0x38Fu, v15);
v12 = v16;
result = v16;
v11 = 909;
goto LABEL_18;
}
if( !a2 )
{
result = 0i64;
v11 = a1 + 390;
LODWORD(v13) = 0;
LABEL_19:
__writemsr(v11, __PAIR64__(v13, result));
return result;
}
v8 = a4 | (a5 != 0 ? 5242880 : 0x400000);
if( *(&CmpDummyThreadEvent + 1231) < 0x40u )
v9 = (1i64 << *(&CmpDummyThreadEvent + 4924)) - 1;
else
v9 = -1i64;
__writemsr(a1 + 193, v9 & -(__int64)(v5 & (unsigned int)-(a5 != 0)));
result = v8;
__writemsr(a1 + 390, v8);
if( *(&CmpDummyThreadEvent + 1216) >= 2u )
{
v11 = 911;
result = __readmsr(0x38Fu) | (1i64 << v7);
v12 = result;
LABEL_18:
v13 = HIDWORD(v12);
goto LABEL_19;
}
return result;
}Referenced by:
EmonDisableMonitoring
EmonEnableMonitoring
EmonRestartProfiling