HalpIommuInitSystem

NTSTATUS __stdcall HalpIommuInitSystem(
        _HAL_INIT_PHASE HalPhase,
        UINT64 ProcessorNumber,
        _LOADER_PARAMETER_BLOCK *LoaderBlock){
  INT64 v3; 
  int inited; 
  INT64 v9; 
  INT64 v10; 
  INT64 v11; 
  INT64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int RootIommuFaultPolicy; 

  if( HalPhase == HalInitPhaseBspProcEarly
    || HalIommuDispatch
    && (*(unsigned __int8(__fastcall **)(_HAL_INIT_PHASE, UINT64))HalIommuDispatch)(HalPhase, ProcessorNumber) )
  {
    inited = 0;
    if( HalPhase == HalInitPhaseBspProcEarly )
    {
      qword_140C49B58 = &qword_140C49B50;
      qword_140C49B50 = (INT64)&qword_140C49B50;
      qword_140C49B38 = &qword_140C49B30;
      qword_140C49B30 = &qword_140C49B30;
      off_140C008B0[0] = (__int64(__fastcall *)())HalpIommuRegisterDispatchTable;
      RootIommuFaultPolicy = HalpIommuGetRootIommuFaultPolicy((INT64)LoaderBlock);
      if( RootIommuFaultPolicy > 1 )
        RootIommuFaultPolicy = 0;
      dword_140C49BE4 = RootIommuFaultPolicy;
      qword_140C00A30 = (__int64)HalpIommuReportIommuFault;
      return inited;
    }
    if( HalPhase == HalInitPhaseBspSystemEarlyAcpiReady )
    {
      inited = HalpIommuInitDiscard((INT64)LoaderBlock);
      if( inited >= 0 )
        return HalpIommuInitializeDmaGuardPolicy((__int64)LoaderBlock, v14, v15);
    }
    else
    {
      if( HalPhase != HalInitPhaseBspSystemEarlyInterruptsAlmostReady )
      {
        if( HalPhase == HalInitPhaseBspSystemLate )
        {
          inited = IommuInitializeLibrary();
          if( inited < 0 )
            return inited;
          inited = HalpIommuInitializeDmar();
          if( inited < 0 )
            return inited;
          off_140C009C0[0] = (__int64(__fastcall *)())HalpIommuBlockDevice;
          off_140C009C8[0] = (__int64(__fastcall *)())HalpIommuUnblockDevice;
          off_140C009D0[0] = (__int64(__fastcall *)())HalpGetIommuInterface;
          off_140C00A38[0] = (__int64(__fastcall *)())HalpIommuDmaRemappingCapable;
          inited = HalpIommuInitInterrupts(v10, v9, v11, v12);
          if( inited < 0 )
            return inited;
          HalpIommuEnableInterrupts();
          if( !byte_140C49B2C )
            return inited;
          return IommupHvSetRootFaultReportingReady();
        }
        else
        {
          if( HalPhase != HalInitPhasePnSystemLate )
          {
            if( HalPhase == HalInitPhaseLateSystemActionsTelemetryReady )
              HalpIommuLogEarlyFault();
            return inited;
          }
          return HalpIommuInitInterrupts(*(INT64 *)&HalPhase, ProcessorNumber, (INT64)LoaderBlock, v3);
        }
      }
      dword_140C49BE0 = (unsigned __int8)HalpInterruptIsRemappingRequired() != 0;
      inited = HalpIommuProcessReservations((INT64)LoaderBlock);
      if( inited >= 0 )
        return HalpIommuInitializeAll(0, (INT64)LoaderBlock, v13);
    }
    return inited;
  }
  if( HalPhase == HalInitPhaseBspSystemEarlyAcpiReady
    && !(*(unsigned __int8(__fastcall **)(_QWORD, UINT64))HalIommuDispatch)(*(_QWORD *)&HalPhase, ProcessorNumber) )
  {
    HalpInterruptSetX2ApicPolicy(0);
  }
  return 0;
}

Referenced by:

No references.