HalpMcaReadError
INT64 __fastcall HalpMcaReadError(INT64 a1, INT64 a2, INT64 *a3, INT64 a4, INT64 a5){
unsigned int v5;
unsigned int v6;
INT64 v7;
BYTE v8;
unsigned __int64 v9;
unsigned int v10;
int v11;
INT64 MsrStatus;
int v13;
INT64 McaPcrContext;
unsigned __int64 v15;
char v16;
UINT8 CpuVendor;
int v18;
BYTE v20[2];
unsigned int v21;
int v22;
INT64 v23[2];
INT64 v24;
INT64 v25;
INT64 v26;
INT64 v27;
INT64 *v28;
v5 = 0;
v27 = a4;
v28 = a3;
v24 = 0i64;
v6 = -1;
v26 = a2;
v7 = 0i64;
v22 = a1;
v8 = 0;
*(_WORD *)v20 = 0;
*(_OWORD *)v23 = 0i64;
if( !HalpMcaNumberOfBanks )
{
v9 = __readmsr(0x179u);
HalpMcaNumberOfBanks = v9;
}
v10 = 0;
v21 = (unsigned __int8)HalpMcaNumberOfBanks;
if( !HalpMcaNumberOfBanks )
return(unsigned int)-1073741275;
v11 = 1;
while( 1 )
{
v25 = 0i64;
MsrStatus = HalpWheaReadMsrStatus(a5, v10, (INT64)&v25);
if( MsrStatus >= 0 )
goto LABEL_20;
LOBYTE(v23[1]) = HalpMcaRecoverySupported;
v23[0] = MsrStatus;
v24 = a5;
HIDWORD(v23[1]) = v10;
*(_WORD *)v20 = 0;
if( v22 == 16 )
{
if( HalpGetCpuVendor() == 1 )
HalpMcaReadErrorUncorrectedAMD((INT64)v23, v20);
else
HalpMcaReadErrorUncorrectedUnknown((INT64)v23, v20);
if( v20[0] )
{
if( !v20[1] || !v8 )
{
v7 = v23[0];
v6 = v10;
v8 = v20[1];
}
if( !v20[1] )
goto LABEL_24;
}
goto LABEL_20;
}
if( v22 != 1 )
break;
HalpMcaReadErrorCorrected((INT64)v23, v20);
if( v20[0] )
{
v7 = v23[0];
v8 = v20[1];
goto LABEL_23;
}
LABEL_20:
if( ++v10 >= v21 )
goto LABEL_24;
}
if( v22 != 17 )
goto LABEL_20;
v7 = MsrStatus;
LABEL_23:
v6 = v10;
LABEL_24:
if( v6 == -1 )
return(unsigned int)-1073741275;
v13 = v22;
if( v22 != 16 )
{
McaPcrContext = HalpGetMcaPcrContext(a5);
v15 = __rdtsc();
if( v15 - *(_QWORD *)(McaPcrContext + 144) <= 0xBEBC200
&& *(_DWORD *)(McaPcrContext + 124) == v6
&& *(_QWORD *)(McaPcrContext + 128) == v7 )
{
if( ++*(_DWORD *)(McaPcrContext + 136) > 3u )
__wbinvd();
}
else
{
*(_DWORD *)(McaPcrContext + 124) = v6;
*(_QWORD *)(McaPcrContext + 128) = v7;
*(_DWORD *)(McaPcrContext + 136) = 1;
}
*(_QWORD *)(McaPcrContext + 144) = v15;
}
HalpMcaPopulateErrorData(a5, v6, v7, v27, v26);
v16 = HalpMcaRecoverySupported;
CpuVendor = HalpGetCpuVendor();
if( (v7 & 0x2000000000000000i64) != 0 )
{
if( v8 )
{
v18 = 0;
if( v13 == 1 )
v18 = 2;
v11 = v18;
}
}
else if( CpuVendor != 1 || !v16 || (v11 = 0, !v8) )
{
v11 = 2;
}
*(_DWORD *)v28 = v11;
return v5;
}Referenced by:
HalpCmcPollProcessor
HalpHandlePreviousMcaErrorsOnProcessor
HalpMceHandlerCore