HalpAcpiTableCacheInit

NTSTATUS __stdcall HalpAcpiTableCacheInit(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  NTSTATUS Rsdp; 
  char v2; 
  __int64 v5; 
  UINT64 *v6; 
  LARGE_INTEGER v7; 
  UINT64 v8; 
  __int64 v9; 
  __int64 v10; 
  DESCRIPTION_HEADER *v11; 
  DESCRIPTION_HEADER *v12; 
  LARGE_INTEGER *v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  UINT8 *Memory; 
  INT64 v18; 
  ULONG_PTR BugCheckParameter4; 
  LARGE_INTEGER *v20; 
  v20 = 0i64;
  Rsdp = 0;
  v2 = 0;
  if( HalpAcpiTableCacheList )
    return Rsdp;
  HalpAcpiTableCacheLock.Owner = 0i64;
  HalpAcpiTableCacheLock.Contention = 0;
  HalpAcpiTableCacheLock.Event.Header.SignalState = 0;
  HalpAcpiTableCacheLock.Event.Header.WaitListHead.Blink = &HalpAcpiTableCacheLock.Event.Header.WaitListHead;
  HalpAcpiTableCacheLock.Event.Header.WaitListHead.Flink = &HalpAcpiTableCacheLock.Event.Header.WaitListHead;
  qword_140CDB288 = (__int64)&HalpAcpiTableCacheList;
  HalpAcpiTableCacheList = (__int64)&HalpAcpiTableCacheList;
  HalpAcpiTableCacheLock.Count = 1;
  LOWORD(HalpAcpiTableCacheLock.Event.Header.Lock) = 1;
  HalpAcpiTableCacheLock.Event.Header.Size = 6;
  Rsdp = HalpAcpiFindRsdp((__int64)LoaderBlock, (__int64 *)&v20);
  if( Rsdp < 0 )
    return Rsdp;
  v5 = *((_QWORD *)LoaderBlock + 30);
  v6 = *(UINT64 **)(v5 + 120);
  if( v6 )
  {
    v14 = *(_DWORD *)(v5 + 128);
    if( v14 )
    {
      v15 = HalpAcpiCalculateCacheSizeForOverrideTables(*(_QWORD *)(v5 + 120), v14);
      v16 = v15;
      if( v15 )
      {
        Memory = HalpAcpiAllocateMemory(LoaderBlock, v15);
        v18 = (INT64)Memory;
        if( Memory )
        {
          memset((INT64)Memory, 0i64);
          LODWORD(BugCheckParameter4) = v14;
          HalpAcpiCacheOverrideTables((INT64)LoaderBlock, v18, v16, v6, BugCheckParameter4);
        }
      }
    }
  }
  if( HalpAcpiGetCachedTable(0x54445352ui64, 0i64, 0i64) || HalpAcpiGetCachedTable(0x54445358ui64, 0i64, 0i64) )
    v2 = 1;
  v7 = *v20;
  if( v20->QuadPart == -1
    || (v8 = HalpMap(*v20, (MEMORY_CACHING_TYPE)(((v20->QuadPart & 0xFFFui64) + 4131) >> 12), 1u)) == 0 )
  {
    if( v2 )
      return Rsdp;
    DbgPrint("**** HalpAcpiTableCacheInit: Unable to map RSDT\n");
    return -1073741670;
  }
  if( *(_DWORD *)v8 != 1413763928 && *(_DWORD *)v8 != 1413763922 )
  {
    if( !v2 )
    {
      DbgPrint("**** HalpAcpiTableCacheInit: The RSDT pointer is invalid.\n");
      KeBugCheckEx(0xA5u, 0x1000Aui64, 0i64, 0i64, 0i64);
    }
    return Rsdp;
  }
  v9 = *(unsigned int *)(v8 + 4);
  HalpUnmapVirtualAddress((PVOID)v8, ((v8 & 0xFFF) + 4131) >> 12, 0);
  v10 = (unsigned int)v9;
  v11 = (DESCRIPTION_HEADER *)HalpMap(
                                v7,
                                (MEMORY_CACHING_TYPE)((v9 + (unsigned __int64)(v7.LowPart & 0xFFF) + 4095) >> 12),
                                1u);
  v12 = v11;
  if( !v11 )
  {
    if( v2 )
      return Rsdp;
    DbgPrint("**** HalpAcpiTableCacheInit: Unable to remap RSDT.\n");
    return -1073741670;
  }
  v13 = HalpAcpiCopyBiosTable(LoaderBlock, v11, v7);
  if( v13 )
  {
    HalpUnmapVirtualAddress(v12, (v10 + (unsigned __int64)((unsigned __int16)v12 & 0xFFF) + 4095) >> 12, 0);
    HalpAcpiCacheTable(LoaderBlock, v13);
  }
  else
  {
    if( !v2 )
    {
      DbgPrint("**** HalpAcpiTableCacheInit: Unable to cache RSDT.\n");
      Rsdp = -1073741670;
    }
    HalpUnmapVirtualAddress(v12, (v10 + (unsigned __int64)((unsigned __int16)v12 & 0xFFF) + 4095) >> 12, 0);
  }
  return Rsdp;
}

Referenced by:

HalpAcpiGetTable
HalpSetupAcpiPhase0