HalpMcaReadError
VOID __stdcall HalpMcaReadError(
INT64 a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT16 PageIrql,
INT64 a9,
_MMSUPPORT_INSTANCE *Vm,
UINT64 a11){
unsigned int v11;
INT64 v12;
char v13;
unsigned __int64 v14;
unsigned int v15;
int v16;
__int64 v17;
int v18;
__int64 v19;
__int64 v20;
unsigned __int64 v21;
char v22;
UINT8 CpuVendor;
int v24;
_BYTE v25[2];
unsigned int v26;
int v27;
INT64 v28[2];
INT64 v29;
INT64 v30;
INT64 v31;
INT64 v32;
_DWORD *v33;
v32 = a4;
v33 = (_DWORD *)a3;
v29 = 0i64;
v11 = -1;
v31 = a2;
v12 = 0i64;
v27 = a1;
v13 = 0;
*(_WORD *)v25 = 0;
*(_OWORD *)v28 = 0i64;
if( !byte_140C50568[0] )
{
v14 = __readmsr(0x179u);
byte_140C50568[0] = v14;
}
v15 = 0;
v26 = byte_140C50568[0];
if( !byte_140C50568[0] )
return;
v16 = 1;
while( 1 )
{
v30 = 0i64;
LODWORD(v17) = HalpWheaReadMsrStatus(a5, v15, (INT64)&v30);
if( v17 >= 0 )
goto LABEL_20;
LOBYTE(v28[1]) = HalpMcaRecoverySupported;
v28[0] = v17;
v29 = a5;
HIDWORD(v28[1]) = v15;
*(_WORD *)v25 = 0;
if( v27 == 16 )
{
if( HalpGetCpuVendor() == 1 )
HalpMcaReadErrorUncorrectedAMD((INT64)v28, v25);
else
HalpMcaReadErrorUncorrectedUnknown((INT64)v28, v25);
if( v25[0] )
{
if( !v25[1] || !v13 )
{
v12 = v28[0];
v11 = v15;
v13 = v25[1];
}
if( !v25[1] )
goto LABEL_24;
}
goto LABEL_20;
}
if( v27 != 1 )
break;
HalpMcaReadErrorCorrected((INT64)v28, v25);
if( v25[0] )
{
v12 = v28[0];
v13 = v25[1];
goto LABEL_23;
}
LABEL_20:
if( ++v15 >= v26 )
goto LABEL_24;
}
if( v27 != 17 )
goto LABEL_20;
v12 = v17;
LABEL_23:
v11 = v15;
LABEL_24:
if( v11 != -1 )
{
v18 = v27;
if( v27 != 16 )
{
LODWORD(v19) = HalpGetMcaPcrContext(a5);
v20 = v19;
v21 = __rdtsc();
if( v21 - *(_QWORD *)(v20 + 144) <= 0xBEBC200 && *(_DWORD *)(v20 + 124) == v11 && *(_QWORD *)(v20 + 128) == v12 )
{
if( ++*(_DWORD *)(v20 + 136) > 3u )
__wbinvd();
}
else
{
*(_DWORD *)(v20 + 124) = v11;
*(_QWORD *)(v20 + 128) = v12;
*(_DWORD *)(v20 + 136) = 1;
}
*(_QWORD *)(v20 + 144) = v21;
}
HalpMcaPopulateErrorData(a5, v11, v12, v32, v31);
v22 = HalpMcaRecoverySupported;
CpuVendor = HalpGetCpuVendor();
if( (v12 & 0x2000000000000000i64) != 0 )
{
if( v13 )
{
v24 = 0;
if( v18 == 1 )
v24 = 2;
v16 = v24;
}
}
else if( CpuVendor != 1 || !v22 || (v16 = 0, !v13) )
{
v16 = 2;
}
*v33 = v16;
}
}Referenced by:
HalpCmcPollProcessor