HalpApicInitializeLocalUnit

UINT64 __stdcall HalpApicInitializeLocalUnit(PVOID BaseVa, PVOID EndVa, UINT64 LevelsNeeded){
  int v3; 
  int v4; 
  int v5; 
  UINT64 result; 
  __int64 v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned int v14; 
  bool v15; 
  unsigned int *v16; 
  INT64 v17[3]; 
  INT64 v18; 
  unsigned int v19; 
  unsigned int *v20; 
  LODWORD(v18) = 0;
  v4 = v3;
  LODWORD(v17[0]) = 0;
  v5 = LevelsNeeded;
  if( !HalpApicX2Mode && !HalpApicUsingMsrs )
  {
    if( !HalpLocalApicPhysical.QuadPart )
      return 3221225486i64;
    if( !HalpLocalApic )
    {
      HalpLocalApic = (UINT64)HalMapIoSpace(HalpLocalApicPhysical, 0x1000ui64, MmNonCached);
      if( !HalpLocalApic )
        return 3221225626i64;
    }
  }
  result = HalpApicSetupRegisterAccess();
  if( (result & 0x80000000) == 0i64 )
  {
    if( !*((_BYTE *)BaseVa + 27) && HalpApicIsCmciImplemented(&v18, v17) )
    {
      *((_DWORD *)BaseVa + 8) = v18;
      *((_DWORD *)BaseVa + 9) = v17[0];
    }
    v8 = *((unsigned int *)BaseVa + 8);
    v9 = v4 | 0x10000;
    if( (_DWORD)v8 )
      ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(v8, v9);
    v10 = *((unsigned int *)BaseVa + 9);
    if( (_DWORD)v10 )
      ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(v10, v9);
    HalpApicSetPriority(0i64, 0xFui64);
    v11 = v5 | 0x100;
    if( HalpApicDirectedEndOfInterruptModeEnabled
      && (((__int64(__fastcall *)(__int64))HalpApicRead)(48i64) & 0x1000000) != 0 )
    {
      v11 |= 0x1000u;
    }
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(240i64, v11);
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(800i64, v4 | 0x30000u);
    ((void(__fastcall *)(__int64, __int64))HalpApicWrite)(992i64, 11i64);
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(880i64, v19);
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(832i64, v9);
    v12 = ((__int64(__fastcall *)(__int64))HalpApicRead)(848i64);
    v13 = v12;
    LODWORD(v13) = v12 | 0x10000;
    ((void(__fastcall *)(__int64, __int64))HalpApicWrite)(848i64, v13);
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(848i64, v9);
    ((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(864i64, v4 | 0x18400u);
    v14 = ((__int64(__fastcall *)(__int64))HalpApicRead)(32i64);
    v15 = HalpApicX2Mode == 0;
    v16 = v20;
    *v20 = v14;
    if( v15 )
      *v16 = HIBYTE(v14);
    if( *((_BYTE *)BaseVa + 27) )
      return 0i64;
    LODWORD(result) = HalpApicDescribeLocalLines(BaseVa);
    if( (result & 0x80000000) == 0i64 )
    {
      *((_BYTE *)BaseVa + 27) = 1;
      return 0i64;
    }
  }
  return result;
}

Referenced by:

No references.