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