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