HalpAcpiTableCacheInit

VOID __fastcall HalpAcpiTableCacheInit(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  char v1; 
  _LOADER_PARAMETER_EXTENSION *Extension; 
  UINT64 *AcpiTable; 
  _LARGE_INTEGER v5; 
  unsigned int *v6; 
  __int64 v7; 
  __int64 v8; 
  _DESCRIPTION_HEADER *v9; 
  _DESCRIPTION_HEADER *v10; 
  _LARGE_INTEGER *v11; 
  unsigned int AcpiTableSize; 
  unsigned int v13; 
  size_t v14; 
  UINT8 *Memory; 
  INT64 v16; 
  UINT64 Protection; 
  UINT64 Protectiona; 
  UINT8 *a2; 

  a2 = 0i64;
  v1 = 0;
  if( !*(&WheapErrorSourceTable + 133) )
  {
    HalpAcpiTableCacheLock.Owner = 0i64;
    HalpAcpiTableCacheLock.Contention = 0;
    *(_DWORD *)&HalpAcpiTableCacheLock.gap14[8] = 0;
    *(_QWORD *)&HalpAcpiTableCacheLock.gap14[20] = &HalpAcpiTableCacheLock.gap14[12];
    *(_QWORD *)&HalpAcpiTableCacheLock.gap14[12] = &HalpAcpiTableCacheLock.gap14[12];
    *(&WheapErrorSourceTable + 134) = (char *)&WheapErrorSourceTable + 1064;
    *(&WheapErrorSourceTable + 133) = (char *)&WheapErrorSourceTable + 1064;
    HalpAcpiTableCacheLock.Count = 1;
    *(_WORD *)&HalpAcpiTableCacheLock.gap14[4] = 1;
    HalpAcpiTableCacheLock.gap14[6] = 6;
    if( HalpAcpiFindRsdp(LoaderBlock, &a2) >= 0 )
    {
      Extension = LoaderBlock->Extension;
      AcpiTable = (UINT64 *)Extension->AcpiTable;
      if( AcpiTable )
      {
        AcpiTableSize = Extension->AcpiTableSize;
        if( AcpiTableSize )
        {
          v13 = HalpAcpiCalculateCacheSizeForOverrideTables((INT64)Extension->AcpiTable, AcpiTableSize);
          v14 = v13;
          if( v13 )
          {
            Memory = HalpAcpiAllocateMemory(LoaderBlock, v13);
            v16 = (INT64)Memory;
            if( Memory )
            {
              memset(Memory, 0i64, v14);
              LODWORD(Protection) = AcpiTableSize;
              HalpAcpiCacheOverrideTables((INT64)LoaderBlock, v16, v14, AcpiTable, Protection);
            }
          }
        }
      }
      if( HalpAcpiGetCachedTable(0x54445352ui64, 0i64, 0i64) || HalpAcpiGetCachedTable(0x54445358ui64, 0i64, 0i64) )
        v1 = 1;
      v5 = *(_LARGE_INTEGER *)a2;
      if( *(_QWORD *)a2 == -1i64
        || (LODWORD(Protection) = 4,
            (v6 = (unsigned int *)HalpMap(
                                    *(_LARGE_INTEGER *)a2,
                                    (_MEMORY_CACHING_TYPE)(((*(_QWORD *)a2 & 0xFFFui64) + 4131) >> 12),
                                    MmCached,
                                    0,
                                    Protection)) == 0i64) )
      {
        if( !v1 )
          DbgPrint("**** HalpAcpiTableCacheInit: Unable to map RSDT\n");
      }
      else if( *v6 == 1413763928 || *v6 == 1413763922 )
      {
        v7 = v6[1];
        HalpUnmapVirtualAddress(v6, ((unsigned __int64)((unsigned __int16)v6 & 0xFFF) + 4131) >> 12, 0);
        LODWORD(Protectiona) = 4;
        v8 = (unsigned int)v7;
        v9 = (_DESCRIPTION_HEADER *)HalpMap(
                                      v5,
                                      (_MEMORY_CACHING_TYPE)((v7
                                                            + (unsigned __int64)(v5.anonymous_0.LowPart & 0xFFF)
                                                            + 4095) >> 12),
                                      MmCached,
                                      0,
                                      Protectiona);
        v10 = v9;
        if( v9 )
        {
          v11 = HalpAcpiCopyBiosTable(LoaderBlock, v9, v5);
          if( v11 )
          {
            HalpUnmapVirtualAddress(v10, (v8 + (unsigned __int64)((unsigned __int16)v10 & 0xFFF) + 4095) >> 12, 0);
            HalpAcpiCacheTable(LoaderBlock, v11);
          }
          else
          {
            if( !v1 )
              DbgPrint("**** HalpAcpiTableCacheInit: Unable to cache RSDT.\n");
            HalpUnmapVirtualAddress(v10, (v8 + (unsigned __int64)((unsigned __int16)v10 & 0xFFF) + 4095) >> 12, 0);
          }
        }
        else if( !v1 )
        {
          DbgPrint("**** HalpAcpiTableCacheInit: Unable to remap RSDT.\n");
        }
      }
      else if( !v1 )
      {
        DbgPrint("**** HalpAcpiTableCacheInit: The RSDT pointer is invalid.\n");
        KeBugCheckEx(0xA5u, (PVOID)0x1000A, 0i64, 0i64, 0i64);
      }
    }
  }
}

Referenced by:

HalpAcpiGetTable
HalpSetupAcpiPhase0