Newer
Older
AMI-Aptio-BIOS-Reversed / JedecNvDimm / JedecNvDimm.c
@Ajax Dong Ajax Dong 2 days ago 238 KB Init
#include "JedecNvDimm.h"

//
// JedecNvDimm - UEFI Module (Regenerated from IDA)
// Total functions: 150
//

// Function: IoWrite32 @ 0x1000 (0x42 bytes)
// Index: 1/150

// local variable allocation has failed, the output may be wrong!
UINT32 __cdecl IoWrite32(UINTN Port, UINT32 Value)
{
  unsigned __int64 count; // r8
  UINT32 Port_1; // eax
  unsigned __int64 count_1; // rcx
  void *dst; // rdi
  const void *src; // rsi

  Port_1 = Port; /*0x1010*/
  if ( *(_QWORD *)&Value < Port && *(_QWORD *)&Value + count - 1 >= Port ) /*0x1018*/
  {
    src = (const void *)(*(_QWORD *)&Value + count - 1); /*0x1030*/
    dst = (void *)(Port + count - 1); /*0x1033*/
  }
  else
  {
    count_1 = count; /*0x101a*/
    count &= 7u; /*0x101d*/
    count_1 >>= 3; /*0x1024*/
    qmemcpy((void *)Port, *(const void **)&Value, 8 * count_1); /*0x1028*/
    src = (const void *)(*(_QWORD *)&Value + 8 * count_1); /*0x1028*/
    dst = (void *)(Port + 8 * count_1); /*0x1028*/
  }
  qmemcpy(dst, src, count); /*0x103c*/
  return Port_1; /*0x103f*/
}


// Function: IoRead32 @ 0x1050 (0x20 bytes)
// Index: 2/150

UINT32 __cdecl IoRead32(UINTN Port)
{
  unsigned __int64 v1; // rdx

  memset((void *)Port, 0, 8 * (v1 >> 3)); /*0x1066*/
  memset((void *)(Port + 8 * (v1 >> 3)), 0, v1 & 7); /*0x106b*/
  return Port; /*0x106e*/
}


// Function: CpuPause @ 0x10d0 (0x3 bytes)
// Index: 3/150

// (too small: 0x3 bytes)


// Function: IoEoi @ 0x10e0 (0xa bytes)
// Index: 4/150

// (too small: 0xa bytes)


// Function: IoWriteB2F @ 0x10f0 (0x2 bytes)
// Index: 5/150

// (too small: 0x2 bytes)


// Function: IoWriteB2_0 @ 0x1100 (0x2 bytes)
// Index: 6/150

// (too small: 0x2 bytes)


// Function: IoReadB2Status @ 0x1110 (0x3 bytes)
// Index: 7/150

// (too small: 0x3 bytes)


// Function: JedecNvDimmEntry @ 0x1114 (0x3b bytes)
// Index: 8/150

EFI_STATUS JedecNvDimmEntry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  signed __int64 v4; // rbx

  DriverInitLibs((__int64)ImageHandle, SystemTable); /*0x1124*/
  v4 = JedecNvDimmMain(ImageHandle, SystemTable); /*0x1134*/
  if ( v4 < 0 ) /*0x113a*/
    JedecNvDimmUnload(); /*0x113c*/
  return v4; /*0x1149*/
}


// Function: DriverInitLibs @ 0x1150 (0x49b bytes)
// Index: 9/150

void __fastcall DriverInitLibs(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  EFI_BOOT_SERVICES *BootServices; // r10
  signed __int64 EfiStatus; // rax
  __int64 EfiStatus_1; // rbx
  __int64 DriverResult2; // rax
  __int64 BootServices_1; // r10
  __int64 InitStatus1; // rax
  __int64 InitStatus2; // rax
  __int64 InitStatus2_1; // rbx
  __int64 Protocol; // rax
  __int64 ProtoResult1; // rax
  __int64 ProtoResult1_1; // rbx
  UINTN Port; // rax
  UINT16 Value; // dx
  _BYTE *IoPortVal; // rax
  __int16 B2Status; // bx
  bool FlagVal; // bl
  unsigned __int32 IoResult; // edi
  unsigned __int32 LoopIdx; // eax

  ::ImageHandle = ImageHandle; /*0x1169*/
  if ( !ImageHandle ) /*0x117d*/
    DebugAssert( /*0x118c*/
      "e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
      0x33u,
      "gImageHandle != ((void *) 0)");
  ::SystemTable = (__int64)SystemTable; /*0x1191*/
  if ( !SystemTable ) /*0x119b*/
    DebugAssert( /*0x11aa*/
      "e:\\hs\\M... [7270 chars total]


// Function: JedecNvDimmUnload @ 0x15ec (0x183 bytes)
// Index: 10/150

__int64 JedecNvDimmUnload()
{
  __int64 EfiStatus1; // rax
  __int64 EfiStatus1_1; // rbx
  __int64 BootServices; // rax
  __int64 EfiStatus2; // rax
  __int64 EfiStatus3; // rax
  __int64 EfiStatus3_1; // rbx

  if ( qword_1A378 ) /*0x1609*/
    PciExpressNotifyUninit(); /*0x160b*/
  EfiStatus1 = (*(__int64 (__fastcall **)(__int64))(BootServices + 112))(qword_1A398); /*0x161e*/
  EfiStatus1_1 = EfiStatus1; /*0x1634*/
  if ( EfiStatus1 < 0 ) /*0x163a*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", EfiStatus1); /*0x1644*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\DxeRuntimePciExpressLib\\PciExpressLib.c", 0xB2u, "!EFI_ERROR (Status)"); /*0x1658*/
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", EfiStatus1_1); /*0x1665*/
    DebugAssert( /*0x1679*/
      "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm\\DEBUG\\AutoGen.c",
      0x1DBu,
      "!EFI_ERROR (Status)");
  }
  BootServices = BootServices; /*0x167e*/
  if ( !BootServices ) /*0x1688*/
  {
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 0x97u, "gBS != ((void *) 0)"); /*0x169d*/
    BootServices = BootServices; /*0x16a2*/
  }
  EfiStatus2 = (*(__int64 (__fastcall **)(__int64))(BootServices + 112))(qword_1A570); /*0x16b0*/
  if ( EfiStatus2 < 0 ) /*0x16b6*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", EfiStatus2); /*0x16c1*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 0x99u, "!EFI_ERROR (Status)"); /*0x16d5*/
  }
  EfiStatus3 = (*(__int64 (__fastcall **)(__int64))(BootServices + 112))(qword_1A580); /*0x16e8*/
  EfiStatus3_1 = EfiStatus3; /*0x16eb*/
  if ( EfiStatus3 < 0 ) /*0x16f1*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", EfiStatus3); /*0x16fc*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 0x9Cu, "!EFI_ERROR (Status)"); /*0x1710*/
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", EfiStatus3_1); /*0x171e*/
    DebugAssert( /*0x1732*/
      "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm\\DEBUG\\AutoGen.c",
      0x1DEu,
      "!EFI_ERROR (Status)");
  }
  (*(void (__fastcall **)(__int64))(BootServices_0 + 112))(qword_1A338); /*0x1745*/
  return (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 112))(qword_1A340);
}


// Function: JedecNvDimmGetInfo @ 0x1770 (0x19d bytes)
// Index: 11/150

__int64 __fastcall JedecNvDimmGetInfo(__int64 TotalDimm_1)
{
  __int64 SocketId; // rdx
  int ImcId; // eax
  __int64 BufferPtr; // rcx
  _DWORD *ImcId_1; // rdx
  int DimmCount; // eax
  __int64 DimmId; // rcx
  _DWORD *ImcId_2; // rdx
  unsigned int InfoResult; // eax
  __int64 ByteOffset; // rcx
  _DWORD *ImcId_3; // rdx
  unsigned int MemSize; // eax
  __int64 BaseAddr; // rcx
  _DWORD *ImcId_4; // rdx
  __int64 DimmIndex_1; // rcx
  char EnergyType; // [rsp+20h] [rbp-18h]
  char SlotNum; // [rsp+21h] [rbp-17h]
  unsigned __int8 DimmIndex; // [rsp+22h] [rbp-16h]
  int ConfigVal; // [rsp+24h] [rbp-14h]
  unsigned __int8 TotalDimm; // [rsp+40h] [rbp+8h]

  TotalDimm = TotalDimm_1; /*0x1770*/
  SlotNum = (unsigned __int8)TotalDimm_1 / 2; /*0x1782*/
  EnergyType = TotalDimm_1 & 1; /*0x1793*/
  SocketId = TotalDimm_1 & 1; /*0x179d*/
  LOBYTE(TotalDimm_1) = SlotNum; /*0x17a1*/
  ImcId = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(TotalDimm_1, SocketId, 117459212); /*0x17ac*/
  BufferPtr = 56LL * TotalDimm; /*0x17b4*/
  ImcId_1 = ::ImcId; /*0x17b8*/
  *(_DWORD *)((char *)&::ImcId[1] + BufferPtr) = ImcId; /*0x17bf*/
  LOBYTE(ImcId_1) = EnergyType; /*0x17c9*/
  LOBYTE(BufferPtr) = SlotNum; /*0x17cd*/
  DimmCount = (*(__int64 (__fastcall **)(__int64, _DWORD *, __int64))(qword_C5470 + 40))(BufferPtr, ImcId_1, 117459216); /*0x17d8*/
  DimmId = 56LL * TotalDimm; /*0x17e0*/
  ImcId_2 = ::ImcId; /*0x17e4*/
  *(_DWORD *)((char *)&::ImcId[2] + DimmId) = DimmCount; /*0x17eb*/
  LOBYTE(ImcId_2) = EnergyType; /*0x17f5*/
  LOBYTE(DimmId) = SlotNum; /*0x17f9*/
  InfoResult = (*(__int64 (__fastcall **)(__int64, _DWORD *, __int64))(qword_C5470 + 40))(DimmId, ImcId_2, 2384); /*0x1804*/
  ByteOffset = 56LL * TotalDimm; /*0x180c*/
  ImcId_3 = ::ImcId; /*0x1810*/
  *(_QWORD *)((char *)&::ImcId[4] + ByteOffset) = InfoResult; /*0x1819*/
  LOBYTE(ImcId_3) = EnergyType; /*0x1824*/
  LOBYTE(ByteOffset) = SlotNum; /*0x1828*/
  MemSize = (*(__int64 (__fastcall **)(__int64, _DWORD *, __int64))(qword_C5470 + 40))(ByteOffset, ImcId_3, 2388); /*0x1833*/
  BaseAddr = 56LL * TotalDimm; /*0x183b*/
  ImcId_4 = ::ImcId; /*0x183f*/
  *(_QWORD *)((char *)&::ImcId[6] + BaseAddr) = MemSize; /*0x1848*/
  LOBYTE(ImcId_4) = EnergyType; /*0x1853*/
  LOBYTE(BaseAddr) = SlotNum; /*0x1857*/
  ConfigVal = (*(__int64 (__fastcall **)(__int64, _DWORD *, __int64))(qword_C5470 + 40))(BaseAddr, ImcId_4, 117459220); /*0x1865*/
  ::ImcId[14 * TotalDimm] = ConfigVal; /*0x187d*/
  ::ImcId[14 * TotalDimm + 8] = ConfigVal & 0xFFFFFF; /*0x1899*/
  for ( DimmIndex = 0; DimmIndex < 3u; ++DimmIndex ) /*0x189d*/
  {
    DimmIndex_1 = DimmIndex; /*0x18c8*/
    LOBYTE(DimmIndex_1) = SlotNum; /*0x18d7*/
    ::ImcId[14 * TotalDimm + 9 + DimmIndex] = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))(qword_C5470 + 8))( /*0x1900*/
                                                DimmIndex_1,
                                                (unsigned __int8)(DimmIndex + 3 * (EnergyType & 1)),
                                                117457036);
  }
  return 0; /*0x1908*/
}


// Function: JedecNvDimmSetPowerLimits @ 0x1910 (0x82 bytes)
// Index: 12/150

__int64 __fastcall JedecNvDimmSetPowerLimits(__int64 a1)
{
  __int64 v1; // rdx
  __int64 v2; // rdx
  __int64 v3; // rcx
  char v5; // [rsp+20h] [rbp-18h]
  char v6; // [rsp+21h] [rbp-17h]
  unsigned int v7; // [rsp+24h] [rbp-14h]

  v6 = (unsigned __int8)a1 / 2; /*0x1922*/
  v5 = a1 & 1; /*0x1933*/
  v1 = a1 & 1; /*0x193d*/
  LOBYTE(a1) = v6; /*0x1941*/
  v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(a1, v1, 117459220); /*0x194f*/
  if ( v7 >> 31 == 1 ) /*0x1960*/
  {
    LOBYTE(v2) = v5; /*0x1979*/
    LOBYTE(v3) = v6; /*0x197d*/
    (*(void (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))(v3, v2, 117459220, v7 & 0x7FFFFFFF); /*0x1988*/
  }
  return 0; /*0x198d*/
}


// Function: JedecNvDimmReadData @ 0x1994 (0x162 bytes)
// Index: 13/150

__int64 __fastcall JedecNvDimmReadData(__int64 IndexVal_1)
{
  __int64 ByteOffset1; // rdx
  __int64 ByteOffset2; // rdx
  __int64 BufferPtr; // rcx
  _DWORD *ImcId; // rcx
  _DWORD *ImcId_1; // rcx
  __int64 DimmId; // rdx
  _DWORD *ImcId_2; // rcx
  __int64 PageAddr; // rdx
  _DWORD *ImcId_3; // rcx
  __int64 RegionSize; // rdx
  _DWORD *ImcId_4; // rcx
  __int64 DimmSize; // rdx
  char DataByte1; // [rsp+20h] [rbp-18h]
  char DataByte2; // [rsp+21h] [rbp-17h]
  unsigned int DataValue; // [rsp+24h] [rbp-14h]
  unsigned __int8 IndexVal; // [rsp+40h] [rbp+8h]

  IndexVal = IndexVal_1; /*0x1994*/
  DataByte2 = (unsigned __int8)IndexVal_1 / 2; /*0x19a6*/
  DataByte1 = IndexVal_1 & 1; /*0x19b7*/
  ByteOffset1 = IndexVal_1 & 1; /*0x19c1*/
  LOBYTE(IndexVal_1) = DataByte2; /*0x19c5*/
  DataValue = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))( /*0x19d3*/
                IndexVal_1,
                ByteOffset1,
                117459220);
  if ( DataValue >> 31 == 1 ) /*0x19e4*/
  {
    LOBYTE(ByteOffset2) = DataByte1; /*0x19fd*/
    LOBYTE(BufferPtr) = DataByte2; /*0x1a01*/
    (*(void (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1a0c*/
      BufferPtr,
      ByteOffset2,
      117459220,
      DataValue & 0x7FFFFFFF);
  }
  ImcId = ::ImcId; /*0x1a18*/
  LOBYTE(ByteOffset2) = DataByte1; /*0x1a2a*/
  LOBYTE(ImcId) = DataByte2; /*0x1a2e*/
  (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1a39*/
    ImcId,
    ByteOffset2,
    117459212,
    (unsigned int)::ImcId[14 * IndexVal + 1]);
  ImcId_1 = ::ImcId; /*0x1a45*/
  LOBYTE(DimmId) = DataByte1; /*0x1a57*/
  LOBYTE(ImcId_1) = DataByte2; /*0x1a5b*/
  (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1a66*/
    ImcId_1,
    DimmId,
    117459216,
    (unsigned int)::ImcId[14 * IndexVal + 2]);
  ImcId_2 = ::ImcId; /*0x1a72*/
  LOBYTE(PageAddr) = DataByte1; /*0x1a84*/
  LOBYTE(ImcId_2) = DataByte2; /*0x1a88*/
  (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1a93*/
    ImcId_2,
    PageAddr,
    2384,
    (unsigned int)::ImcId[14 * IndexVal + 4]);
  ImcId_3 = ::ImcId; /*0x1a9f*/
  LOBYTE(RegionSize) = DataByte1; /*0x1ab1*/
  LOBYTE(ImcId_3) = DataByte2; /*0x1ab5*/
  (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1ac0*/
    ImcId_3,
    RegionSize,
    2388,
    (unsigned int)::ImcId[14 * IndexVal + 6]);
  ImcId_4 = ::ImcId; /*0x1acc*/
  LOBYTE(DimmSize) = DataByte1; /*0x1add*/
  LOBYTE(ImcId_4) = DataByte2; /*0x1ae1*/
  (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x1aec*/
    ImcId_4,
    DimmSize,
    117459220,
    (unsigned int)::ImcId[14 * IndexVal]);
  return 0; /*0x1af1*/
}


// Function: JedecNvDimmWriteData @ 0x1af8 (0x666 bytes)
// Index: 14/150

__int64 __fastcall JedecNvDimmWriteData(unsigned __int64 n0x18, __int64 Result1, _BYTE *buf)
{
  __int64 ByteOffset; // r8
  __int64 DstArg; // rdx
  __int64 ArsBuffer; // [rsp+20h] [rbp-18h]

  ++*(_BYTE *)(j + 1323 * n0x18 + 18); /*0x1b3a*/
  *(_BYTE *)(1323 * n0x18 + j + 163 * Result1 + 19) = buf[35]; /*0x1b65*/
  *(_BYTE *)(1323 * n0x18 + j + 163 * Result1 + 20) = buf[32]; /*0x1b90*/
  *(_BYTE *)(1323 * n0x18 + j + 163 * Result1 + 21) = buf[82]; /*0x1bbb*/
  *(_BYTE *)(1323 * n0x18 + j + 163 * Result1 + 22) = buf[56]; /*0x1be6*/
  *(_QWORD *)(1323 * n0x18 + j + 163 * Result1 + 158) = *(_QWORD *)buf; /*0x1c11*/
  ByteOffset = 163 * Result1; /*0x1c87*/
  *(_BYTE *)(1323 * n0x18 + j + ByteOffset + 24) = *(_BYTE *)(dst /*0x1c97*/
                                                            + 5337LL * (unsigned __int8)buf[32]
                                                            + 2956
                                                            + 527LL
                                                            * ((unsigned __int8)buf[56] + 3 * (unsigned __int8)buf[35])
                                                            + 2175
                                                            + 168LL * (unsigned __int8)buf[82]
                                                            + 324);
  *(_QWORD *)(1323 * n0x18 + j + ByteOffset + 166) = (unsigned __int64)*(unsigned int *)(dst /*0x1d21*/
                                                                                       + 5337LL
                                                                                       * (unsigned __int8)buf[32]
                                                                                       + 2956
                                                                                       + 527LL
                                                                                       * ((unsigned __int8)buf[56]
                                                                                        + 3 * (unsigned __int8)buf[35])
                                                                                       + 2175
                                                                                       + 168LL
                                                                                       * (unsigned __int8)buf[82]
                                                                                       + 210) << 26;
  ArsBuffer = 1323 * n0x18 + j + 163 * Result1 + 19; /*0x1d4d*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1d63*/
    DebugPrint(0x80000000, "NVDIMM Socket = %d\n", *(unsigned __int8 *)(1323 * n0x18 + j + 163 * Result1 + 20)); /*0x1da2*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1dc4*/
    DebugPrint(0x80000000, "NVDIMM ImcId = %d\n", *(unsigned __int8 *)(1323 * n0x18 + j + 163 * Result1 + 19)); /*0x1e03*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1e25*/
    DebugPrint(0x80000000, "NVDIMM Channel = %d\n", *(unsigned __int8 *)(1323 * n0x18 + j + 163 * Result1 + 22)); /*0x1e64*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1e86*/
    DebugPrint(0x80000000, "NVDIMM DIMM # = %d\n", *(unsigned __int8 *)(1323 * n0x18 + j + 163 * Result1 + 21)); /*0x1ec5*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1ee7*/
    DebugPrint(0x80000000, "NVDIMM Base Address = 0x%lX\n", *(_QWORD *)(1323 * n0x18 + j + 163 * Result1 + 158)); /*0x1f26*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1f48*/
    DebugPrint(0x80000000, "NVDIMM EnergyType = 0x%lX\n", *(unsigned __int8 *)(1323 * n0x18 + j + 163 * Result1 + 24)); /*0x1f87*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1fa9*/
    DebugPrint(0x80000000, "NVDIMM size = 0x%lX\n", *(_QWORD *)(1323 * n0x18 + j + 163 * Result1 + 166)); /*0x1fe8*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x200a*/
    DebugPrint(0x80000000, "NVDIMM Get Identification\n"); /*0x2022*/
  ArsStart(ArsBuffer); /*0x2038*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x204e*/
    DebugPrint(0x80000000, "NVDIMM Get Power Info\n"); /*0x2066*/
  ArsGetErrorList(ArsBuffer); /*0x207c*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x2092*/
    DebugPrint(0x80000000, "NVDIMM Get Energy Storage Info\n"); /*0x20aa*/
  ArsGetEsPolicy(ArsBuffer); /*0x20c0*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x20d6*/
    DebugPrint(0x80000000, "NVDIMM Get Operation Statistics Info\n"); /*0x20ee*/
  ArsGetDimmErrors(ArsBuffer, DstArg); /*0x2104*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x211a*/
    DebugPrint(0x80000000, "NVDIMM Get Module Info\n"); /*0x2132*/
  ArsStartScrub(ArsBuffer); /*0x2148*/
  byte_1A2F1 = 1; /*0x214d*/
  return 0; /*0x2159*/
}


// Function: JedecNvDimmCommand @ 0x2160 (0xda5 bytes)
// Index: 15/150

signed __int64 JedecNvDimmCommand()
{
  unsigned __int8 LoopIndex; // [rsp+30h] [rbp-248h]
  unsigned __int8 n4; // [rsp+31h] [rbp-247h]
  unsigned __int8 j_1; // [rsp+32h] [rbp-246h]
  unsigned __int8 j; // [rsp+33h] [rbp-245h]
  __int64 v5; // [rsp+38h] [rbp-240h]
  __int64 v6; // [rsp+38h] [rbp-240h]
  __int64 v7; // [rsp+38h] [rbp-240h]
  __int64 v8; // [rsp+38h] [rbp-240h]
  __int64 v9; // [rsp+38h] [rbp-240h]
  __int64 v10; // [rsp+38h] [rbp-240h]
  unsigned __int64 n0x18; // [rsp+40h] [rbp-238h]
  unsigned __int8 Status1; // [rsp+48h] [rbp-230h]
  unsigned __int64 ProcessResult; // [rsp+50h] [rbp-228h]
  unsigned __int64 ProcessResult_1; // [rsp+58h] [rbp-220h]
  int *v15; // [rsp+60h] [rbp-218h] BYREF
  unsigned __int64 ProcessResult_2; // [rsp+68h] [rbp-210h]
  char v17[8]; // [rsp+70h] [rbp-208h] BYREF
  unsigned __int64 VendorDetails_1; // [rsp+78h] [rbp-200h]
  unsigned __int64 VendorResult; // [rsp+80h] [rbp-1F8h] BYREF
  unsigned __int64 VendorDetails; // [rsp+88h] [rbp-1... [11655 chars total]


// Function: NvdimmGetPlatformInfo @ 0x2f08 (0x44 bytes)
// Index: 16/150

bool __fastcall NvdimmGetPlatformInfo(char a1)
{
  return ((a1 & 1) == 0 || (a1 & 2) == 0) && (a1 & 2) != 0; /*0x2f47*/
}


// Function: NvdimmStatusDecode @ 0x2f4c (0x87 bytes)
// Index: 17/150

char __fastcall NvdimmStatusDecode(__int64 a1)
{
  char v2; // [rsp+20h] [rbp-18h]
  bool PlatformInfo; // [rsp+21h] [rbp-17h]
  int n2; // [rsp+24h] [rbp-14h]

  v2 = 0; /*0x2f55*/
  PlatformInfo = NvdimmGetPlatformInfo(*(_BYTE *)(a1 + 13)); /*0x2f67*/
  n2 = *(unsigned __int16 *)(a1 + 1); /*0x2f74*/
  if ( n2 == 1 ) /*0x2f7d*/
    return *(_BYTE *)(a1 + PlatformInfo + 9); /*0x2fb2*/
  if ( n2 == 2 || n2 == 4 || n2 == 8 || n2 == 16 || n2 == 32 ) /*0x2fa0*/
    return *(_BYTE *)(a1 + PlatformInfo + 11); /*0x2fc6*/
  return v2; /*0x2fce*/
}


// Function: NvdimmGetPageSize @ 0x2fd4 (0x6e bytes)
// Index: 18/150

char __fastcall NvdimmGetPageSize(unsigned __int8 n4, unsigned __int8 n0x18)
{
  unsigned __int8 PageIdx; // [rsp+0h] [rbp-18h]
  char PageSize; // [rsp+1h] [rbp-17h]

  PageSize = 0; /*0x2fe0*/
  for ( PageIdx = 0; PageIdx < 8u; ++PageIdx ) /*0x2fe5*/
  {
    if ( *(_BYTE *)(dst + 5337LL * n4 + 2956 + 8LL * n0x18 + 4 + PageIdx) ) /*0x3025*/
      ++PageSize; /*0x3033*/
  }
  return PageSize; /*0x303d*/
}


// Function: NvdimmGetSecurityState @ 0x3044 (0x26e bytes)
// Index: 19/150

__int64 __fastcall NvdimmGetSecurityState()
{
  __int64 result; // rax
  unsigned __int8 SocketIndex; // [rsp+20h] [rbp-38h]
  unsigned __int8 i; // [rsp+21h] [rbp-37h]
  unsigned __int8 DimmIndex; // [rsp+22h] [rbp-36h]
  __int64 SecurityResult; // [rsp+30h] [rbp-28h]
  __int64 SecurityStatus; // [rsp+38h] [rbp-20h]

  SecurityResult = 0; /*0x3048*/
  SecurityStatus = 0; /*0x3056*/
  for ( SocketIndex = 0; SocketIndex < 4u; ++SocketIndex ) /*0x305b*/
  {
    for ( i = 0; i < 6u; ++i ) /*0x307a*/
    {
      for ( DimmIndex = 0; DimmIndex < 2u; ++DimmIndex ) /*0x3099*/
      {
        if ( NfitGetDimmCount(SocketIndex, i, DimmIndex) /*0x3110*/
          && *(_BYTE *)(dst + 5337LL * SocketIndex + 2956 + 527LL * i + 2175 + 168LL * DimmIndex + 192) )
        {
          if ( SocketIndex >= 4u ) /*0x3128*/
          {
            SecurityResult |= 1LL << (16 * SocketIndex + 2 * i + DimmIndex - 64); /*0x3210*/
            *(_QWORD *)(qword_C6F50 + 40) = *(unsigned __int8 *)(dst /*0x327b*/
                                                               + 5337LL * SocketIndex
                                                               + 2956
                                                               + 527LL * i
                                                               + 2175
                                                               + 168LL * DimmIndex
                                                               + 324) != 1;
          }
          else
          {
            SecurityStatus |= 1LL << (DimmIndex + 16 * SocketIndex + 2 * i); /*0x3164*/
            *(_QWORD *)(qword_C6F50 + 32) = *(unsigned __int8 *)(dst /*0x31cf*/
                                                               + 5337LL * SocketIndex
                                                               + 2956
                                                               + 527LL * i
                                                               + 2175
                                                               + 168LL * DimmIndex
                                                               + 324) != 1;
          }
        }
      }
    }
  }
  *(_QWORD *)qword_C6F50 = SecurityStatus; /*0x329a*/
  result = qword_C6F50; /*0x329d*/
  *(_QWORD *)(qword_C6F50 + 8) = SecurityResult; /*0x32a9*/
  return result; /*0x32ad*/
}


// Function: NvdimmSetSecurityState @ 0x32b4 (0x56 bytes)
// Index: 20/150

__int64 __fastcall NvdimmSetSecurityState(_BYTE *a1, _BYTE *a2, _BYTE *a3, _BYTE *a4, unsigned int a5)
{
  __int64 result; // rax

  *a1 = (a5 >> 12) & 0xF; /*0x32d7*/
  *a2 = BYTE1(a5) & 0xF; /*0x32e8*/
  *a3 = (a5 >> 4) & 0xF; /*0x32f9*/
  result = a5 & 0xF; /*0x32ff*/
  *a4 = result; /*0x3307*/
  return result; /*0x3309*/
}


// Function: NvdimmManageSecurity @ 0x330c (0xea bytes)
// Index: 21/150

char __fastcall NvdimmManageSecurity(unsigned __int64 p_i, unsigned __int8 a2, unsigned __int8 a3)
{
  unsigned __int8 SocketIdx; // [rsp+0h] [rbp-18h]
  unsigned __int8 SocketIdx_1; // [rsp+1h] [rbp-17h]
  _BYTE *SecurityCmd; // [rsp+8h] [rbp-10h]

  for ( SocketIdx = 0; SocketIdx < (int)(unsigned __int8)i && SocketIdx < 0x60uLL; ++SocketIdx ) /*0x3327*/
  {
    SecurityCmd = &byte_C60A8[39 * SocketIdx]; /*0x336b*/
    SocketIdx_1 = SocketIdx; /*0x3373*/
    if ( *(_QWORD *)SecurityCmd == p_i ) /*0x3384*/
    {
      while ( *(_QWORD *)SecurityCmd == p_i ) /*0x3393*/
      {
        if ( (unsigned __int8)SecurityCmd[25] == a2 && (unsigned __int8)SecurityCmd[26] == a3 ) /*0x33b7*/
          return SecurityCmd[24]; /*0x33c1*/
        SecurityCmd = &byte_C60A8[39 * ++SocketIdx_1]; /*0x33e3*/
      }
    }
  }
  return 0; /*0x33f1*/
}


// Function: NvdimmGetHealthFlags @ 0x33f8 (0x80 bytes)
// Index: 22/150

char __fastcall NvdimmGetHealthFlags(unsigned __int64 p_i)
{
  unsigned __int8 i; // [rsp+0h] [rbp-18h]
  char v3; // [rsp+1h] [rbp-17h]

  v3 = 0; /*0x3405*/
  for ( i = 0; i < (int)(unsigned __int8)::i && i < 0x60uLL; ++i ) /*0x3413*/
  {
    if ( *(_QWORD *)&byte_C60A8[39 * i] == p_i ) /*0x3461*/
      ++v3; /*0x3469*/
  }
  return v3; /*0x3473*/
}


// Function: NvdimmGetHealthFlagDesc @ 0x3478 (0x6f bytes)
// Index: 23/150

char __fastcall NvdimmGetHealthFlagDesc(__int64 a1)
{
  unsigned __int8 i; // [rsp+0h] [rbp-18h]

  for ( i = 0; i < (int)(unsigned __int8)::i && i < 0x60uLL; ++i ) /*0x348a*/
  {
    if ( *(_QWORD *)&byte_C60A8[39 * i] == a1 ) /*0x34d8*/
      return 1; /*0x34dc*/
  }
  return 0; /*0x34e2*/
}


// Function: NvdimmGetSupportedMsg @ 0x34e8 (0x171 bytes)
// Index: 24/150

__int64 __fastcall NvdimmGetSupportedMsg(unsigned __int64 i, _QWORD *p_i)
{
  __int64 InnerLoop_1; // rax
  unsigned __int8 InnerLoop; // [rsp+0h] [rbp-28h]
  unsigned __int8 ResultByte; // [rsp+1h] [rbp-27h]
  unsigned __int8 StatusByte; // [rsp+2h] [rbp-26h]
  unsigned __int64 ArrayIndex; // [rsp+10h] [rbp-18h]

  for ( InnerLoop = 0; ; ++InnerLoop ) /*0x34f6*/
  {
    InnerLoop_1 = InnerLoop; /*0x3504*/
    if ( InnerLoop >= 0x18u ) /*0x350b*/
      break; /*0x350b*/
    if ( *(_QWORD *)(j + 1323LL * InnerLoop + 8) ) /*0x3523*/
    {
      StatusByte = *(_BYTE *)(j + 1323LL * InnerLoop + 17); /*0x3543*/
      ResultByte = *(_BYTE *)(j + 1323LL * InnerLoop + 16); /*0x355d*/
      if ( *(_BYTE *)(dst + 5337LL * StatusByte + 2956 + 19LL * ResultByte + 213) ) /*0x3597*/
      {
        if ( *(_BYTE *)(dst + 5337LL * StatusByte + 2956 + 19LL * ResultByte + 227) ) /*0x35a8*/
        {
          if ( ResultByte ) /*0x35bc*/
            ArrayIndex = (unsigned __int64)*(unsigned int *)(dst /*0x35fd*/
                                                           + 5337LL * StatusByte
                                                           + 2956
                                                           + 19LL * (ResultByte - 1)
                                                           + 217) << 26;
          else
            ArrayIndex = 0; /*0x35be*/
          if ( i == ArrayIndex ) /*0x3640*/
            *p_i = (unsigned __int64)*(unsigned int *)(dst + 5337LL * StatusByte + 2956 + 19LL * ResultByte + 217) << 26; /*0x364c*/
        }
      }
    }
  }
  return InnerLoop_1; /*0x3654*/
}


// Function: NvdimmGetMsgPayload @ 0x365c (0xd1 bytes)
// Index: 25/150

__int64 __fastcall NvdimmGetMsgPayload(unsigned __int64 p_i, char a2, char a3, char a4)
{
  unsigned int MsgIndex; // [rsp+0h] [rbp-18h]

  for ( MsgIndex = 0; MsgIndex < (unsigned __int8)i && MsgIndex < 0x60uLL; ++MsgIndex ) /*0x367b*/
  {
    if ( *(_QWORD *)&byte_C60A8[39 * MsgIndex] == p_i /*0x3710*/
      && byte_C60A8[39 * MsgIndex + 25] == a2
      && byte_C60A8[39 * MsgIndex + 26] == a3
      && byte_C60A8[39 * MsgIndex + 27] == a4 )
    {
      return MsgIndex; /*0x371d*/
    }
  }
  return 0xFFFFFFFFLL; /*0x3728*/
}


// Function: NvdimmGetVendorInfo @ 0x3730 (0x68 bytes)
// Index: 26/150

__int64 __fastcall NvdimmGetVendorInfo(__int64 p_i)
{
  unsigned int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; i < (unsigned __int8)::i && i < 0x60uLL; ++i ) /*0x3741*/
  {
    if ( *(_QWORD *)&byte_C60A8[39 * i] == p_i ) /*0x377e*/
      return i; /*0x378b*/
  }
  return 0xFFFFFFFFLL; /*0x3793*/
}


// Function: NvdimmGetVendorDetails @ 0x3798 (0xd5 bytes)
// Index: 27/150

__int64 __fastcall NvdimmGetVendorDetails(__int64 a1)
{
  char n2; // [rsp+0h] [rbp-28h]
  char VendorIdx; // [rsp+8h] [rbp-20h]
  char n2_1; // [rsp+10h] [rbp-18h]

  n2 = 2; /*0x37a1*/
  if ( (*(_WORD *)(a1 + 1) & 1) != 0 ) /*0x37b3*/
  {
    n2_1 = *(_BYTE *)(a1 + 3); /*0x37bd*/
    if ( n2_1 == 1 ) /*0x37c6*/
    {
      n2 = 1; /*0x37d1*/
    }
    else if ( n2_1 == 2 ) /*0x37cd*/
    {
      n2 = 0; /*0x37d7*/
    }
  }
  else if ( (*(_WORD *)(a1 + 1) & 2) != 0 ) /*0x37eb*/
  {
    VendorIdx = *(_BYTE *)(a1 + 3); /*0x37f5*/
    switch ( VendorIdx ) /*0x37fe*/
    {
      case 1: /*0x37fe*/
        n2 = 2; /*0x3810*/
        break;
      case 2: /*0x37fe*/
        n2 = 1; /*0x3816*/
        break;
      case 3: /*0x37fe*/
        n2 = 2; /*0x381c*/
        break;
    }
  }
  if ( n2 ) /*0x382c*/
  {
    if ( n2 == 1 ) /*0x3833*/
      return 256; /*0x3848*/
    else
      return 4096; /*0x3852*/
  }
  else
  {
    return 64; /*0x383e*/
  }
}


// Function: NvdimmVendorCommand @ 0x3870 (0x12c bytes)
// Index: 28/150

__int64 __fastcall NvdimmVendorCommand(__int64 CmdResult_1)
{
  unsigned __int8 i; // [rsp+20h] [rbp-28h]
  unsigned __int8 IndexOuter; // [rsp+21h] [rbp-27h]
  unsigned int VendorDetails; // [rsp+24h] [rbp-24h]
  unsigned __int64 CmdResult; // [rsp+28h] [rbp-20h]

  VendorDetails = 0; /*0x3879*/
  for ( IndexOuter = 0; IndexOuter < 4u; ++IndexOuter ) /*0x3881*/
  {
    for ( i = 0; i < 0x18u; ++i ) /*0x38a0*/
    {
      if ( i ) /*0x38f7*/
        CmdResult = (unsigned __int64)*(unsigned int *)(dst + 5337LL * IndexOuter + 2956 + 19LL * (i - 1) + 217) << 26; /*0x3938*/
      else
        CmdResult = 0; /*0x38f9*/
      if ( CmdResult == CmdResult_1 && *(_BYTE *)(dst + 5337LL * IndexOuter + 2956 + 19LL * i + 227) ) /*0x396d*/
      {
        VendorDetails = NvdimmGetVendorDetails(dst + 5337LL * IndexOuter + 2956 + 19LL * i + 213); /*0x3983*/
        break; /*0x3987*/
      }
    }
  }
  return VendorDetails; /*0x3997*/
}


// Function: JedecNvDimmProcessCmd @ 0x399c (0x136a bytes)
// Index: 29/150

unsigned __int64 __fastcall JedecNvDimmProcessCmd(
        __int64 TableEntry,
        __int16 n32,
        char n2,
        char n2_1,
        char a5,
        char n2a,
        _BYTE *a7,
        _BYTE *a8,
        _BYTE *a9)
{
  __int64 TableEntry_1; // rax
  char IsPageMode4; // [rsp+0h] [rbp-38h]
  unsigned int i; // [rsp+4h] [rbp-34h]
  unsigned int NumEntries; // [rsp+8h] [rbp-30h]
  _BYTE *Page4Entry; // [rsp+10h] [rbp-28h]
  _BYTE *Page32Entry; // [rsp+18h] [rbp-20h]
  unsigned __int64 Status; // [rsp+28h] [rbp-10h]

  Page4Entry = 0; /*0x39b4*/
  IsPageMode4 = 1; /*0x39bd*/
  Status = 0; /*0x39c1*/
  Page32Entry = 0; /*0x39ca*/
  if ( n32 == 4 ) /*0x39db*/
  {
    NumEntries = (unsigned __int8)::i; /*0x39e4*/
  }
  else
  {
    if ( n32 != 32 ) /*0x39f2*/
      return 0x8000000000000002uLL; /*0x3a0f*/
    NumEntries = (unsigned __int8)i_0; /*0x39fb*/
    IsPageMode4 = 0; /*0x39ff*/
  }
  for ( i = 0; ; ++i ) /*0x3a14*/
  {
    if ( i >= NumEntries ) /*0x3a30*/
    {
      Sta... [16239 chars total]


// Function: JedecNvDimmExecuteCmd @ 0x4d08 (0xb55 bytes)
// Index: 30/150

unsigned __int64 __fastcall JedecNvDimmExecuteCmd(
        unsigned __int64 TableEntry,
        __int64 CmdResult_1,
        unsigned __int8 n8,
        _BYTE *a4,
        _BYTE *a5,
        _BYTE *a6)
{
  char n2; // [rsp+50h] [rbp-F8h]
  char n2_2; // [rsp+50h] [rbp-F8h]
  char n2_4; // [rsp+50h] [rbp-F8h]
  char n2_5; // [rsp+50h] [rbp-F8h]
  char n6_1; // [rsp+51h] [rbp-F7h]
  unsigned __int8 v12; // [rsp+51h] [rbp-F7h]
  unsigned __int8 v13; // [rsp+51h] [rbp-F7h]
  unsigned __int8 v14; // [rsp+51h] [rbp-F7h]
  char FlagChar; // [rsp+52h] [rbp-F6h]
  bool FlagBool; // [rsp+52h] [rbp-F6h]
  char n2_3; // [rsp+53h] [rbp-F5h]
  char HealthFlagDesc; // [rsp+54h] [rbp-F4h]
  unsigned int CmdResult; // [rsp+58h] [rbp-F0h]
  unsigned int LaneIndex; // [rsp+5Ch] [rbp-ECh]
  unsigned int i; // [rsp+5Ch] [rbp-ECh]
  unsigned int SubIndex; // [rsp+5Ch] [rbp-ECh]
  unsigned int j; // [rsp+5Ch] [rbp-ECh]
  unsigned int i_1; // [rsp+68h] [rbp-E0h]
  unsigned int VendorCmdStatus; // [rsp+70h] [rbp-D8h]
  _BYTE v26[12]; // [rsp+74h] [rbp-D4h]
  _BYTE v27[16]; // [rsp+80h] [rbp-C8h]
  _BYTE v28[24]; // [rsp+90h] [rbp-B8h]
  int buf_; // [rsp+A8h] [rbp-A0h]
  unsigned __int64 ReturnStatus; // [rsp+B0h] [rbp-98h]
  int n8_2; // [rsp+B8h] [rbp-90h]
  int n8_4; // [rsp+BCh] [rbp-8Ch]
  int n8_3; // [rsp+C0h] [rbp-88h]
  unsigned int TempResult; // [rsp+C4h] [rbp-84h]
  int n8_6; // [rsp+C8h] [rbp-80h]
  int n8_17; // [rsp+CCh] [rbp-7Ch]
  int n8_7; // [rsp+D0h] [rbp-78h]
  int n8_8; // [rsp+D4h] [rbp-74h]
  int n8_16; // [rsp+D8h] [rbp-70h]
  int n8_9; // [rsp+DCh] [rbp-6Ch]
  int n8_10; // [rsp+E0h] [rbp-68h]
  int n8_15; // [rsp+E4h] [rbp-64h]
  int n8_11; // [rsp+E8h] [rbp-60h]
  int n8_12; // [rsp+ECh] [rbp-5Ch]
  int n8_14; // [rsp+F0h] [rbp-58h]
  int n8_13; // [rsp+F4h] [rbp-54h]
  int n2_1; // [rsp+F8h] [rbp-50h]
  int n6; // [rsp+FCh] [rbp-4Ch]
  int n4; // [rsp+100h] [rbp-48h]
  int n8_5; // [rsp+104h] [rbp-44h]
  unsigned int StatusResult; // [rsp+108h] [rbp-40h]
  int n8_1; // [rsp+10Ch] [rbp-3Ch]
  __int64 buf__2; // [rsp+110h] [rbp-38h]
  __int64 VendorCmdStatus_1; // [rsp+118h] [rbp-30h]
  __int64 VendorCmdStatus_2; // [rsp+120h] [rbp-28h]
  int DataCount; // [rsp+128h] [rbp-20h]
  __int64 buf__1; // [rsp+130h] [rbp-18h]

  n2_3 = 0; /*0x4d3a*/
  n6_1 = 0; /*0x4d3f*/
  v26[0] = 0; /*0x4d49*/
  v26[1] = 2; /*0x4d4e*/
  v26[2] = 1; /*0x4d53*/
  v26[3] = 1; /*0x4d58*/
  v26[4] = 0; /*0x4d5d*/
  v26[5] = 2; /*0x4d62*/
  v27[0] = 0; /*0x4d67*/
  v27[1] = 1; /*0x4d6f*/
  v27[2] = 2; /*0x4d77*/
  v27[3] = 1; /*0x4d7f*/
  v27[4] = 2; /*0x4d87*/
  v27[5] = 0; /*0x4d8f*/
  v27[6] = 2; /*0x4d97*/
  v27[7] = 0; /*0x4d9f*/
  v27[8] = 1; /*0x4da7*/
  v27[9] = 0; /*0x4daf*/
  v27[10] = 1; /*0x4db7*/
  v27[11] = 2; /*0x4dbf*/
  v28[0] = 0; /*0x4dc7*/
  v28[1] = 2; /*0x4dcf*/
  v28[2] = 1; /*0x4dd7*/
  v28[3] = 1; /*0x4ddf*/
  v28[4] = 0; /*0x4de7*/
  v28[5] = 2; /*0x4def*/
  v28[6] = 2; /*0x4df7*/
  v28[7] = 1; /*0x4dff*/
  v28[8] = 0; /*0x4e07*/
  v28[9] = 0; /*0x4e0f*/
  v28[10] = 2; /*0x4e17*/
  v28[11] = 1; /*0x4e1f*/
  v28[12] = 1; /*0x4e27*/
  v28[13] = 0; /*0x4e2f*/
  v28[14] = 2; /*0x4e37*/
  v28[15] = 2; /*0x4e3f*/
  v28[16] = 1; /*0x4e47*/
  v28[17] = 0; /*0x4e4f*/
  v28[18] = 0; /*0x4e57*/
  v28[19] = 2; /*0x4e5f*/
  v28[20] = 1; /*0x4e67*/
  v28[21] = 1; /*0x4e6f*/
  v28[22] = 0; /*0x4e77*/
  v28[23] = 2; /*0x4e7f*/
  VendorCmdStatus = NvdimmVendorCommand(CmdResult_1); /*0x4e94*/
  if ( VendorCmdStatus )
  {
    buf_ = buf__0; /*0x4ee9*/
    FlagChar = 0; /*0x4ef0*/
    ReturnStatus = TableEntry - CmdResult_1; /*0x4f0b*/
    buf__1 = (unsigned int)buf__0; /*0x4f1a*/
    CmdResult = (TableEntry - CmdResult_1) / (unsigned int)buf__0; /*0x4f37*/
    buf__2 = (unsigned int)buf__0; /*0x4f42*/
    i_1 = (TableEntry - CmdResult_1) % (unsigned int)buf__0 / VendorCmdStatus; /*0x4f6b*/
    VendorCmdStatus_1 = VendorCmdStatus; /*0x4f73*/
    DataCount = (TableEntry - CmdResult_1) % VendorCmdStatus; /*0x4f93*/
    HealthFlagDesc = NvdimmGetHealthFlagDesc(CmdResult_1); /*0x4fa7*/
    switch ( n8 ) /*0x4fbb*/
    {
      case 1u: /*0x4fbb*/
        VendorCmdStatus_2 = VendorCmdStatus; /*0x4fe7*/
        n2 = 0; /*0x5008*/
        for ( LaneIndex = 0; LaneIndex < (unsigned int)(ReturnStatus / VendorCmdStatus); ++LaneIndex ) /*0x500d*/
        {
          if ( (unsigned __int8)++n2 > 2u ) /*0x503d*/
            n2 = 0; /*0x503f*/
        }
        if ( HealthFlagDesc ) /*0x504d*/
          return JedecNvDimmProcessCmd(CmdResult_1, 4, 3, 0, 0, n2, a4, a5, a6); /*0x5095*/
        else
          return JedecNvDimmProcessCmd(CmdResult_1, 32, 3, 0, 0, n2, a4, a5, a6); /*0x50f1*/
      case 2u: /*0x4fbb*/
        n2_1 = 2; /*0x5112*/
        FlagBool = CmdResult % 2 != 0; /*0x512e*/
        n6 = 6; /*0x513e*/
        v12 = CmdResult % 6 / 2; /*0x5162*/
        if ( CmdResult % 2 ) /*0x5128*/
          v12 += 3; /*0x5177*/
        n2_2 = v26[v12]; /*0x5184*/
        for ( i = 0; i < i_1; ++i ) /*0x5188*/
        {
          if ( (unsigned __int8)++n2_2 > 2u ) /*0x51b8*/
            n2_2 = 0; /*0x51ba*/
        }
        if ( HealthFlagDesc ) /*0x51c8*/
          return JedecNvDimmProcessCmd(CmdResult_1, 4, 3, 0, FlagBool, n2_2, a4, a5, a6); /*0x5213*/
        else
          return JedecNvDimmProcessCmd(CmdResult_1, 32, 3, 0, FlagBool, n2_2, a4, a5, a6); /*0x5272*/
      case 4u: /*0x4fbb*/
        n4 = 4; /*0x5293*/
        if ( CmdResult % 4 == 2 || (n8_5 = n8, CmdResult % n8 == 3) ) /*0x52d3*/
        {
          n2_3 = 1; /*0x52d5*/
          n6_1 = 6; /*0x52da*/
          n8_1 = n8; /*0x52e7*/
          if ( CmdResult % n8 == 3 ) /*0x5302*/
            FlagChar = 1; /*0x5304*/
        }
        else
        {
          n8_2 = n8; /*0x5313*/
          if ( !(CmdResult % n8) || (n8_4 = n8, CmdResult % n8 == 1) ) /*0x5352*/
          {
            n2_3 = 0; /*0x5354*/
            n6_1 = 0; /*0x5359*/
            n8_3 = n8; /*0x5366*/
            if ( CmdResult % n8 == 1 ) /*0x5381*/
              FlagChar = 1; /*0x5383*/
          }
        }
        TempResult = 3 * n8; /*0x5393*/
        v13 = CmdResult % TempResult / n8 + n6_1; /*0x53c0*/
        if ( FlagChar ) /*0x53cb*/
          v13 += 3; /*0x53d5*/
        n2_4 = v27[v13]; /*0x53e5*/
        for ( SubIndex = 0; SubIndex < i_1; ++SubIndex ) /*0x53e9*/
        {
          if ( (unsigned __int8)++n2_4 > 2u ) /*0x5419*/
            n2_4 = 0; /*0x541b*/
        }
        if ( HealthFlagDesc ) /*0x5429*/
          return JedecNvDimmProcessCmd(CmdResult_1, 4, 3, n2_3, FlagChar, n2_4, a4, a5, a6); /*0x5476*/
        else
          return JedecNvDimmProcessCmd(CmdResult_1, 32, 3, n2_3, FlagChar, n2_4, a4, a5, a6); /*0x54d7*/
      case 8u: /*0x4fbb*/
        n8_6 = 8; /*0x54f8*/
        if ( CmdResult % 8 == 6 || (n8_17 = n8, CmdResult % n8 == 7) ) /*0x5538*/
        {
          n6_1 = 18; /*0x553a*/
          n2_3 = 3; /*0x553f*/
          n8_7 = n8; /*0x554c*/
          if ( CmdResult % n8 == 7 ) /*0x5567*/
            FlagChar = 1; /*0x5569*/
        }
        else
        {
          n8_8 = n8; /*0x557b*/
          if ( CmdResult % n8 == 4 || (n8_16 = n8, CmdResult % n8 == 5) ) /*0x55bb*/
          {
            n2_3 = 2; /*0x55bd*/
            n6_1 = 12; /*0x55c2*/
            n8_9 = n8; /*0x55cf*/
            if ( CmdResult % n8 == 5 ) /*0x55ea*/
              FlagChar = 1; /*0x55ec*/
          }
          else
          {
            n8_10 = n8; /*0x55fe*/
            if ( CmdResult % n8 == 2 || (n8_15 = n8, CmdResult % n8 == 3) ) /*0x563e*/
            {
              n2_3 = 1; /*0x5640*/
              n6_1 = 6; /*0x5645*/
              n8_11 = n8; /*0x5652*/
              if ( CmdResult % n8 == 3 ) /*0x566d*/
                FlagChar = 1; /*0x566f*/
            }
            else
            {
              n8_12 = n8; /*0x567e*/
              if ( !(CmdResult % n8) || (n8_14 = n8, CmdResult % n8 == 1) ) /*0x56bd*/
              {
                n2_3 = 0; /*0x56bf*/
                n6_1 = 0; /*0x56c4*/
                n8_13 = n8; /*0x56d1*/
                if ( CmdResult % n8 == 1 ) /*0x56ec*/
                  FlagChar = 1; /*0x56ee*/
              }
            }
          }
        }
        StatusResult = 3 * n8; /*0x56fe*/
        v14 = CmdResult % StatusResult / n8 + n6_1; /*0x572b*/
        if ( FlagChar ) /*0x5736*/
          v14 += 3; /*0x5740*/
        n2_5 = v28[v14]; /*0x5750*/
        for ( j = 0; j < i_1; ++j ) /*0x5754*/
        {
          if ( (unsigned __int8)++n2_5 > 2u ) /*0x5784*/
            n2_5 = 0; /*0x5786*/
        }
        if ( HealthFlagDesc ) /*0x5794*/
          return JedecNvDimmProcessCmd(CmdResult_1, 4, 3, n2_3, FlagChar, n2_5, a4, a5, a6); /*0x57e1*/
        else
          return JedecNvDimmProcessCmd(CmdResult_1, 32, 3, n2_3, FlagChar, n2_5, a4, a5, a6); /*0x583f*/
      default:
        return 0x8000000000000002uLL; /*0x5850*/
    }
  }
  else
  {
    if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "JNP: GetDimmInfoFromSpaFor3ChWays - LineSize returned is 0, returning!\n");
    }
    return 0x8000000000000002uLL; /*0x4ed9*/
  }
}


// Function: JedecNvDimmSendCmd @ 0x5860 (0x8d4 bytes)
// Index: 31/150

unsigned __int64 __fastcall JedecNvDimmSendCmd(
        unsigned __int64 TableEntry,
        __int64 CmdResult,
        unsigned __int8 n8,
        _BYTE *a4,
        _BYTE *a5,
        _BYTE *a6)
{
  char n2; // [rsp+50h] [rbp-A8h]
  char n2_3; // [rsp+50h] [rbp-A8h]
  char n2_2; // [rsp+50h] [rbp-A8h]
  bool FlagPolarity; // [rsp+51h] [rbp-A7h]
  bool FlagResult; // [rsp+51h] [rbp-A7h]
  char n2_1; // [rsp+52h] [rbp-A6h]
  char HealthFlagDesc; // [rsp+53h] [rbp-A5h]
  unsigned int ChannelIndex; // [rsp+54h] [rbp-A4h]
  unsigned int LaneIdx; // [rsp+58h] [rbp-A0h]
  unsigned int j; // [rsp+58h] [rbp-A0h]
  unsigned int i; // [rsp+58h] [rbp-A0h]
  unsigned int InnerIdx; // [rsp+58h] [rbp-A0h]
  unsigned int i_1; // [rsp+68h] [rbp-90h]
  unsigned int VendorCmdResult; // [rsp+70h] [rbp-88h]

  n2_1 = 0; /*0x5892*/
  VendorCmdResult = NvdimmVendorCommand(CmdResult); /*0x58a9*/
  if ( !VendorCmdResult )
  {
    if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "JNP: GetDimmInfoFromSpaFor2ChWays - LineSize returned is 0, returning!\n");
    }
    return 0x8000000000000002uLL; /*0x58f3*/
  }
  FlagPolarity = 0; /*0x5902*/
  ChannelIndex = (TableEntry - CmdResult) / (unsigned int)buf__0; /*0x5940*/
  i_1 = (TableEntry - CmdResult) % (unsigned int)buf__0 / VendorCmdResult; /*0x596e*/
  HealthFlagDesc = NvdimmGetHealthFlagDesc(CmdResult); /*0x59a7*/
  if ( n8 == 1 ) /*0x59bb*/
  {
    n2 = 0; /*0x5a05*/
    for ( LaneIdx = 0; LaneIdx < (unsigned int)((TableEntry - CmdResult) / VendorCmdResult); ++LaneIdx ) /*0x5a0a*/
    {
      if ( (unsigned __int8)++n2 > 1u ) /*0x5a3a*/
        n2 = 0; /*0x5a3c*/
    }
    if ( HealthFlagDesc ) /*0x5a4a*/
      return JedecNvDimmProcessCmd(CmdResult, 4, 2, 0, 0, n2, a4, a5, a6); /*0x5a92*/
    else
      return JedecNvDimmProcessCmd(CmdResult, 32, 2, 0, 0, n2, a4, a5, a6); /*0x5aee*/
  }
  else
  {
    if ( n8 != 2 ) /*0x59c2*/
    {
      if ( n8 == 4 ) /*0x59cd*/
      {
        if ( ChannelIndex % 4 == 2 || ChannelIndex % n8 == 3 ) /*0x5c80*/
        {
          n2_1 = 1; /*0x5c82*/
          if ( ChannelIndex % n8 == 3 ) /*0x5caa*/
            FlagPolarity = 1; /*0x5cac*/
        }
        else if ( ChannelIndex % n8 <= 1 ) /*0x5cd5*/
        {
          n2_1 = 0; /*0x5cfc*/
          FlagPolarity = ChannelIndex % n8 == 1; /*0x5d26*/
        }
        n2_2 = 0; /*0x5d2b*/
        for ( i = 0; i < i_1; ++i ) /*0x5d30*/
        {
          if ( (unsigned __int8)++n2_2 > 1u ) /*0x5d60*/
            n2_2 = 0; /*0x5d62*/
        }
        if ( !HealthFlagDesc ) /*0x5d70*/
          return JedecNvDimmProcessCmd(CmdResult, 32, 2, n2_1, FlagPolarity, n2_2, a4, a5, a6); /*0x6116*/
      }
      else
      {
        if ( n8 != 8 ) /*0x59d8*/
          return 0x8000000000000002uLL; /*0x59de*/
        if ( ChannelIndex % 8 == 6 || ChannelIndex % n8 == 7 ) /*0x5e7f*/
        {
          n2_1 = 3; /*0x5e81*/
          if ( ChannelIndex % n8 == 7 ) /*0x5ea9*/
            FlagPolarity = 1; /*0x5eab*/
        }
        else if ( ChannelIndex % n8 == 4 || ChannelIndex % n8 == 5 ) /*0x5efd*/
        {
          n2_1 = 2; /*0x5eff*/
          if ( ChannelIndex % n8 == 5 ) /*0x5f27*/
            FlagPolarity = 1; /*0x5f29*/
        }
        else if ( ChannelIndex % n8 == 2 || ChannelIndex % n8 == 3 ) /*0x5f7b*/
        {
          n2_1 = 1; /*0x5f7d*/
          if ( ChannelIndex % n8 == 3 ) /*0x5fa5*/
            FlagPolarity = 1; /*0x5fa7*/
        }
        else if ( ChannelIndex % n8 <= 1 ) /*0x5fd0*/
        {
          n2_1 = 0; /*0x5ff7*/
          FlagPolarity = ChannelIndex % n8 == 1; /*0x6021*/
        }
        n2_2 = 0; /*0x6026*/
        for ( InnerIdx = 0; InnerIdx < i_1; ++InnerIdx ) /*0x602b*/
        {
          if ( (unsigned __int8)++n2_2 > 1u ) /*0x605b*/
            n2_2 = 0; /*0x605d*/
        }
        if ( !HealthFlagDesc ) /*0x606b*/
          return JedecNvDimmProcessCmd(CmdResult, 32, 2, n2_1, FlagPolarity, n2_2, a4, a5, a6); /*0x606b*/
      }
      return JedecNvDimmProcessCmd(CmdResult, 4, 2, n2_1, FlagPolarity, n2_2, a4, a5, a6); /*0x5dcc*/
    }
    FlagResult = ChannelIndex % 2 != 0; /*0x5b2b*/
    n2_3 = 0; /*0x5b30*/
    for ( j = 0; j < i_1; ++j ) /*0x5b35*/
    {
      if ( (unsigned __int8)++n2_3 > 1u ) /*0x5b65*/
        n2_3 = 0; /*0x5b67*/
    }
    if ( HealthFlagDesc ) /*0x5b75*/
      return JedecNvDimmProcessCmd(CmdResult, 4, 2, 0, FlagResult, n2_3, a4, a5, a6); /*0x5bc0*/
    else
      return JedecNvDimmProcessCmd(CmdResult, 32, 2, 0, FlagResult, n2_3, a4, a5, a6); /*0x5c1f*/
  }
}


// Function: JedecNvDimmGetResponse @ 0x6134 (0x796 bytes)
// Index: 32/150

unsigned __int64 __fastcall JedecNvDimmGetResponse(
        unsigned __int64 TableEntry,
        __int64 TableEntry_1,
        unsigned __int8 n8,
        _BYTE *a4,
        _BYTE *a5,
        _BYTE *a6)
{
  bool OddFlag; // [rsp+50h] [rbp-A8h]
  bool RemFlag; // [rsp+50h] [rbp-A8h]
  char n2; // [rsp+51h] [rbp-A7h]
  char HealthFlagDesc; // [rsp+52h] [rbp-A6h]
  unsigned int LaneNum; // [rsp+54h] [rbp-A4h]

  n2 = 0; /*0x6169*/
  if ( (unsigned int)NvdimmVendorCommand(TableEntry_1) ) /*0x6180*/
  {
    OddFlag = 0; /*0x61d9*/
    LaneNum = (TableEntry - TableEntry_1) / (unsigned int)buf__0; /*0x621d*/
    HealthFlagDesc = NvdimmGetHealthFlagDesc(TableEntry_1); /*0x628d*/
    switch ( n8 ) /*0x62a1*/
    {
      case 1u: /*0x62a1*/
        if ( HealthFlagDesc ) /*0x62d0*/
          return JedecNvDimmProcessCmd(TableEntry_1, 4, 1, 0, 0, 0, a4, a5, a6); /*0x6315*/
        else
          return JedecNvDimmProcessCmd(TableEntry_1, 32, 1, 0, 0, 0, a4, a5, a6); /*0x636e*/
      case 2u: /*0x62a1*/
        RemFlag = LaneNum % 2 != 0; /*0x63a5*/
        if ( HealthFlagDesc ) /*0x63b1*/
          return JedecNvDimmProcessCmd(TableEntry_1, 4, 1, 0, RemFlag, 0, a4, a5, a6); /*0x63f9*/
        else
          return JedecNvDimmProcessCmd(TableEntry_1, 32, 1, 0, RemFlag, 0, a4, a5, a6); /*0x6455*/
      case 4u: /*0x62a1*/
        if ( LaneNum % 4 == 2 || LaneNum % n8 == 3 ) /*0x64aa*/
        {
          n2 = 1; /*0x64ac*/
          if ( LaneNum % n8 == 3 ) /*0x64ce*/
            OddFlag = 1; /*0x64d0*/
        }
        else if ( LaneNum % n8 <= 1 ) /*0x64f3*/
        {
          n2 = 0; /*0x651a*/
          OddFlag = LaneNum % n8 == 1; /*0x6544*/
        }
        if ( !HealthFlagDesc ) /*0x6550*/
          return JedecNvDimmProcessCmd(TableEntry_1, 32, 1, n2, OddFlag, 0, a4, a5, a6); /*0x68ac*/
        break;
      case 8u: /*0x62a1*/
        if ( LaneNum % 8 == 6 || LaneNum % n8 == 7 ) /*0x6659*/
        {
          n2 = 3; /*0x665b*/
          if ( LaneNum % n8 == 7 ) /*0x6683*/
            OddFlag = 1; /*0x6685*/
        }
        else if ( LaneNum % n8 == 4 || LaneNum % n8 == 5 ) /*0x66d7*/
        {
          n2 = 2; /*0x66d9*/
          if ( LaneNum % n8 == 5 ) /*0x6701*/
            OddFlag = 1; /*0x6703*/
        }
        else if ( LaneNum % n8 == 2 || LaneNum % n8 == 3 ) /*0x6755*/
        {
          n2 = 1; /*0x6757*/
          if ( LaneNum % n8 == 3 ) /*0x677f*/
            OddFlag = 1; /*0x6781*/
        }
        else if ( LaneNum % n8 <= 1 ) /*0x67aa*/
        {
          n2 = 0; /*0x67d1*/
          OddFlag = LaneNum % n8 == 1; /*0x67fb*/
        }
        if ( !HealthFlagDesc ) /*0x6807*/
          return JedecNvDimmProcessCmd(TableEntry_1, 32, 1, n2, OddFlag, 0, a4, a5, a6); /*0x6807*/
        break;
      default:
        return 0x8000000000000002uLL; /*0x62c4*/
    }
    return JedecNvDimmProcessCmd(TableEntry_1, 4, 1, n2, OddFlag, 0, a4, a5, a6); /*0x65a9*/
  }
  if ( DebugLevelEnabled() )
  {
    if ( DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "JNP: GetDimmInfoFromSpaFor1ChWays - LineSize returned is 0, returning!\n");
  }
  return 0x8000000000000002uLL; /*0x68c2*/
}


// Function: JedecNvDimmCmdLoop @ 0x68cc (0x323 bytes)
// Index: 33/150

unsigned __int64 __fastcall JedecNvDimmCmdLoop(
        unsigned __int64 TableEntry,
        unsigned __int64 *p_i,
        _BYTE *a3,
        _BYTE *a4,
        _BYTE *a5)
{
  unsigned __int8 LaneIndex; // [rsp+30h] [rbp-38h]
  unsigned __int8 n0x18; // [rsp+31h] [rbp-37h]
  unsigned __int8 n4; // [rsp+32h] [rbp-36h]
  char n5; // [rsp+33h] [rbp-35h]
  char n3; // [rsp+34h] [rbp-34h]
  char n8; // [rsp+35h] [rbp-33h]
  unsigned __int64 TableEntry_1; // [rsp+40h] [rbp-28h]
  unsigned __int64 Response; // [rsp+48h] [rbp-20h]
  _BYTE *ResponsePtr; // [rsp+50h] [rbp-18h]

  Response = 0x8000000000000002uLL; /*0x68ee*/
  for ( LaneIndex = 0; LaneIndex < 0x18u; ++LaneIndex )
  {
    if ( *(_QWORD *)(j + 1323LL * LaneIndex + 8) )
    {
      n4 = *(_BYTE *)(j + 1323LL * LaneIndex + 17); /*0x6946*/
      n0x18 = *(_BYTE *)(j + 1323LL * LaneIndex + 16); /*0x6961*/
      ResponsePtr = (_BYTE *)(dst + 5337LL * n4 + 2956 + 19LL * n0x18 + 213); /*0x6991*/
      n5 = NvdimmStatusDecode((__int64)ResponsePtr); /*0x69a0*/
      if ( *ResponsePtr )
      {
        if ( ResponsePtr[14] )
        {
          TableEntry_1 = n0x18
                       ? (unsigned __int64)*(unsigned int *)(dst + 5337LL * n4 + 2956 + 19LL * (n0x18 - 1) + 217) << 26
                       : 0LL;
          if ( TableEntry >= TableEntry_1 /*0x6a62*/
            && TableEntry <= (unsigned __int64)*(unsigned int *)(dst + 5337LL * n4 + 2956 + 19LL * n0x18 + 217) << 26 )
          {
            *p_i = TableEntry_1; /*0x6a72*/
            n8 = NvdimmGetPageSize(n4, n0x18); /*0x6a82*/
            if ( n5 == 7 ) /*0x6a8e*/
            {
              n3 = 3; /*0x6a90*/
            }
            else if ( n5 == 5 || n5 == 6 || n5 == 3 ) /*0x6ab3*/
            {
              n3 = 2; /*0x6ab5*/
            }
            else
            {
              n3 = 1; /*0x6abc*/
            }
            if ( n3 == 1 ) /*0x6ace*/
            {
              Response = JedecNvDimmGetResponse(TableEntry, TableEntry_1, n8, a3, a4, a5); /*0x6b97*/
            }
            else if ( n3 == 2 ) /*0x6ad9*/
            {
              Response = JedecNvDimmSendCmd(TableEntry, TableEntry_1, n8, a3, a4, a5); /*0x6b5a*/
            }
            else
            {
              Response = JedecNvDimmExecuteCmd(TableEntry, TableEntry_1, n8, a3, a4, a5); /*0x6b1d*/
            }
          }
        }
      }
    }
  }
  if ( Response && DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "JNP: GetDimmInfoFromSpa - Failed\n");
  return Response; /*0x6bea*/
}


// Function: NvdimmParseConfig @ 0x6bf0 (0xc2 bytes)
// Index: 34/150

__int64 __fastcall NvdimmParseConfig(__int64 Result2)
{
  char n2_1; // [rsp+0h] [rbp-28h]
  char n2; // [rsp+Ch] [rbp-1Ch]
  unsigned __int8 n3; // [rsp+10h] [rbp-18h]

  n2_1 = 1; /*0x6bf9*/
  if ( (*(_WORD *)(Result2 + 1) & 1) != 0 ) /*0x6c0b*/
  {
    n2 = *(_BYTE *)(Result2 + 3); /*0x6c15*/
    if ( n2 == 1 ) /*0x6c1e*/
    {
      n2_1 = 1; /*0x6c29*/
    }
    else if ( n2 == 2 ) /*0x6c25*/
    {
      n2_1 = 0; /*0x6c2f*/
    }
  }
  else if ( (*(_WORD *)(Result2 + 1) & 2) != 0 ) /*0x6c43*/
  {
    n3 = *(_BYTE *)(Result2 + 3); /*0x6c4d*/
    if ( n3 ) /*0x6c56*/
    {
      if ( n3 <= 3u ) /*0x6c5d*/
        n2_1 = 2; /*0x6c61*/
    }
  }
  if ( n2_1 ) /*0x6c71*/
  {
    if ( n2_1 == 1 ) /*0x6c78*/
      return 256; /*0x6c8d*/
    else
      return 4096; /*0x6c97*/
  }
  else
  {
    return 64; /*0x6c83*/
  }
}


// Function: NvdimmCheckChannel @ 0x6cb4 (0x15e bytes)
// Index: 35/150

char __fastcall NvdimmCheckChannel(unsigned __int8 n4, unsigned __int8 j)
{
  unsigned __int8 ChannelIdx; // [rsp+20h] [rbp-18h]
  unsigned __int8 ResultStatus; // [rsp+21h] [rbp-17h]
  char ReturnVal; // [rsp+22h] [rbp-16h]
  bool PlatformInfo; // [rsp+23h] [rbp-15h]
  int n2; // [rsp+24h] [rbp-14h]

  ResultStatus = 0; /*0x6cc0*/
  PlatformInfo = NvdimmGetPlatformInfo(*(_BYTE *)(dst + 5337LL * n4 + 2956 + 19LL * j + 226)); /*0x6cf5*/
  n2 = *(unsigned __int16 *)(dst + 5337LL * n4 + 2956 + 19LL * j + 214); /*0x6d25*/
  if ( n2 == 1 ) /*0x6d2e*/
  {
    ResultStatus = *(_BYTE *)(dst + 5337LL * n4 + 2956 + 19LL * j + 213 + PlatformInfo + 9); /*0x6d8a*/
  }
  else if ( n2 == 2 || n2 == 4 || n2 == 8 || n2 == 16 || n2 == 32 ) /*0x6d51*/
  {
    ResultStatus = *(_BYTE *)(dst + 5337LL * n4 + 2956 + 19LL * j + 213 + PlatformInfo + 11); /*0x6dc5*/
  }
  ReturnVal = 0; /*0x6dc9*/
  for ( ChannelIdx = 0; ChannelIdx < 3u; ++ChannelIdx ) /*0x6dce*/
  {
    if ( (((int)ResultStatus >> ChannelIdx) & 1) == 1 ) /*0x6dfb*/
      ++ReturnVal; /*0x6e03*/
  }
  return ReturnVal; /*0x6e0d*/
}


// Function: NvdimmGetDimmConfig @ 0x6e14 (0x26c bytes)
// Index: 36/150

unsigned __int64 __fastcall NvdimmGetDimmConfig(__int64 a1, unsigned __int64 p_i, __int64 p_i_1, _QWORD *a4)
{
  unsigned __int8 Status1; // [rsp+20h] [rbp-58h]
  unsigned __int8 Status2; // [rsp+21h] [rbp-57h]
  unsigned int buf__1; // [rsp+24h] [rbp-54h]
  int ConfigIndex; // [rsp+28h] [rbp-50h]
  unsigned int LaneIndex; // [rsp+2Ch] [rbp-4Ch]
  int VendorInfo; // [rsp+30h] [rbp-48h]
  unsigned int buf_; // [rsp+34h] [rbp-44h]
  unsigned int n2; // [rsp+38h] [rbp-40h]
  __int64 p_i_2; // [rsp+40h] [rbp-38h]

  if ( p_i_1 == *(_QWORD *)(a1 + 10) ) /*0x6e51*/
  {
    Status1 = *(_BYTE *)(a1 + 7); /*0x6e5e*/
    p_i_2 = *(_QWORD *)(a1 + 10); /*0x6e6e*/
    Status2 = *(_BYTE *)(a1 + 5); /*0x6e7e*/
  }
  else
  {
    VendorInfo = NvdimmGetVendorInfo(p_i_1); /*0x6e91*/
    if ( VendorInfo == -1 ) /*0x6e9a*/
      return 0x8000000000000002uLL; /*0x6ea6*/
    Status1 = byte_C60A8[39 * VendorInfo + 28]; /*0x6ec1*/
    p_i_2 = p_i_1; /*0x6ecd*/
    Status2 = byte_C60A8[39 * VendorInfo + 24]; /*0x6ee6*/
  }
  if ( p_i == p_i_2 ) /*0x6f00*/
  {
    *a4 = 0; /*0x6f0a*/
    return 0; /*0x6f11*/
  }
  else
  {
    buf_ = buf__0; /*0x6f21*/
    buf__1 = NvdimmVendorCommand(p_i_1); /*0x6f32*/
    if ( buf__1 ) /*0x6f3b*/
    {
      if ( buf_ == buf__1 ) /*0x6f54*/
        n2 = 2; /*0x6f56*/
      else
        n2 = buf_ / buf__1; /*0x6f6a*/
      ConfigIndex = Status2 * buf_; /*0x6fee*/
      for ( LaneIndex = 0; LaneIndex < n2 && (unsigned int)((p_i - p_i_2) % (p_i - p_i_2)) != ConfigIndex; ++LaneIndex ) /*0x6ff2*/
        ConfigIndex += buf__1; /*0x7028*/
      *a4 = p_i % buf__1 /*0x7073*/
          + n2 * buf__1 * (unsigned __int64)(unsigned int)((p_i - p_i_2) / (Status1 * (unsigned __int64)(n2 * buf__1)))
          + buf__1 * LaneIndex;
      return 0; /*0x7076*/
    }
    else
    {
      return 0x8000000000000002uLL; /*0x6f3d*/
    }
  }
}


// Function: NvdimmSetDimmConfig @ 0x7080 (0x445 bytes)
// Index: 37/150

unsigned __int64 __fastcall NvdimmSetDimmConfig(__int64 a1, unsigned __int64 p_i, __int64 p_i_1, _QWORD *a4)
{
  unsigned __int8 Status1; // [rsp+20h] [rbp-68h]
  unsigned __int8 Status2; // [rsp+21h] [rbp-67h]
  unsigned int buf__1; // [rsp+24h] [rbp-64h]
  unsigned int buf_; // [rsp+28h] [rbp-60h]
  unsigned int LaneIndex; // [rsp+2Ch] [rbp-5Ch]
  int ResultStatus; // [rsp+34h] [rbp-54h]
  _DWORD *ConfigStatus; // [rsp+38h] [rbp-50h]
  int VendorInfo; // [rsp+40h] [rbp-48h]
  unsigned int n2; // [rsp+44h] [rbp-44h]
  __int64 p_i_2; // [rsp+48h] [rbp-40h]

  if ( p_i_1 == *(_QWORD *)(a1 + 10) ) /*0x70c8*/
  {
    Status2 = *(_BYTE *)(a1 + 7); /*0x70d5*/
    p_i_2 = *(_QWORD *)(a1 + 10); /*0x70e5*/
    Status1 = *(_BYTE *)(a1 + 5); /*0x70f5*/
  }
  else
  {
    VendorInfo = NvdimmGetVendorInfo(p_i_1); /*0x7108*/
    if ( VendorInfo == -1 ) /*0x7111*/
      return 0x8000000000000002uLL; /*0x711d*/
    Status2 = byte_C60A8[39 * VendorInfo + 28]; /*0x7138*/
    p_i_2 = p_i_1; /*0x7144*/
    Status1 = byte_C60A8[39 * VendorInfo + 24]; /*0x715d*/
  }
  if ( p_i == p_i_2 ) /*0x7177*/
  {
    *a4 = 0; /*0x7181*/
    return 0; /*0x718d*/
  }
  buf_ = buf__0; /*0x7198*/
  buf__1 = NvdimmVendorCommand(p_i_1); /*0x71a9*/
  if ( !buf__1 ) /*0x71b2*/
    return 0x8000000000000002uLL; /*0x71be*/
  if ( buf_ == buf__1 ) /*0x71cb*/
    n2 = 2; /*0x71cd*/
  else
    n2 = buf_ / (2 * buf__1); /*0x71ed*/
  switch ( Status2 ) /*0x7274*/
  {
    case 1u: /*0x7274*/
      if ( buf_ == buf__1 ) /*0x72a0*/
        ConfigStatus = &dword_19900[2 * Status1]; /*0x72be*/
      else
        ConfigStatus = &dword_192E0[8 * Status1]; /*0x72e7*/
LABEL_32:
      ResultStatus = buf__1 * *ConfigStatus; /*0x7417*/
      for ( LaneIndex = 0; /*0x7427*/
            LaneIndex < n2
         && (unsigned int)((p_i - p_i_2) % (2 * Status2 * (unsigned __int64)(n2 * buf__1))) != ResultStatus;
            ++LaneIndex )
      {
        ResultStatus += buf__1 * ConfigStatus[LaneIndex]; /*0x746a*/
      }
      *a4 = p_i % buf__1 /*0x74b5*/
          + n2
          * buf__1
          * (unsigned __int64)(unsigned int)((p_i - p_i_2) / (2 * Status2 * (unsigned __int64)(n2 * buf__1)))
          + buf__1 * LaneIndex;
      return 0; /*0x74b8*/
    case 2u: /*0x7274*/
      if ( buf_ == buf__1 ) /*0x72f9*/
        ConfigStatus = &dword_19320[2 * Status1]; /*0x7317*/
      else
        ConfigStatus = &dword_19460[8 * Status1]; /*0x7340*/
      goto LABEL_32; /*0x731c*/
    case 4u: /*0x7274*/
      if ( buf_ == buf__1 ) /*0x7352*/
        ConfigStatus = &dword_19110[2 * Status1]; /*0x7370*/
      else
        ConfigStatus = &dword_19340[8 * Status1]; /*0x7399*/
      goto LABEL_32; /*0x7375*/
    case 8u: /*0x7274*/
      ConfigStatus = &dword_194E0[8 * Status1]; /*0x73c2*/
      goto LABEL_32; /*0x73c7*/
  }
  if ( DebugLevelEnabled() ) /*0x73c9*/
  {
    if ( DebugLevelCheck(0x80000000) ) /*0x73da*/
      DebugPrint(0x80000000, "\n*** ERROR. Invalid 'iMCSize' value, current value is 0x%X ***\n", buf_); /*0x73f7*/
  }
  return 0x8000000000000003uLL; /*0x74bd*/
}


// Function: NvdimmGetDimmStatus @ 0x74c8 (0x46b bytes)
// Index: 38/150

unsigned __int64 __fastcall NvdimmGetDimmStatus(__int64 a1, unsigned __int64 p_i, __int64 p_i_1, _QWORD *a4)
{
  unsigned __int8 Status1; // [rsp+20h] [rbp-68h]
  unsigned __int8 Status2; // [rsp+21h] [rbp-67h]
  unsigned int buf__1; // [rsp+24h] [rbp-64h]
  unsigned int buf_; // [rsp+28h] [rbp-60h]
  unsigned int LaneIndex; // [rsp+2Ch] [rbp-5Ch]
  int ResultStatus; // [rsp+34h] [rbp-54h]
  _DWORD *DimmStatus; // [rsp+38h] [rbp-50h]
  int VendorInfo; // [rsp+40h] [rbp-48h]
  unsigned int n2; // [rsp+44h] [rbp-44h]
  __int64 p_i_2; // [rsp+48h] [rbp-40h]

  if ( p_i_1 == *(_QWORD *)(a1 + 10) ) /*0x7510*/
  {
    Status2 = *(_BYTE *)(a1 + 7); /*0x751d*/
    p_i_2 = *(_QWORD *)(a1 + 10); /*0x752d*/
    Status1 = *(_BYTE *)(a1 + 5); /*0x753d*/
  }
  else
  {
    VendorInfo = NvdimmGetVendorInfo(p_i_1); /*0x7550*/
    if ( VendorInfo == -1 ) /*0x7559*/
      return 0x8000000000000002uLL; /*0x7565*/
    Status2 = byte_C60A8[39 * VendorInfo + 28]; /*0x7580*/
    p_i_2 = p_i_1; /*0x758c*/
    Status1 = byte_C60A8[39 * VendorInfo + 24]; /*0x75a5*/
  }
  if ( p_i == p_i_2 ) /*0x75bf*/
  {
    *a4 = 0; /*0x75c9*/
    return 0; /*0x75d5*/
  }
  buf_ = buf__0; /*0x75e0*/
  buf__1 = NvdimmVendorCommand(p_i_1); /*0x75f1*/
  if ( !buf__1 ) /*0x75fa*/
    return 0x8000000000000002uLL; /*0x7606*/
  if ( buf_ == buf__1 ) /*0x7613*/
    n2 = 2; /*0x7615*/
  else
    n2 = buf_ / buf__1; /*0x7629*/
  switch ( Status2 ) /*0x76b2*/
  {
    case 1u: /*0x76b2*/
      if ( buf_ == buf__1 ) /*0x76de*/
        DimmStatus = &dword_19440[2 * Status1]; /*0x76fc*/
      else
        DimmStatus = &dword_19160[16 * (unsigned __int64)Status1]; /*0x7725*/
LABEL_34:
      ResultStatus = buf__1 * *DimmStatus; /*0x7885*/
      for ( LaneIndex = 0; /*0x7895*/
            LaneIndex < n2
         && (unsigned int)((p_i - p_i_2) % (3 * Status2 * (unsigned __int64)(n2 * buf__1))) != ResultStatus;
            ++LaneIndex )
      {
        ResultStatus += buf__1 * DimmStatus[LaneIndex]; /*0x78d8*/
      }
      *a4 = p_i % buf__1 /*0x7923*/
          + n2
          * buf__1
          * (unsigned __int64)(unsigned int)((p_i - p_i_2) / (3 * Status2 * (unsigned __int64)(n2 * buf__1)))
          + buf__1 * LaneIndex;
      return 0; /*0x7926*/
    case 2u: /*0x76b2*/
      if ( buf_ == buf__1 ) /*0x7737*/
        DimmStatus = &dword_19750[2 * Status1]; /*0x7755*/
      else
        DimmStatus = &dword_19780[16 * (unsigned __int64)Status1]; /*0x777e*/
      goto LABEL_34; /*0x775a*/
    case 4u: /*0x76b2*/
      if ( buf_ == buf__1 ) /*0x7790*/
        DimmStatus = &dword_196F0[2 * Status1]; /*0x77ae*/
      else
        DimmStatus = &dword_19910[16 * (unsigned __int64)Status1]; /*0x77d7*/
      goto LABEL_34; /*0x77b3*/
    case 8u: /*0x76b2*/
      if ( buf_ == buf__1 ) /*0x77e9*/
        DimmStatus = &dword_19220[2 * Status1]; /*0x7807*/
      else
        DimmStatus = &dword_19C10[16 * (unsigned __int64)Status1]; /*0x7830*/
      goto LABEL_34; /*0x780c*/
  }
  if ( DebugLevelEnabled() ) /*0x7837*/
  {
    if ( DebugLevelCheck(0x80000000) ) /*0x7848*/
      DebugPrint(0x80000000, "\n*** ERROR. Invalid 'iMCSize' value, current value is 0x%X ***\n", buf_); /*0x7865*/
  }
  return 0x8000000000000003uLL; /*0x792b*/
}


// Function: NvdimmCheckHealth @ 0x7934 (0xac bytes)
// Index: 39/150

unsigned __int64 __fastcall NvdimmCheckHealth(__int64 a1, unsigned __int64 p_i, __int64 p_i_1, _QWORD *a4)
{
  char HealthResult; // [rsp+20h] [rbp-18h]
  __int64 HealthStatus; // [rsp+28h] [rbp-10h]

  HealthStatus = 0; /*0x794c*/
  HealthResult = *(_BYTE *)(a1 + 8); /*0x795d*/
  switch ( HealthResult ) /*0x7966*/
  {
    case 1: /*0x7966*/
      return NvdimmGetDimmConfig(a1, p_i, p_i_1, a4); /*0x7991*/
    case 2: /*0x7966*/
      return NvdimmSetDimmConfig(a1, p_i, p_i_1, a4); /*0x79b1*/
    case 3: /*0x7966*/
      return NvdimmGetDimmStatus(a1, p_i, p_i_1, a4); /*0x79d1*/
  }
  return HealthStatus; /*0x79db*/
}


// Function: NvdimmSetFeatures @ 0x79e0 (0x45d bytes)
// Index: 40/150

unsigned __int64 __fastcall NvdimmSetFeatures(__int64 a1, __int64 a2, unsigned __int64 a3, unsigned __int64 *a4)
{
  unsigned __int64 EfiStatus; // rax
  unsigned __int8 n3; // [rsp+20h] [rbp-58h]
  unsigned int buf_; // [rsp+24h] [rbp-54h]
  unsigned __int8 Status1; // [rsp+28h] [rbp-50h]
  char Status2; // [rsp+29h] [rbp-4Fh]
  unsigned int FeatureResult1; // [rsp+2Ch] [rbp-4Ch]
  unsigned int FeatureResult2; // [rsp+30h] [rbp-48h]
  int buf__1; // [rsp+34h] [rbp-44h]
  unsigned int n2; // [rsp+3Ch] [rbp-3Ch]
  unsigned __int64 FinalResult; // [rsp+40h] [rbp-38h]
  unsigned __int64 CmdStatus; // [rsp+48h] [rbp-30h]

  FeatureResult1 = 0; /*0x7a11*/
  Status2 = 0; /*0x7a19*/
  if ( NvdimmGetHealthFlagDesc(a2) ) /*0x7a26*/
  {
    buf_ = NvdimmVendorCommand(a2); /*0x7a3f*/
    n3 = byte_C60A8[39 * dword_C5478 + 24]; /*0x7a58*/
    Status2 = 1; /*0x7a5c*/
  }
  else
  {
    n3 = *(_BYTE *)(a1 + 5); /*0x7a6e*/
    buf_ = buf__1; /*0x7a78*/
  }
  if ( !buf_ ) /*0x7a81*/
    return 0x8000000000000002uLL; /*0x7a83*/
  buf__1 = buf__0; /*0x7a98*/
  Status1 = *(_BYTE *)(a1 + 7); /*0x7aa7*/
  if ( buf__0 == buf_ ) /*0x7ab3*/
    n2 = 2; /*0x7ab5*/
  else
    n2 = buf__0 / buf_; /*0x7ac9*/
  FinalResult = n2 * buf_; /*0x7ad8*/
  CmdStatus = a3 / FinalResult; /*0x7aec*/
  FeatureResult2 = a3 % FinalResult / buf_; /*0x7b0c*/
  switch ( Status1 ) /*0x7b1d*/
  {
    case 1u: /*0x7b1d*/
      if ( DebugLevelEnabled() && n3 >= 3u ) /*0x7b59*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xB65u, "i < (1 * 3)"); /*0x7b6e*/
      if ( buf__1 == buf_ ) /*0x7b81*/
        FeatureResult1 = buf_ * dword_19440[2 * n3 + FeatureResult2]; /*0x7b9f*/
      else
        FeatureResult1 = buf_ * dword_19160[16 * (unsigned __int64)n3 + FeatureResult2]; /*0x7bc7*/
      break;
    case 2u: /*0x7b1d*/
      if ( DebugLevelEnabled() && n3 >= 6u ) /*0x7be4*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xB6Eu, "i < (2 * 3)"); /*0x7bf9*/
      if ( buf__1 == buf_ ) /*0x7c0c*/
        FeatureResult1 = buf_ * dword_19750[2 * n3 + FeatureResult2]; /*0x7c2a*/
      else
        FeatureResult1 = buf_ * dword_19780[16 * (unsigned __int64)n3 + FeatureResult2]; /*0x7c52*/
      break;
    case 4u: /*0x7b1d*/
      if ( DebugLevelEnabled() && n3 >= 0xCu ) /*0x7c6f*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xB77u, "i < (4 * 3)"); /*0x7c84*/
      if ( buf__1 == buf_ ) /*0x7c97*/
        FeatureResult1 = buf_ * dword_196F0[2 * n3 + FeatureResult2]; /*0x7cb5*/
      else
        FeatureResult1 = buf_ * dword_19910[16 * (unsigned __int64)n3 + FeatureResult2]; /*0x7cdd*/
      break;
    case 8u: /*0x7b1d*/
      if ( DebugLevelEnabled() && n3 >= 0x18u ) /*0x7cfa*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xB80u, "i < (8 * 3)"); /*0x7d0f*/
      if ( buf__1 == buf_ ) /*0x7d22*/
        FeatureResult1 = buf_ * dword_19220[2 * n3 + FeatureResult2]; /*0x7d40*/
      else
        FeatureResult1 = buf_ * dword_19C10[16 * (unsigned __int64)n3 + FeatureResult2]; /*0x7d68*/
      break;
  }
  if ( Status2 ) /*0x7d73*/
    EfiStatus = a3 % buf_ + FeatureResult1 + 3 * Status1 * FinalResult * CmdStatus + a2; /*0x7dc3*/
  else
    EfiStatus = a3 % buf_ + FeatureResult1 + 3 * Status1 * FinalResult * CmdStatus + *(_QWORD *)(a1 + 10); /*0x7e25*/
  *a4 = EfiStatus; /*0x7dce*/
  return 0; /*0x7e38*/
}


// Function: NvdimmGetFeatures @ 0x7e40 (0x36e bytes)
// Index: 41/150

unsigned __int64 __fastcall NvdimmGetFeatures(__int64 a1, __int64 CmdResult, unsigned __int64 a3, unsigned __int64 *a4)
{
  unsigned __int64 v5; // rax
  unsigned __int8 n2_1; // [rsp+20h] [rbp-58h]
  char v7; // [rsp+21h] [rbp-57h]
  unsigned __int8 v8; // [rsp+22h] [rbp-56h]
  unsigned int buf_; // [rsp+24h] [rbp-54h]
  unsigned int n2; // [rsp+2Ch] [rbp-4Ch]
  int buf__1; // [rsp+30h] [rbp-48h]
  unsigned int v12; // [rsp+34h] [rbp-44h]
  unsigned __int64 v13; // [rsp+40h] [rbp-38h]
  unsigned __int64 v14; // [rsp+48h] [rbp-30h]

  v7 = 0; /*0x7e79*/
  if ( NvdimmGetHealthFlagDesc(CmdResult) ) /*0x7e86*/
  {
    buf_ = NvdimmVendorCommand(CmdResult); /*0x7e9f*/
    n2_1 = byte_C60A8[39 * dword_C5478 + 24]; /*0x7eb8*/
    v7 = 1; /*0x7ebc*/
  }
  else
  {
    n2_1 = *(_BYTE *)(a1 + 5); /*0x7ece*/
    buf_ = buf__1; /*0x7ed8*/
  }
  if ( !buf_ ) /*0x7ee1*/
    return 0x8000000000000002uLL; /*0x7eed*/
  buf__1 = buf__0; /*0x7ef8*/
  v8 = *(_BYTE *)(a1 + 7); /*0x7f07*/
  if ( buf__0 == buf_ ) /*0x7f13*/
    n2 = 2; /*0x7f15*/
  else
    n2 = buf__0 / buf_; /*0x7f29*/
  switch ( v8 ) /*0x7f3a*/
  {
    case 1u: /*0x7f3a*/
      if ( v7 ) /*0x7f70*/
        *a4 = a3 + CmdResult; /*0x7f90*/
      else
        *a4 = a3 + *(_QWORD *)(a1 + 10); /*0x7fb1*/
      return 0; /*0x7f93*/
    case 2u: /*0x7f3a*/
      if ( DebugLevelEnabled() && n2_1 >= 2u ) /*0x7fcd*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xBD7u, "i < 2"); /*0x7fe2*/
      goto LABEL_21; /*0x7fe2*/
    case 4u: /*0x7f3a*/
LABEL_21:
      if ( DebugLevelEnabled() && n2_1 >= 4u ) /*0x8001*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xBD9u, "i < 4"); /*0x8016*/
      goto LABEL_24; /*0x8016*/
    case 8u: /*0x7f3a*/
LABEL_24:
      if ( DebugLevelEnabled() && n2_1 >= 8u ) /*0x8035*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xBDBu, "i < 8"); /*0x804a*/
      goto LABEL_27; /*0x804a*/
    case 0x10u: /*0x7f3a*/
LABEL_27:
      if ( DebugLevelEnabled() && n2_1 >= 0x10u ) /*0x8069*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xBDDu, "i < 16"); /*0x807e*/
      v13 = n2 * buf_; /*0x8094*/
      v14 = a3 / v13; /*0x80a8*/
      v12 = a3 % v13 / buf_ * buf_ + buf__1 * n2_1; /*0x80e1*/
      if ( v7 ) /*0x80ec*/
        v5 = a3 % buf_ + v12 + v8 * v13 * v14 + CmdResult; /*0x8138*/
      else
        v5 = a3 % buf_ + v12 + v8 * v13 * v14 + *(_QWORD *)(a1 + 10); /*0x8196*/
      *a4 = v5; /*0x8143*/
      break;
  }
  return 0; /*0x81a9*/
}


// Function: NvdimmSetEventInfo @ 0x81b0 (0x426 bytes)
// Index: 42/150

unsigned __int64 __fastcall NvdimmSetEventInfo(
        __int64 a1,
        __int64 CmdResult,
        unsigned __int64 a3,
        unsigned __int64 *a4)
{
  unsigned __int64 v5; // rax
  unsigned __int8 n2_1; // [rsp+20h] [rbp-58h]
  unsigned int buf_; // [rsp+24h] [rbp-54h]
  unsigned __int8 v8; // [rsp+28h] [rbp-50h]
  char v9; // [rsp+29h] [rbp-4Fh]
  unsigned int v10; // [rsp+2Ch] [rbp-4Ch]
  int v11; // [rsp+30h] [rbp-48h]
  int buf__1; // [rsp+34h] [rbp-44h]
  unsigned int n2; // [rsp+3Ch] [rbp-3Ch]
  unsigned __int64 v14; // [rsp+40h] [rbp-38h]
  unsigned __int64 v15; // [rsp+50h] [rbp-28h]

  v10 = 0; /*0x81d9*/
  v9 = 0; /*0x81e1*/
  if ( NvdimmGetHealthFlagDesc(CmdResult) ) /*0x81ee*/
  {
    buf_ = NvdimmVendorCommand(CmdResult); /*0x8207*/
    n2_1 = byte_C60A8[39 * dword_C5478 + 24]; /*0x8220*/
    v9 = 1; /*0x8224*/
  }
  else
  {
    n2_1 = *(_BYTE *)(a1 + 5); /*0x8236*/
    buf_ = buf__1; /*0x8240*/
  }
  if ( !buf_ ) /*0x8249*/
    return 0x8000000000000002uLL; /*0x824b*/
  buf__1 = buf__0; /*0x8260*/
  v8 = *(_BYTE *)(a1 + 7); /*0x826f*/
  if ( buf__0 == buf_ ) /*0x827b*/
    n2 = 2; /*0x827d*/
  else
    n2 = buf__0 / (2 * buf_); /*0x829d*/
  v14 = n2 * buf_; /*0x82ac*/
  v15 = a3 / v14; /*0x82c0*/
  v11 = a3 % v14 / buf_; /*0x82e0*/
  switch ( v8 ) /*0x82f1*/
  {
    case 1u: /*0x82f1*/
      if ( DebugLevelEnabled() && n2_1 >= 2u ) /*0x832d*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xC33u, "i < (1 * 2)"); /*0x8342*/
      if ( buf__1 == buf_ ) /*0x8355*/
        v10 = buf_ * dword_19900[2 * n2_1 + v11]; /*0x8373*/
      else
        v10 = buf_ * dword_192E0[8 * n2_1 + v11]; /*0x839b*/
      break;
    case 2u: /*0x82f1*/
      if ( DebugLevelEnabled() && n2_1 >= 4u ) /*0x83b8*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xC3Cu, "i < (2 * 2)"); /*0x83cd*/
      if ( buf__1 == buf_ ) /*0x83e0*/
        v10 = buf_ * dword_19320[2 * n2_1 + v11]; /*0x83fe*/
      else
        v10 = buf_ * dword_19460[8 * n2_1 + v11]; /*0x8426*/
      break;
    case 4u: /*0x82f1*/
      if ( DebugLevelEnabled() && n2_1 >= 8u ) /*0x8443*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xC45u, "i < (4 * 2)"); /*0x8458*/
      if ( buf__1 == buf_ ) /*0x846b*/
        v10 = buf_ * dword_19110[2 * n2_1 + v11]; /*0x8489*/
      else
        v10 = buf_ * dword_19340[8 * n2_1 + v11]; /*0x84b1*/
      break;
    case 8u: /*0x82f1*/
      if ( DebugLevelEnabled() && n2_1 >= 0x10u ) /*0x84cb*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xC4Eu, "i < (8 * 2)"); /*0x84e0*/
      v10 = buf_ * dword_194E0[8 * n2_1 + v11]; /*0x850d*/
      break;
  }
  if ( v9 ) /*0x8518*/
    v5 = a3 % buf_ + v10 + CmdResult + 2 * v8 * v14 * v15; /*0x8562*/
  else
    v5 = a3 % buf_ + v10 + *(_QWORD *)(a1 + 10) + 2 * v8 * v14 * v15; /*0x85be*/
  *a4 = v5; /*0x856d*/
  return 0; /*0x85d1*/
}


// Function: SmbusWaitIdle @ 0x85d8 (0xb3 bytes)
// Index: 43/150

unsigned __int64 __fastcall SmbusWaitIdle(__int64 a1, __int64 CmdResult, unsigned __int64 a3, unsigned __int64 *a4)
{
  char v5; // [rsp+20h] [rbp-18h]
  __int64 v6; // [rsp+28h] [rbp-10h]

  v6 = 0; /*0x85f0*/
  v5 = *(_BYTE *)(a1 + 8); /*0x8601*/
  switch ( v5 ) /*0x860d*/
  {
    case 3: /*0x860d*/
      return NvdimmSetFeatures(a1, CmdResult, a3, a4); /*0x8628*/
    case 2: /*0x860d*/
      return NvdimmSetEventInfo(a1, CmdResult, a3, a4); /*0x8652*/
    case 1: /*0x860d*/
      return NvdimmGetFeatures(a1, CmdResult, a3, a4); /*0x867c*/
  }
  return v6; /*0x8686*/
}


// Function: SmbusGetNvdimmBase @ 0x868c (0x97 bytes)
// Index: 44/150

char *__fastcall SmbusGetNvdimmBase(unsigned __int8 a1, char a2, char a3)
{
  unsigned __int8 i; // [rsp+0h] [rbp-18h]
  _BYTE *v5; // [rsp+8h] [rbp-10h]

  for ( i = 0; i < (int)(unsigned __int8)i_0; ++i ) /*0x86a6*/
  {
    v5 = &byte_C5628[56 * i]; /*0x86d8*/
    if ( *((_WORD *)v5 + 1) == a1 && v5[6] == a2 && v5[4] == a3 ) /*0x8711*/
      return &byte_C5628[56 * i]; /*0x8718*/
  }
  return 0; /*0x871e*/
}


// Function: SmbusReadNvdimmData @ 0x8724 (0x59a bytes)
// Index: 45/150

unsigned __int64 __fastcall SmbusReadNvdimmData(unsigned __int8 a1, unsigned __int8 a2, unsigned __int8 a3)
{
  char *NvdimmBase; // [rsp+30h] [rbp-18h]

  NvdimmBase = SmbusGetNvdimmBase(a1, a2, a3); /*0x8759*/
  if ( !NvdimmBase ) /*0x8764*/
    return 0x8000000000000002uLL; /*0x8766*/
  *((_WORD *)NvdimmBase + 14) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 218); /*0x87bd*/
  *((_WORD *)NvdimmBase + 13) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 220); /*0x8809*/
  *((_WORD *)NvdimmBase + 15) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 222); /*0x8855*/
  *((_WORD *)NvdimmBase + 16) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 306); /*0x88a1*/
  *((_WORD *)NvdimmBase + 17) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 308); /*0x88ed*/
  *((_WORD *)NvdimmBase + 18) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 310); /*0x8939*/
  NvdimmBase[38] = *(_BYTE *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 315); /*0x8984*/
  *(_WORD *)(NvdimmBase + 39) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 316); /*0x89cf*/
  *(_WORD *)(NvdimmBase + 41) = *(_WORD *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 322); /*0x8a1b*/
  *(_DWORD *)(NvdimmBase + 43) = *(unsigned __int8 *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 246) /*0x8b77*/
                               | (*(unsigned __int8 *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 247) << 8)
                               | (*(unsigned __int8 *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 248) << 16)
                               | (*(unsigned __int8 *)(dst + 5337LL * a1 + 2956 + 527LL * a2 + 2175 + 168LL * a3 + 249) << 24);
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(
      0x80000000,
      "JNP: NVDIMM Socket[%d] Channel[%d] Dimm[%d]:\n",
      *((unsigned __int16 *)NvdimmBase + 1),
      (unsigned __int8)NvdimmBase[6],
      (unsigned __int8)NvdimmBase[4]);
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(
      0x80000000,
      "JNP: VendorID = 0x%X, DeviceID = 0x%X\n",
      *((unsigned __int16 *)NvdimmBase + 14),
      *((unsigned __int16 *)NvdimmBase + 13));
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "JNP: Dimm Serial Number = 0x%X\n", *(_DWORD *)(NvdimmBase + 43));
  if ( DebugLevelEnabled() )
  {
    if ( DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "JNP: FormatInterfaceCode = 0x%X\n", *(unsigned __int16 *)(NvdimmBase + 41));
  }
  return 0; /*0x8cb9*/
}


// Function: SmbusSendCommand @ 0x8cc0 (0x65 bytes)
// Index: 46/150

__int64 SmbusSendCommand()
{
  __int64 i_1; // rax
  unsigned __int8 i; // [rsp+20h] [rbp-18h]

  for ( i = 0; ; ++i ) /*0x8cc4*/
  {
    i_1 = i; /*0x8cd5*/
    if ( i >= (int)(unsigned __int8)i_0 ) /*0x8ce3*/
      break; /*0x8ce3*/
    SmbusReadNvdimmData(byte_C5628[56 * i + 2], byte_C5628[56 * i + 6], byte_C5628[56 * i + 4]); /*0x8d19*/
  }
  return i_1; /*0x8d20*/
}


// Function: NfitBuildTable @ 0x8d28 (0x137 bytes)
// Index: 47/150

unsigned __int64 __fastcall NfitBuildTable(char *buf)
{
  __int64 v2; // [rsp+20h] [rbp-18h]

  if ( byte_C5608 ) /*0x8d4c*/
    return 0x8000000000000003uLL; /*0x8d4e*/
  if ( !byte_1A2F1 ) /*0x8d66*/
    return 0x800000000000000EuLL; /*0x8d68*/
  v2 = NvdimmFormatMessage(buf, 98344, j); /*0x8d8d*/
  if ( v2 >= 0 ) /*0x8d98*/
    return v2; /*0x8e55*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "Nfit: BuildNfitTable failed, status = %r\n", v2);
  if ( DebugLevelEnabled() ) /*0x8ddd*/
  {
    if ( DebugLevelEnabled() ) /*0x8df1*/
    {
      if ( DebugLevelCheck(0x80000000) ) /*0x8e02*/
        DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0x8e1f*/
    }
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xD50u, "!EFI_ERROR (Status)"); /*0x8e43*/
  }
  return v2; /*0x8e5a*/
}


// Function: NfitInit @ 0x8e60 (0x264 bytes)
// Index: 48/150

__int64 NfitInit()
{
  unsigned __int8 i; // [rsp+20h] [rbp-38h]
  unsigned __int8 j; // [rsp+21h] [rbp-37h]
  unsigned __int8 k; // [rsp+22h] [rbp-36h]
  unsigned __int16 v4; // [rsp+24h] [rbp-34h]
  __int16 v5; // [rsp+28h] [rbp-30h] BYREF
  __int64 v6; // [rsp+30h] [rbp-28h]
  __int64 v7; // [rsp+38h] [rbp-20h] BYREF
  __int64 v8[3]; // [rsp+40h] [rbp-18h] BYREF

  v8[0] = 0; /*0x8e64*/
  v7 = 0; /*0x8e6d*/
  v5 = -2; /*0x8e7b*/
  v6 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_19070, 0, v8); /*0x8e9b*/
  if ( DebugLevelEnabled() && v6 < 0 ) /*0x8eb2*/
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x8ec5*/
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v6); /*0x8ee2*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0xD72u, "!EFI_ERROR (Status)"); /*0x8f06*/
  }
  v4 = 0; /*0x8f13*/
  for ( i = 0; i < 4u; ++i ) /*0x8f18*/
  {
    for ( j = 0; j < 6u; ++j ) /*0x8f37*/
    {
      if ( *(_BYTE *)(dst + 5337LL * i + 2956 + 527LL * j + 2175) ) /*0x8f7d*/
      {
        for ( k = 0; k < 2u; ++k ) /*0x8f8b*/
        {
          if ( *(_BYTE *)(dst + 5337LL * i + 2956 + 527LL * j + 2175 + 168LL * k + 191) ) /*0x8fe5*/
          {
            v6 = NfitPopulateDimmIds(v8[0], (__int64)&v5, &v7); /*0x9007*/
            if ( v6 >= 0 && NfitGetDimmCount(i, j, k) ) /*0x9025*/
            {
              if ( v7 ) /*0x9037*/
              {
                LOBYTE(word_1F420[3 * v4]) = i; /*0x904d*/
                HIBYTE(word_1F420[3 * v4]) = j; /*0x9064*/
                LOBYTE(word_1F420[3 * v4 + 1]) = k; /*0x907c*/
                word_1F420[3 * v4++ + 2] = *(_WORD *)(v7 + 2); /*0x9099*/
              }
            }
          }
        }
      }
    }
  }
  return v4; /*0x90bf*/
}


// Function: NfitPopulateDimmIds @ 0x90c4 (0xc9 bytes)
// Index: 49/150

__int64 __fastcall NfitPopulateDimmIds(__int64 a1, __int64 a2, __int64 *a3)
{
  char v4; // [rsp+30h] [rbp-28h]
  char v5[7]; // [rsp+31h] [rbp-27h] BYREF
  __int64 v6; // [rsp+38h] [rbp-20h]
  __int64 v7; // [rsp+40h] [rbp-18h]

  v7 = 0x800000000000000EuLL; /*0x90e1*/
  v4 = 0; /*0x90e6*/
  v5[0] = 17; /*0x90eb*/
  do /*0x917d*/
  {
    v7 = (*(__int64 (__fastcall **)(__int64, __int64, char *, __int64 *, _QWORD))(a1 + 24))(a1, a2, v5, a3, 0); /*0x9115*/
    v6 = *a3; /*0x9122*/
    if ( *(_WORD *)(v6 + 12) /*0x9167*/
      && *(_WORD *)(v6 + 21)
      && *(_WORD *)(v6 + 8)
      && *(_WORD *)(v6 + 10)
      && *(_BYTE *)(v6 + 18) != 2 )
    {
      v4 = 1; /*0x9169*/
    }
  }
  while ( v7 >= 0 && !v4 ); /*0x917d*/
  return v7; /*0x9188*/
}


// Function: NfitGetDimmCount @ 0x9190 (0x5b bytes)
// Index: 50/150

bool __fastcall NfitGetDimmCount(unsigned __int8 i, unsigned __int8 j, unsigned __int8 k)
{
  return *(_DWORD *)(dst + 5337LL * i + 2956 + 527LL * j + 2175 + 168LL * k + 210) != 0; /*0x91ea*/
}


// Function: NfitSetDimmInfo @ 0x91ec (0xbd bytes)
// Index: 51/150

_BYTE *__fastcall NfitSetDimmInfo(
        __int64 a1,
        unsigned __int8 a2,
        unsigned __int8 n3,
        char a4,
        char a5,
        char n3a,
        char a7,
        char a8)
{
  _BYTE *v9; // [rsp+0h] [rbp-18h]

  v9 = &byte_C5628[56 * (unsigned __int8)i_0]; /*0x921b*/
  *(_QWORD *)(v9 + 10) = a1; /*0x9228*/
  v9[6] = n3; /*0x9234*/
  v9[4] = a4; /*0x923f*/
  *((_WORD *)v9 + 1) = a2; /*0x924b*/
  *(_WORD *)v9 = n3 >= 3u; /*0x926d*/
  v9[55] = 0; /*0x9274*/
  v9[7] = a5; /*0x9280*/
  v9[8] = n3a; /*0x928b*/
  v9[5] = a7; /*0x9296*/
  v9[9] = a8; /*0x92a1*/
  return v9; /*0x92a4*/
}


// Function: NfitSetMemoryMap @ 0x92ac (0xa3 bytes)
// Index: 52/150

__int64 __fastcall NfitSetMemoryMap(char a1, char a2, char a3, __int64 a4, char a5, char n3, char a7)
{
  __int64 i; // rax
  _BYTE *v8; // [rsp+0h] [rbp-18h]

  i = (unsigned __int8)i; /*0x92c2*/
  if ( (unsigned __int8)i < 0x60uLL ) /*0x92cd*/
  {
    v8 = &byte_C60A8[39 * (unsigned __int8)i]; /*0x92e9*/
    *(_QWORD *)v8 = a4; /*0x92f6*/
    v8[25] = a1; /*0x9301*/
    v8[26] = a2; /*0x930c*/
    v8[27] = a3; /*0x9317*/
    v8[29] = n3; /*0x9322*/
    v8[28] = a5; /*0x932d*/
    v8[24] = a7; /*0x9338*/
    return (unsigned int)(unsigned __int8)i++ + 1; /*0x9342*/
  }
  return i; /*0x934a*/
}


// Function: NfitSetInterleave @ 0x9350 (0xff bytes)
// Index: 53/150

__int64 __fastcall NfitSetInterleave(char a1, char n3, __int64 a3, __int64 a4)
{
  unsigned __int8 i; // [rsp+40h] [rbp-18h]
  char v6; // [rsp+41h] [rbp-17h]

  v6 = 0; /*0x936f*/
  for ( i = 0; i < (int)*(unsigned __int8 *)(a4 + 18); ++i ) /*0x9379*/
    NfitSetMemoryMap( /*0x9431*/
      *(_BYTE *)(a4 + 163LL * i + 20),
      *(_BYTE *)(a4 + 163LL * i + 22) + 3 * *(_BYTE *)(a4 + 163LL * i + 19),
      *(_BYTE *)(a4 + 163LL * i + 21),
      a3,
      a1,
      n3,
      v6++);
  return 0; /*0x944a*/
}


// Function: NfitSetControlRegion @ 0x9450 (0x1a6 bytes)
// Index: 54/150

__int64 __fastcall NfitSetControlRegion(char a1, char n3, __int64 a3, unsigned __int8 *a4)
{
  unsigned __int8 i; // [rsp+40h] [rbp-28h]
  char v6; // [rsp+41h] [rbp-27h]
  char v7; // [rsp+42h] [rbp-26h]

  v6 = 0; /*0x946f*/
  v7 = NvdimmStatusDecode(dst + 5337LL * a4[17] + 2956 + 19LL * a4[16] + 213); /*0x94bd*/
  for ( i = 0; i < (int)a4[18]; ++i ) /*0x94c1*/
  {
    NfitSetDimmInfo(a3, a4[163 * i + 20], a4[163 * i + 22] + 3 * a4[163 * i + 19], a4[163 * i + 21], a1, n3, v6, v7); /*0x9594*/
    ++i_0; /*0x95a1*/
    ++v6; /*0x95ad*/
  }
  if ( DebugLevelEnabled() && (unsigned __int8)i_0 > 0x30u ) /*0x95cc*/
    DebugAssert( /*0x95e1*/
      "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c",
      0xEBDu,
      "CrInfo.NumAepDimms <= (((2)*(3)) * 4) * 2");
  return 0; /*0x95f1*/
}


// Function: NfitSetFlushHint @ 0x95f8 (0x276 bytes)
// Index: 55/150

__int64 NfitSetFlushHint()
{
  __int64 i_1; // rax
  unsigned __int8 i; // [rsp+20h] [rbp-28h]
  unsigned __int8 n0x18; // [rsp+21h] [rbp-27h]
  unsigned __int8 n4; // [rsp+22h] [rbp-26h]
  char n5; // [rsp+23h] [rbp-25h]
  char n3; // [rsp+24h] [rbp-24h]
  char PageSize; // [rsp+25h] [rbp-23h]
  __int64 Result2; // [rsp+28h] [rbp-20h]
  unsigned __int64 v8; // [rsp+30h] [rbp-18h]

  for ( i = 0; ; ++i ) /*0x95fc*/
  {
    i_1 = i; /*0x960d*/
    if ( i >= 0x18u ) /*0x9615*/
      break; /*0x9615*/
    if ( *(_QWORD *)(j + 1323LL * i + 8) ) /*0x962e*/
    {
      n4 = *(_BYTE *)(j + 1323LL * i + 17); /*0x964f*/
      n0x18 = *(_BYTE *)(j + 1323LL * i + 16); /*0x966a*/
      Result2 = dst + 5337LL * n4 + 2956 + 19LL * n0x18 + 213; /*0x969a*/
      n5 = NvdimmStatusDecode(Result2); /*0x96a9*/
      PageSize = NvdimmGetPageSize(n4, n0x18); /*0x96ba*/
      buf__0 = NvdimmParseConfig(Result2); /*0x96c8*/
      buf__1 = NvdimmGetVendorDetails(Result2); /*0x96d8*/
      if ( n5 == 7 ) /*0x96e6*/
      {
        n3 = 3; /*0x96e8*/
      }
      else if ( n5 == 5 || n5 == 6 || n5 == 3 ) /*0x970b*/
      {
        n3 = 2; /*0x970d*/
      }
      else
      {
        n3 = 1; /*0x9714*/
      }
      if ( n0x18 ) /*0x9720*/
        v8 = (unsigned __int64)*(unsigned int *)(dst + 5337LL * n4 + 2956 + 19LL * (n0x18 - 1) + 217) << 26; /*0x9798*/
      else
        v8 = 0; /*0x9722*/
      NfitSetControlRegion(PageSize, n3, v8, (unsigned __int8 *)(1323LL * i + j)); /*0x9831*/
      NfitSetInterleave(PageSize, n3, v8, 1323LL * i + j); /*0x985f*/
    }
  }
  return i_1; /*0x9869*/
}


// Function: NfitSetPlatformAddr @ 0x9870 (0x80 bytes)
// Index: 56/150

__int64 __fastcall NfitSetPlatformAddr(__int64 a1)
{
  __int64 v1; // rdx
  __int64 v2; // rdx
  __int64 v3; // rcx
  __int64 result; // rax
  char v5; // [rsp+20h] [rbp-18h]
  char v6; // [rsp+21h] [rbp-17h]
  unsigned int v7; // [rsp+24h] [rbp-14h]

  v6 = (unsigned __int8)a1 / 2; /*0x9882*/
  v5 = a1 & 1; /*0x9893*/
  v1 = a1 & 1; /*0x989d*/
  LOBYTE(a1) = v6; /*0x98a1*/
  v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(a1, v1, 117459216); /*0x98af*/
  result = v7 >> 31; /*0x98ba*/
  if ( (_DWORD)result == 1 ) /*0x98c0*/
  {
    LOBYTE(v2) = v5; /*0x98d9*/
    LOBYTE(v3) = v6; /*0x98dd*/
    return (*(__int64 (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x98e8*/
             v3,
             v2,
             117459216,
             v7 & 0x7FFFFFFF);
  }
  return result; /*0x98eb*/
}


// Function: NfitSetDeviceHandle @ 0x98f0 (0x94 bytes)
// Index: 57/150

__int64 __fastcall NfitSetDeviceHandle(__int64 a1)
{
  __int64 v1; // rdx
  __int64 result; // rax
  __int64 v3; // rdx
  __int64 v4; // rcx
  char v5; // [rsp+20h] [rbp-18h]
  char v6; // [rsp+21h] [rbp-17h]
  int v7; // [rsp+24h] [rbp-14h]

  v6 = (unsigned __int8)a1 / 2; /*0x9902*/
  v1 = 0; /*0x990b*/
  v5 = a1 & 1; /*0x9913*/
  result = *(_BYTE *)(dst + 2859) & 1; /*0x9925*/
  if ( (*(_BYTE *)(dst + 2859) & 1) != 0 ) /*0x992a*/
  {
    LOBYTE(v1) = a1 & 1; /*0x9932*/
    LOBYTE(a1) = (unsigned __int8)a1 / 2; /*0x9936*/
    v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(a1, v1, 117459216); /*0x9944*/
    result = (unsigned int)v7 >> 31; /*0x994f*/
    if ( v7 >= 0 ) /*0x9954*/
    {
      LOBYTE(v3) = v5; /*0x996d*/
      LOBYTE(v4) = v6; /*0x9971*/
      return (*(__int64 (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x997c*/
               v4,
               v3,
               117459216,
               v7 | 0x80000000);
    }
  }
  return result; /*0x997f*/
}


// Function: ArsDoScrub @ 0x9984 (0x8bc bytes)
// Index: 58/150

__int64 ArsDoScrub()
{
  __int64 v1; // rcx
  __int64 v2; // rcx
  __int64 v3; // rdx
  __int64 v4; // rcx
  __int64 v5; // rdx
  __int64 v6; // rcx
  __int64 v7; // rdx
  __int64 v8; // rcx
  __int64 v9; // rdx
  __int64 v10; // rcx
  __int64 v11; // rdx
  __int64 v12; // rcx
  int v13; // eax
  __int64 v14; // rdx
  __int64 v15; // rcx
  int v16; // eax
  __int64 v17; // rcx
  __int64 v18; // rdx
  __int64 v19; // rdx
  __int64 v20; // rcx
  __int64 v21; // rcx
  __int64 v22; // rdx
  __int64 v23; // rdx
  __int64 v24; // rcx
  __int64 v25; // rdx
  __int64 v26; // rcx
  __int64 v27; // rdx
  __int64 v28; // rcx
  unsigned __int8 v29; // [rsp+30h] [rbp-88h]
  unsigned __int8 v30; // [rsp+31h] [rbp-87h]
  unsigned int v31; // [rsp+34h] [rbp-84h]
  unsigned __int8 v32; // [rsp+38h] [rbp-80h]
  unsigned __int8 v33; // [rsp+39h] [rbp-7Fh]
  unsigned int v34; // [rsp+3Ch] [rbp-7Ch]
  unsigned int v35; // [rsp+40h] [rbp-78h]
  char *NvdimmBase_1; // [rsp+48h] [rbp-70h]
  char *NvdimmBase; ... [8201 chars total]


// Function: ArsGetStatus @ 0xa240 (0x22b bytes)
// Index: 59/150

__int64 __fastcall ArsGetStatus(__int64 ProcessResult, __int64 a2)
{
  __int64 v3; // rcx
  __int64 v4; // rdx
  __int64 v5; // rcx
  __int64 v6; // rcx
  unsigned __int8 j; // [rsp+20h] [rbp-28h]
  unsigned __int8 i; // [rsp+21h] [rbp-27h]
  unsigned __int8 TotalDimm; // [rsp+22h] [rbp-26h]
  __int64 v10; // [rsp+30h] [rbp-18h]

  if ( byte_1A2E0 ) /*0xa260*/
    return 6; /*0xa262*/
  i_1 = 0; /*0xa26c*/
  ProcessResult_0 = ProcessResult; /*0xa27b*/
  qword_1A9CC = a2; /*0xa287*/
  n2 = 2; /*0xa293*/
  word_1A9E6 = 0; /*0xa29c*/
  n44 = 44; /*0xa2a3*/
  byte_1F218 = 0; /*0xa2ad*/
  ProcessResult = ProcessResult; /*0xa2ce*/
  qword_1F208 = *(_QWORD *)&byte_C60A8[39 * dword_1F29C[0] + 16] - *(_QWORD *)&byte_C60A8[39 * dword_1F29C[0] + 8]; /*0xa302*/
  --byte_1F298; /*0xa311*/
  for ( i = 0; i < 4u; ++i ) /*0xa317*/
  {
    for ( j = 0; j < 2u; ++j ) /*0xa336*/
    {
      if ( *(_BYTE *)(dst + 5337LL * i + 2956 + j + 2) ) /*0xa375*/
      {
        v3 = j & 1 | (2 * (unsigned int)i); /*0xa39e*/
        TotalDimm = j & 1 | (2 * i); /*0xa3a2*/
        LOBYTE(v3) = i; /*0xa3b0*/
        if ( (*(unsigned int (__fastcall **)(__int64, _QWORD, __int64))(qword_C5470 + 40))(v3, j, 117459220) >> 31 == 1 ) /*0xa3cf*/
        {
          LOBYTE(v4) = j; /*0xa3d7*/
          LOBYTE(v5) = i; /*0xa3db*/
          dword_1F560[TotalDimm] = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))( /*0xa3f5*/
                                     v5,
                                     v4,
                                     117459168);
          JedecNvDimmGetInfo(TotalDimm); /*0xa3fc*/
          LOBYTE(v6) = j & 1 | (2 * i); /*0xa401*/
          JedecNvDimmSetPowerLimits(v6); /*0xa405*/
          byte_1F210[TotalDimm] = 1; /*0xa416*/
        }
        else
        {
          byte_1F210[TotalDimm] = 0; /*0xa428*/
        }
      }
    }
  }
  v10 = ArsDoScrub(); /*0xa43b*/
  if ( !v10 ) /*0xa446*/
  {
    if ( !byte_1A2F0 ) /*0xa451*/
      byte_1A2F0 = 1; /*0xa453*/
    byte_1A2E0 = 1; /*0xa45a*/
  }
  return v10; /*0xa466*/
}


// Function: ArsGetCapabilities @ 0xa46c (0xa2 bytes)
// Index: 60/150

__int64 ArsGetCapabilities()
{
  __int64 j_1; // rax
  unsigned __int8 i; // [rsp+0h] [rbp-18h]
  unsigned __int8 j; // [rsp+0h] [rbp-18h]

  for ( i = 0; i < (int)(unsigned __int8)::i && i < 0x60uLL; ++i ) /*0xa470*/
  {
    *(_QWORD *)&byte_C60A8[39 * i + 8] = 0; /*0xa4a6*/
    *(_QWORD *)&byte_C60A8[39 * i + 16] = 0; /*0xa4be*/
    byte_C60A8[39 * i + 30] = 0; /*0xa4d6*/
  }
  for ( j = 0; ; ++j ) /*0xa4dd*/
  {
    j_1 = j; /*0xa4eb*/
    if ( j >= 0x30u ) /*0xa4f2*/
      break; /*0xa4f2*/
    qword_C5480[j] = 0; /*0xa4ff*/
  }
  return j_1; /*0xa509*/
}


// Function: ArsCompDPAs @ 0xa510 (0x4ce bytes)
// Index: 61/150

unsigned __int64 __fastcall ArsCompDPAs(unsigned __int64 TableEntry, unsigned __int64 i, unsigned __int64 a3)
{
  char v4; // [rsp+30h] [rbp-68h] BYREF
  char v5; // [rsp+31h] [rbp-67h] BYREF
  unsigned __int8 v6; // [rsp+32h] [rbp-66h] BYREF
  unsigned __int8 j; // [rsp+33h] [rbp-65h]
  int MsgPayload; // [rsp+34h] [rbp-64h]
  unsigned __int8 HealthFlags; // [rsp+38h] [rbp-60h]
  unsigned int v10; // [rsp+3Ch] [rbp-5Ch]
  unsigned __int64 v11; // [rsp+40h] [rbp-58h]
  char v12; // [rsp+48h] [rbp-50h]
  unsigned __int64 TableEntry_1; // [rsp+50h] [rbp-48h]
  __int64 NvdimmBase; // [rsp+58h] [rbp-40h]
  unsigned __int64 v15; // [rsp+60h] [rbp-38h]
  __int64 v16; // [rsp+68h] [rbp-30h]
  __int64 v17; // [rsp+70h] [rbp-28h]
  __int64 v18; // [rsp+78h] [rbp-20h]
  unsigned __int64 v19; // [rsp+80h] [rbp-18h]
  __int64 v20; // [rsp+88h] [rbp-10h]
  unsigned __int64 p_i; // [rsp+A8h] [rbp+10h] BYREF
  unsigned __int64 v23; // [rsp+B0h] [rbp+18h]

  v23 = a3; /*0xa510*/
  p_i = i; /*0xa515*/
  NvdimmBase = 0; /*0xa526*/
  v11 = JedecNvDimmCmdLoop(TableEntry, &p_i, &v5, &v4, &v6); /*0xa558*/
  if ( v11 ) /*0xa563*/
    return v11; /*0xa565*/
  v10 = NvdimmVendorCommand(p_i); /*0xa57c*/
  v12 = NvdimmManageSecurity(p_i, v5, v4); /*0xa596*/
  HealthFlags = NvdimmGetHealthFlags(p_i); /*0xa5a7*/
  MsgPayload = NvdimmGetMsgPayload(p_i, v5, v4, v6); /*0xa5c6*/
  if ( MsgPayload < 0 ) /*0xa5cf*/
    return 0x800000000000000EuLL; /*0xa5d1*/
  if ( MsgPayload >= 96 ) /*0xa5e7*/
    return 0x8000000000000005uLL; /*0xa5e9*/
  dword_1F29C[(unsigned __int8)byte_1F298] = MsgPayload; /*0xa60a*/
  NvdimmBase = (__int64)SmbusGetNvdimmBase(v5, v4, v6); /*0xa61f*/
  if ( !NvdimmBase ) /*0xa62a*/
    return 0x8000000000000002uLL; /*0xa62c*/
  v11 = NvdimmCheckHealth(NvdimmBase, TableEntry, p_i, &byte_C60A8[39 * MsgPayload + 8]); /*0xa66d*/
  if ( v11 )
  {
    if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "ARS: CompDPAs - Xlation from Spa to Dpa failed! returning\n");
    }
    return v11; /*0xa6b4*/
  }
  else
  {
    v16 = 39LL * MsgPayload; /*0xa6c7*/
    v15 = (unsigned __int8)byte_C60A8[v16 + 29] * (unsigned __int8)byte_C60A8[v16 + 28]; /*0xa706*/
    *(_QWORD *)&byte_C60A8[v16 + 16] = *(_QWORD *)&byte_C60A8[v16 + 8] + v23 / v15; /*0xa737*/
    if ( v10 ) /*0xa741*/
    {
      v17 = v10; /*0xa747*/
      if ( TableEntry % v10 ) /*0xa75e*/
      {
        v18 = v10; /*0xa76a*/
        TableEntry_1 = v10 * (TableEntry / v10); /*0xa789*/
      }
    }
    else
    {
      TableEntry_1 = TableEntry; /*0xa798*/
    }
    for ( j = 0; j < HealthFlags - 1; ++j ) /*0xa79d*/
    {
      TableEntry_1 += v10; /*0xa7d1*/
      if ( TableEntry_1 > v23 + TableEntry ) /*0xa7f1*/
        return v11; /*0xa7f1*/
      v11 = JedecNvDimmCmdLoop(TableEntry_1, &p_i, &v5, &v4, &v6); /*0xa81e*/
      MsgPayload = NvdimmGetMsgPayload(p_i, v5, v4, v6); /*0xa83e*/
      if ( MsgPayload == -1 ) /*0xa847*/
        return 0x8000000000000002uLL; /*0xa853*/
      dword_1F29C[(unsigned __int8)byte_1F298 + 1 + j] = MsgPayload; /*0xa875*/
      NvdimmBase = (__int64)SmbusGetNvdimmBase(v5, v4, v6); /*0xa88a*/
      if ( !NvdimmBase ) /*0xa895*/
        return 0x8000000000000002uLL; /*0xa8a1*/
      if ( DebugLevelEnabled() && (unsigned __int64)MsgPayload >= 0x60 ) /*0xa8bb*/
        DebugAssert( /*0xa8d0*/
          "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c",
          0x1166u,
          "Index < (sizeof(CrInfo.PMEMInfo) / sizeof(CrInfo.PMEMInfo[0]))");
      if ( (unsigned __int64)MsgPayload >= 0x60 ) /*0xa8e4*/
        return 0x8000000000000002uLL; /*0xa9b4*/
      v11 = NvdimmCheckHealth(NvdimmBase, TableEntry_1, p_i, &byte_C60A8[39 * MsgPayload + 8]); /*0xa919*/
      v20 = 39LL * MsgPayload; /*0xa927*/
      v19 = (unsigned __int8)byte_C60A8[v20 + 29] * (unsigned __int8)byte_C60A8[v20 + 28]; /*0xa969*/
      *(_QWORD *)&byte_C60A8[v20 + 16] = *(_QWORD *)&byte_C60A8[v20 + 8] + v23 / v19; /*0xa9a3*/
    }
    byte_1F298 += HealthFlags; /*0xa9cb*/
    return v11; /*0xa9d1*/
  }
}


// Function: ArsStart @ 0xa9e0 (0x405 bytes)
// Index: 62/150

__int64 __fastcall ArsStart(_BYTE *ArsBuffer)
{
  __int64 result; // rax
  _BYTE v2[8]; // [rsp+20h] [rbp-18h] BYREF
  _BYTE *v3; // [rsp+28h] [rbp-10h]

  v3 = ArsBuffer + 12; /*0xa9f2*/
  NvdimmFwSendCommand(ArsBuffer, 0); /*0xa9fe*/
  NvdimmReadStatus(ArsBuffer, 6u, v2); /*0xaa0f*/
  *v3 = v2[0]; /*0xaa1d*/
  NvdimmReadStatus(ArsBuffer, 1u, v2); /*0xaa2b*/
  v3[1] = v2[0]; /*0xaa39*/
  NvdimmReadStatus(ArsBuffer, 2u, v2); /*0xaa48*/
  v3[2] = v2[0]; /*0xaa56*/
  NvdimmReadStatus(ArsBuffer, 3u, v2); /*0xaa65*/
  v3[3] = v2[0]; /*0xaa73*/
  NvdimmReadStatus(ArsBuffer, 4u, v2); /*0xaa82*/
  *((_DWORD *)v3 + 1) = v2[0]; /*0xaa91*/
  NvdimmReadStatus(ArsBuffer, 7u, v2); /*0xaaa0*/
  *((_WORD *)v3 + 4) = v2[0]; /*0xaaaf*/
  NvdimmReadStatus(ArsBuffer, 8u, v2); /*0xaabf*/
  *((_WORD *)v3 + 4) |= 16 * v2[0]; /*0xaade*/
  NvdimmReadStatus(ArsBuffer, 9u, v2); /*0xaaee*/
  *((_WORD *)v3 + 4) |= v2[0] << 8; /*0xab0d*/
  NvdimmReadStatus(ArsBuffer, 0xAu, v2); /*0xab1d*/
  *((_WORD *)v3 + 4) |= v2[0] << 12; /*0xab3c*/
  v3[11] = 2; /*0xab45*/
  NvdimmReadStatus(ArsBuffer, 0x10u, v2); /*0xab55*/
  v3[12] = v2[0]; /*0xab63*/
  NvdimmReadStatus(ArsBuffer, 0x16u, v2); /*0xab72*/
  v3[13] = v2[0]; /*0xab80*/
  NvdimmReadStatus(ArsBuffer, 0x15u, v2); /*0xab8f*/
  v3[14] = v2[0]; /*0xab9d*/
  NvdimmReadStatus(ArsBuffer, 0x17u, v2); /*0xabac*/
  v3[15] = v2[0]; /*0xabba*/
  NvdimmReadStatus(ArsBuffer, 0x18u, v2); /*0xabc9*/
  *((_DWORD *)v3 + 4) = v2[0]; /*0xabd8*/
  NvdimmReadStatus(ArsBuffer, 0x19u, v2); /*0xabe7*/
  *((_DWORD *)v3 + 4) |= v2[0] << 8; /*0xac05*/
  NvdimmReadStatus(ArsBuffer, 0x1Cu, v2); /*0xac14*/
  *((_DWORD *)v3 + 5) = v2[0]; /*0xac23*/
  NvdimmReadStatus(ArsBuffer, 0x1Du, v2); /*0xac32*/
  *((_DWORD *)v3 + 5) |= v2[0] << 8; /*0xac50*/
  NvdimmReadStatus(ArsBuffer, 0x1Eu, v2); /*0xac5f*/
  *((_DWORD *)v3 + 6) = v2[0]; /*0xac6e*/
  NvdimmReadStatus(ArsBuffer, 0x1Fu, v2); /*0xac7d*/
  *((_DWORD *)v3 + 6) |= v2[0] << 8; /*0xac9b*/
  NvdimmReadStatus(ArsBuffer, 0x20u, v2); /*0xacaa*/
  *((_DWORD *)v3 + 7) = v2[0]; /*0xacb9*/
  NvdimmReadStatus(ArsBuffer, 0x21u, v2); /*0xacc8*/
  *((_DWORD *)v3 + 7) |= v2[0] << 8; /*0xace6*/
  NvdimmReadStatus(ArsBuffer, 0x22u, v2); /*0xacf5*/
  *((_DWORD *)v3 + 8) = v2[0]; /*0xad04*/
  NvdimmReadStatus(ArsBuffer, 0x23u, v2); /*0xad13*/
  *((_DWORD *)v3 + 8) |= v2[0] << 8; /*0xad31*/
  NvdimmReadStatus(ArsBuffer, 0x24u, v2); /*0xad40*/
  *((_DWORD *)v3 + 9) = v2[0]; /*0xad4f*/
  NvdimmReadStatus(ArsBuffer, 0x25u, v2); /*0xad5e*/
  v3[40] = v2[0]; /*0xad6c*/
  NvdimmReadStatus(ArsBuffer, 0x26u, v2); /*0xad7b*/
  v3[41] = v2[0]; /*0xad89*/
  NvdimmReadStatus(ArsBuffer, 0x32u, v2); /*0xad98*/
  v3[42] = v2[0]; /*0xadaf*/
  NvdimmFwSendCommand(ArsBuffer, 3u); /*0xadba*/
  NvdimmReadStatus(ArsBuffer, 0x42u, v2); /*0xadcb*/
  result = (int)v2[0] >> 4; /*0xadd5*/
  v3[10] = result; /*0xaddd*/
  return result; /*0xade0*/
}


// Function: ArsGetErrorList @ 0xade8 (0x15d bytes)
// Index: 63/150

__int64 __fastcall ArsGetErrorList(_BYTE *ArsBuffer)
{
  __int64 result; // rax
  _BYTE v2[8]; // [rsp+20h] [rbp-18h] BYREF
  _WORD *v3; // [rsp+28h] [rbp-10h]

  v3 = ArsBuffer + 58; /*0xadfa*/
  NvdimmFwSendCommand(ArsBuffer, 0); /*0xae06*/
  NvdimmReadStatus(ArsBuffer, 0x29u, v2); /*0xae17*/
  *v3 = v2[0]; /*0xae26*/
  NvdimmReadStatus(ArsBuffer, 0x2Au, v2); /*0xae35*/
  *v3 |= v2[0] << 8; /*0xae53*/
  NvdimmReadStatus(ArsBuffer, 0x2Bu, v2); /*0xae62*/
  v3[1] = v2[0]; /*0xae71*/
  NvdimmReadStatus(ArsBuffer, 0x2Cu, v2); /*0xae81*/
  v3[1] |= v2[0] << 8; /*0xaea0*/
  NvdimmReadStatus(ArsBuffer, 0x2Du, v2); /*0xaeb0*/
  v3[2] = v2[0]; /*0xaebf*/
  NvdimmReadStatus(ArsBuffer, 0x2Eu, v2); /*0xaecf*/
  v3[2] |= v2[0] << 8; /*0xaeee*/
  NvdimmReadStatus(ArsBuffer, 0x2Fu, v2); /*0xaefe*/
  v3[3] = v2[0]; /*0xaf0d*/
  NvdimmReadStatus(ArsBuffer, 0x30u, v2); /*0xaf1d*/
  result = (v2[0] << 8) | (unsigned int)(unsigned __int16)v3[3]; /*0xaf35*/
  v3[3] |= v2[0] << 8; /*0xaf3c*/
  return result; /*0xaf40*/
}


// Function: ArsGetEsPolicy @ 0xaf48 (0x459 bytes)
// Index: 64/150

_BYTE *__fastcall ArsGetEsPolicy(_BYTE *ArsBuffer)
{
  _BYTE *result; // rax
  unsigned __int8 v2; // [rsp+20h] [rbp-28h] BYREF
  char v3; // [rsp+21h] [rbp-27h]
  _BYTE *v4; // [rsp+28h] [rbp-20h]
  _BYTE *v5; // [rsp+30h] [rbp-18h]

  v4 = ArsBuffer + 66; /*0xaf5a*/
  v5 = ArsBuffer + 81; /*0xaf68*/
  NvdimmFwUpdateSlot((__int64)(ArsBuffer + 66), 0xFu); /*0xaf77*/
  NvdimmFwSendCommand(ArsBuffer, 0); /*0xaf83*/
  NvdimmReadStatus(ArsBuffer, 0x14u, &v2); /*0xaf94*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xafaa*/
    DebugPrint(0x80000000, "ES Policy Supported  = %02x\n", v2); /*0xafca*/
  NvdimmReadStatus(ArsBuffer, 0x70u, &v2); /*0xafe7*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xaffd*/
    DebugPrint(0x80000000, "ES Policy Status  = %02x\n", v2); /*0xb01d*/
  v3 = (int)v2 >> 2; /*0xb036*/
  if ( (((int)v2 >> 2) & 1) != 0 )
  {
    *v4 = 0; /*0xb04b*/
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xb05f*/
      DebugPrint(0x80000000, "Select device managed ES policy\n"); /*0xb077*/
  }
  else if ( (v3 & 2) != 0 )
  {
    *v4 = 1; /*0xb09e*/
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xb0b2*/
      DebugPrint(0x80000000, "Select host managed ES policy\n"); /*0xb0ca*/
  }
  else if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
  {
    DebugPrint(0x80000000, "ERROR: ES Policy is not set!\n");
  }
  if ( *v4 ) /*0xb11c*/
  {
    NvdimmReadStatus(ArsBuffer, 0xA9u, &v2); /*0xb2a8*/
    v4[12] = v2; /*0xb2b6*/
    NvdimmFwSendCommand(ArsBuffer, 1u); /*0xb2c0*/
    NvdimmReadStatus(ArsBuffer, 0x14u, &v2); /*0xb2d1*/
    v4[13] = v2; /*0xb2df*/
    NvdimmReadStatus(ArsBuffer, 0x15u, &v2); /*0xb2ee*/
    v4[14] = v2; /*0xb2fc*/
  }
  else
  {
    NvdimmReadStatus(ArsBuffer, 0xA9u, &v2); /*0xb133*/
    v4[5] = v2; /*0xb141*/
    NvdimmFwSendCommand(ArsBuffer, 1u); /*0xb14b*/
    NvdimmReadStatus(ArsBuffer, 0x14u, &v2); /*0xb15c*/
    v4[10] = v2; /*0xb16a*/
    NvdimmReadStatus(ArsBuffer, 0x15u, &v2); /*0xb179*/
    v4[11] = v2; /*0xb187*/
    NvdimmReadStatus(ArsBuffer, 4u, &v2); /*0xb196*/
    *(_WORD *)(v4 + 1) = v2; /*0xb1a5*/
    NvdimmReadStatus(ArsBuffer, 5u, &v2); /*0xb1b5*/
    *(_WORD *)(v4 + 1) |= v2 << 8; /*0xb1d4*/
    NvdimmReadStatus(ArsBuffer, 6u, &v2); /*0xb1e4*/
    *(_WORD *)(v4 + 3) = v2; /*0xb1f3*/
    NvdimmReadStatus(ArsBuffer, 7u, &v2); /*0xb203*/
    *(_WORD *)(v4 + 3) |= v2 << 8; /*0xb222*/
    NvdimmReadStatus(ArsBuffer, 0x10u, &v2); /*0xb232*/
    v4[6] = v2; /*0xb240*/
    NvdimmReadStatus(ArsBuffer, 0x11u, &v2); /*0xb24f*/
    v4[7] = v2; /*0xb25d*/
    NvdimmReadStatus(ArsBuffer, 0x12u, &v2); /*0xb26c*/
    v4[8] = v2; /*0xb27a*/
    NvdimmReadStatus(ArsBuffer, 0x13u, &v2); /*0xb289*/
    v4[9] = v2; /*0xb297*/
  }
  NvdimmFwSendCommand(ArsBuffer, 1u); /*0xb306*/
  NvdimmReadStatus(ArsBuffer, 0x70u, &v2); /*0xb317*/
  v5[4] = v2; /*0xb325*/
  NvdimmReadStatus(ArsBuffer, 0x71u, &v2); /*0xb334*/
  v5[5] = v2; /*0xb342*/
  NvdimmReadStatus(ArsBuffer, 0x72u, &v2); /*0xb351*/
  v5[6] = v2; /*0xb35f*/
  NvdimmReadStatus(ArsBuffer, 0x73u, &v2); /*0xb36e*/
  v5[7] = v2; /*0xb37c*/
  NvdimmReadStatus(ArsBuffer, 0x74u, &v2); /*0xb38b*/
  result = v5; /*0xb390*/
  v5[8] = v2; /*0xb399*/
  return result; /*0xb39c*/
}


// Function: ArsGetDimmErrors @ 0xb3a4 (0x1bd bytes)
// Index: 65/150

_BYTE *__fastcall ArsGetDimmErrors(_BYTE *ArsBuffer, __int64 DstArg)
{
  _BYTE *result; // rax
  _BYTE v3[8]; // [rsp+20h] [rbp-18h] BYREF
  _BYTE *v4; // [rsp+28h] [rbp-10h]

  v4 = ArsBuffer + 107; /*0xb3b6*/
  NvdimmFwSendCommand(ArsBuffer, 2u); /*0xb3c2*/
  NvdimmReadStatus(ArsBuffer, 4u, v3); /*0xb3d3*/
  *v4 = v3[0]; /*0xb3e1*/
  NvdimmReadStatus(ArsBuffer, 5u, v3); /*0xb3ef*/
  v4[1] = v3[0]; /*0xb3fd*/
  NvdimmReadStatus(ArsBuffer, 6u, v3); /*0xb40c*/
  v4[4] = v3[0]; /*0xb41a*/
  NvdimmReadStatus(ArsBuffer, 7u, v3); /*0xb429*/
  v4[5] = v3[0]; /*0xb437*/
  NvdimmReadStatus(ArsBuffer, 8u, v3); /*0xb446*/
  v4[8] = v3[0]; /*0xb454*/
  NvdimmReadStatus(ArsBuffer, 9u, v3); /*0xb463*/
  v4[9] = v3[0]; /*0xb471*/
  NvdimmReadStatus(ArsBuffer, 0xAu, v3); /*0xb480*/
  v4[12] = v3[0]; /*0xb48e*/
  NvdimmReadStatus(ArsBuffer, 0xBu, v3); /*0xb49d*/
  v4[13] = v3[0]; /*0xb4ab*/
  NvdimmReadStatus(ArsBuffer, 0xCu, v3); /*0xb4ba*/
  v4[16] = v3[0]; /*0xb4c8*/
  NvdimmReadStatus(ArsBuffer, 0xDu, v3); /*0xb4d7*/
  v4[17] = v3[0]; /*0xb4e5*/
  NvdimmReadStatus(ArsBuffer, 0xEu, v3); /*0xb4f4*/
  v4[20] = v3[0]; /*0xb502*/
  NvdimmReadStatus(ArsBuffer, 0xFu, v3); /*0xb511*/
  v4[21] = v3[0]; /*0xb51f*/
  NvdimmReadStatus(ArsBuffer, 0x10u, v3); /*0xb52e*/
  v4[24] = v3[0]; /*0xb53c*/
  NvdimmReadStatus(ArsBuffer, 0x11u, v3); /*0xb54b*/
  result = v4; /*0xb550*/
  v4[25] = v3[0]; /*0xb559*/
  return result; /*0xb55c*/
}


// Function: ArsStartScrub @ 0xb564 (0x21f bytes)
// Index: 66/150

__int64 __fastcall ArsStartScrub(_BYTE *ArsBuffer)
{
  __int64 result; // rax
  _BYTE v2[4]; // [rsp+20h] [rbp-18h] BYREF
  int v3; // [rsp+24h] [rbp-14h]
  __int64 v4; // [rsp+28h] [rbp-10h]

  v4 = (__int64)(ArsBuffer + 90); /*0xb576*/
  NvdimmFwSendCommand(ArsBuffer, 0); /*0xb582*/
  NvdimmReadStatus(ArsBuffer, 0xA1u, v2); /*0xb593*/
  *(_WORD *)v4 = v2[0]; /*0xb5a2*/
  NvdimmReadStatus(ArsBuffer, 0xA2u, v2); /*0xb5b1*/
  *(_WORD *)v4 |= v2[0] << 8; /*0xb5cf*/
  *(_WORD *)(v4 + 2) = 28; /*0xb5dc*/
  NvdimmReadStatus(ArsBuffer, 0xA5u, v2); /*0xb5ec*/
  *(_BYTE *)(v4 + 4) = v2[0]; /*0xb5fa*/
  NvdimmReadStatus(ArsBuffer, 0xA7u, v2); /*0xb609*/
  *(_BYTE *)(v4 + 5) = v2[0]; /*0xb617*/
  NvdimmReadStatus(ArsBuffer, 0xC0u, v2); /*0xb626*/
  *(_BYTE *)(v4 + 6) = v2[0]; /*0xb634*/
  NvdimmFwSendCommand(ArsBuffer, 2u); /*0xb63e*/
  NvdimmReadStatus(ArsBuffer, 0x80u, v2); /*0xb64f*/
  *(_BYTE *)(v4 + 7) = v2[0]; /*0xb65d*/
  NvdimmReadStatus(ArsBuffer, 0x81u, v2); /*0xb66c*/
  *(_BYTE *)(v4 + 8) = v2[0]; /*0xb67a*/
  NvdimmFwSendCommand(ArsBuffer, 0); /*0xb684*/
  NvdimmReadStatus(ArsBuffer, 0xA0u, v2); /*0xb695*/
  *(_BYTE *)(v4 + 9) = v2[0]; /*0xb6a3*/
  NvdimmReadStatus(ArsBuffer, 0x98u, v2); /*0xb6b2*/
  *(_BYTE *)(v4 + 10) = v2[0]; /*0xb6c0*/
  NvdimmReadStatus(ArsBuffer, 0x90u, v2); /*0xb6cf*/
  *(_BYTE *)(v4 + 11) = v2[0]; /*0xb6dd*/
  NvdimmReadStatus(ArsBuffer, 0x80u, v2); /*0xb6ec*/
  *(_BYTE *)(v4 + 12) = v2[0]; /*0xb6fa*/
  NvdimmReadStatus(ArsBuffer, 0x84u, v2); /*0xb709*/
  *(_BYTE *)(v4 + 13) = v2[0]; /*0xb717*/
  NvdimmReadStatus(ArsBuffer, 0x31u, v2); /*0xb726*/
  *(_BYTE *)(v4 + 14) = v2[0]; /*0xb734*/
  *(_BYTE *)(v4 + 15) = v2[0]; /*0xb740*/
  NvdimmReadStatus(ArsBuffer, 0x10u, v2); /*0xb74f*/
  LOBYTE(v3) = (v2[0] & 4) != 0; /*0xb75e*/
  result = v4; /*0xb772*/
  *(_BYTE *)(v4 + 16) = v3; /*0xb77b*/
  return result; /*0xb77e*/
}


// Function: ArsStartSpa @ 0xb784 (0x640 bytes)
// Index: 67/150

__int64 __fastcall ArsStartSpa(unsigned __int64 TableEntry, unsigned __int64 a2)
{
  unsigned __int8 v3; // [rsp+30h] [rbp-58h]
  unsigned __int8 v4; // [rsp+31h] [rbp-57h] BYREF
  unsigned __int8 v5; // [rsp+32h] [rbp-56h] BYREF
  unsigned __int8 v6; // [rsp+33h] [rbp-55h] BYREF
  char v7; // [rsp+34h] [rbp-54h]
  unsigned __int64 v8; // [rsp+38h] [rbp-50h]
  unsigned __int64 p_i; // [rsp+40h] [rbp-48h] BYREF
  unsigned __int64 v10; // [rsp+48h] [rbp-40h]
  unsigned __int64 i; // [rsp+50h] [rbp-38h] BYREF
  unsigned __int64 i_1; // [rsp+58h] [rbp-30h] BYREF
  unsigned __int64 v13; // [rsp+60h] [rbp-28h]
  unsigned __int64 TableEntry_1; // [rsp+68h] [rbp-20h]
  unsigned __int64 p_i_1[3]; // [rsp+70h] [rbp-18h] BYREF

  v8 = 0; /*0xb795*/
  v7 = 0; /*0xb79e*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "ARS: ARSStart - SpaStart = 0x%1lx, Length = 0x%1lx\n", TableEntry, a2);
  v8 = JedecNvDimmCmdLoop(TableEntry, &p_i, &v6, &v5, &v4); /*0xb813*/
  if ( v8 )
  {
    if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "ARS: GetDimmInfoFromSpa failed, returning!!!\n");
    }
    return v8; /*0xb85a*/
  }
  else
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "ARS: ARSStart - SADBaseAddr = 0x%1lx\n", p_i);
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "ARS: ARSStart - ARSStart is in Soc = %d, Ch = %d, Dimm = %d\n", v6, v5, v4);
    if ( NvdimmGetHealthFlagDesc(p_i) )
    {
      NvdimmGetSupportedMsg(p_i, p_i_1); /*0xb95a*/
      byte_1F298 = 0; /*0xb95f*/
      v8 = JedecNvDimmCmdLoop(TableEntry + a2 - 1, &i, &v6, &v5, &v4); /*0xb99c*/
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "ARS: ARSStart - SADNextBase = 0x%1lx\n", i);
      if ( p_i != i )
      {
        if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
          DebugPrint(0x80000000, "ARS: ARS Spawns over multiple SAD Rules\n");
        v7 = 1; /*0xba26*/
      }
      if ( v7 )
      {
        v13 = p_i_1[0] - p_i; /*0xba48*/
        for ( i = p_i_1[0]; i < a2 + TableEntry; i = i_1 )
        {
          if ( !NvdimmGetHealthFlagDesc(i) )
          {
            if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
              DebugPrint(0x80000000, "ARS: ARS Spawns over multiple SAD Rules and not all SAD Rules are PMEM Regions\n");
            return 0x8000000000000002uLL; /*0xbad8*/
          }
          NvdimmGetSupportedMsg(i, &i_1); /*0xbae7*/
          v13 = i_1 - i; /*0xbafc*/
        }
        ArsGetCapabilities(); /*0xbb1b*/
        v3 = 0; /*0xbb20*/
        qword_C5480[0] = p_i; /*0xbb36*/
        NvdimmGetSupportedMsg(p_i, &i_1); /*0xbb44*/
        v13 = i_1 - p_i; /*0xbb59*/
        TableEntry_1 = TableEntry; /*0xbb66*/
        v10 = i_1 - TableEntry; /*0xbb9b*/
        while ( v10 + TableEntry_1 <= a2 + TableEntry && v10 ) /*0xbbd5*/
        {
          v8 = ArsCompDPAs(TableEntry_1, qword_C5480[v3], v10); /*0xbbfb*/
          if ( v8 ) /*0xbc06*/
            return v8; /*0xbc0d*/
          qword_C5480[++v3] = v10 + TableEntry_1; /*0xbc38*/
          TableEntry_1 = qword_C5480[v3]; /*0xbc4c*/
          NvdimmGetSupportedMsg(qword_C5480[v3], &i_1); /*0xbc66*/
          v10 = i_1 - qword_C5480[v3]; /*0xbc86*/
          if ( v10 + qword_C5480[v3] > a2 + TableEntry ) /*0xbcb9*/
          {
            p_i_1[0] = v10 + qword_C5480[v3] - (a2 + TableEntry); /*0xbce9*/
            i_1 -= p_i_1[0]; /*0xbcfe*/
            v10 = i_1 - qword_C5480[v3]; /*0xbd1e*/
          }
        }
      }
      else
      {
        v8 = JedecNvDimmCmdLoop(TableEntry, &p_i, &v6, &v5, &v4); /*0xbd50*/
        v8 = ArsCompDPAs(TableEntry, p_i, a2); /*0xbd6f*/
        if ( v8 ) /*0xbd7a*/
          return v8; /*0xbd81*/
        qword_C5480[0] = p_i; /*0xbd99*/
      }
      return ArsGetStatus(TableEntry, a2); /*0xbdad*/
    }
    else
    {
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "ARS: ARSStart - Not a PMEM region, returning Invalid Param\n");
      return 0x8000000000000002uLL; /*0xb941*/
    }
  }
}


// Function: ArsCheckStatus @ 0xbdc4 (0xc5 bytes)
// Index: 68/150

__int64 ArsCheckStatus()
{
  __int64 n0x10000; // [rsp+20h] [rbp-18h]

  n0x10000 = 0; /*0xbdc8*/
  if ( byte_1A2E0 ) /*0xbdda*/
    n0x10000 = 0x10000; /*0xbddc*/
  if ( !byte_1A2F0 ) /*0xbdee*/
    n0x10000 = 0x20000; /*0xbdf0*/
  if ( word_1A9E6 == 1 ) /*0xbe03*/
    n0x10000 = 196608; /*0xbe05*/
  if ( n0x10000 == 0x20000 || n0x10000 == 0x10000 ) /*0xbe22*/
  {
    *(_DWORD *)(qword_C6F50 + 60) = 0; /*0xbe2b*/
  }
  else
  {
    NvdimmFwGetInfo(qword_C6F50 + 196944, (unsigned __int64)&n44, (unsigned int)n44); /*0xbe5c*/
    *(_DWORD *)(qword_C6F50 + 60) = n44; /*0xbe6e*/
  }
  *(_DWORD *)(qword_C6F50 + 84) = n0x10000; /*0xbe7c*/
  return n0x10000; /*0xbe84*/
}


// Function: ArsClearError @ 0xbe8c (0x1e7 bytes)
// Index: 69/150

__int64 __fastcall ArsClearError(unsigned __int64 a1, __int64 a2, _QWORD *src)
{
  unsigned __int64 i_1; // [rsp+20h] [rbp-28h]
  unsigned __int64 i; // [rsp+28h] [rbp-20h]

  i_1 = 0; /*0xbea1*/
  if ( byte_1A2F0 && i_1 )
  {
    while ( i_1 < (unsigned int)i_1 )
    {
      if ( qword_1A9EC[3 * i_1 + 1] < a1 || qword_1A9EC[3 * i_1 + 2] + qword_1A9EC[3 * i_1 + 1] > a2 + a1 )
      {
        ++i_1; /*0xc060*/
      }
      else
      {
        if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
          DebugPrint(
            0x80000000,
            "[Clear Error] Clearing error record: SpaOfErrLoc = 0x%lX, Length = 0x%lX\n",
            qword_1A9EC[3 * i_1 + 1],
            qword_1A9EC[3 * i_1 + 2]);
        *src += qword_1A9EC[3 * i_1 + 2]; /*0xbfea*/
        for ( i = i_1; i < (unsigned int)(i_1 - 1); ++i ) /*0xbff2*/
          qmemcpy(&qword_1A9EC[3 * i], &qword_1A9EC[3 * i + 3], 0x18u); /*0xc044*/
        --i_1; /*0xc050*/
      }
    }
    return 0; /*0xc06a*/
  }
  else
  {
    if ( DebugLevelEnabled() ) /*0xbebe*/
    {
      if ( DebugLevelCheck(0x80000000) ) /*0xbecf*/
        DebugPrint(0x80000000, "[Clear Error] No error records exist!\n"); /*0xbee7*/
    }
    return 0; /*0xbef8*/
  }
}


// Function: ArsEventScrub @ 0xc074 (0x29d bytes)
// Index: 70/150

__int64 __fastcall ArsEventScrub(unsigned __int64 a1, unsigned __int64 a2)
{
  unsigned __int8 i; // [rsp+20h] [rbp-48h]
  unsigned __int8 j; // [rsp+21h] [rbp-47h]
  char v5; // [rsp+22h] [rbp-46h]
  __int64 v6; // [rsp+28h] [rbp-40h]
  unsigned __int64 v7; // [rsp+30h] [rbp-38h]
  _QWORD src[3]; // [rsp+38h] [rbp-30h] BYREF
  __int64 v9; // [rsp+50h] [rbp-18h]

  src[0] = 0; /*0xc082*/
  v5 = 1; /*0xc09d*/
  NvdimmFwGetInfo(qword_C6F50 + 196948, (unsigned __int64)src, 8u); /*0xc0c8*/
  src[1] = (unsigned int)dword_196E0; /*0xc0d3*/
  if ( a1 % (unsigned int)dword_196E0 ) /*0xc0e7*/
    return 2; /*0xc0e7*/
  src[2] = (unsigned int)dword_196E0; /*0xc0f5*/
  if ( a2 % (unsigned int)dword_196E0 ) /*0xc109*/
    return 2; /*0xc111*/
  for ( i = 0; i < 4u; ++i ) /*0xc11b*/
  {
    if ( a1 >= *(_QWORD *)(::j + 1323LL * i) && a1 < *(_QWORD *)(::j + 1323LL * i + 8) + *(_QWORD *)(::j + 1323LL * i) ) /*0xc190*/
    {
      v7 = *(_QWORD *)(::j + 1323LL * i); /*0xc1ad*/
      v6 = *(_QWORD *)(::j + 1323LL * i + 8); /*0xc1ca*/
      if ( i < 3u ) /*0xc1d7*/
      {
        for ( j = i + 1; j < 4u; ++j ) /*0xc1e4*/
        {
          if ( v6 + *(_QWORD *)(::j + 1323LL * i) == *(_QWORD *)(::j + 1323LL * j) ) /*0xc231*/
            v6 += *(_QWORD *)(::j + 1323LL * j + 8); /*0xc256*/
        }
      }
      if ( a1 >= v7 && a2 + a1 <= v6 + v7 ) /*0xc28c*/
        v5 = 0; /*0xc28e*/
      break; /*0xc28e*/
    }
  }
  if ( v5 ) /*0xc2a1*/
    return 2; /*0xc2a3*/
  v9 = ArsClearError(a1, a2, src); /*0xc2be*/
  NvdimmFwGetInfo(qword_C6F50 + 196948, (unsigned __int64)src, 8u); /*0xc2e9*/
  *(_DWORD *)(qword_C6F50 + 60) = 8; /*0xc2f5*/
  *(_DWORD *)(qword_C6F50 + 84) = v9; /*0xc307*/
  return 0; /*0xc30c*/
}


// Function: ArsReadScrubCtl @ 0xc314 (0x3fd bytes)
// Index: 71/150

__int64 __fastcall ArsReadScrubCtl(__int64 a1)
{
  __int64 v1; // rdx
  __int64 v2; // rdx
  __int64 v3; // rcx
  __int64 v4; // rdx
  __int64 v5; // rcx
  __int64 v6; // rdx
  __int64 v7; // rcx
  __int64 v8; // rcx
  __int64 v9; // rcx
  __int64 v10; // rcx
  __int64 v11; // rdx
  _DWORD *v12; // rcx
  __int64 IndexVal; // rcx
  unsigned __int8 v15; // [rsp+30h] [rbp-38h]
  unsigned __int8 j; // [rsp+30h] [rbp-38h]
  unsigned __int8 v17; // [rsp+31h] [rbp-37h]
  unsigned __int8 i; // [rsp+31h] [rbp-37h]
  unsigned __int8 v19; // [rsp+32h] [rbp-36h]
  int v20; // [rsp+34h] [rbp-34h]
  __int64 v21; // [rsp+40h] [rbp-28h]
  int v22; // [rsp+48h] [rbp-20h]
  int v23; // [rsp+4Ch] [rbp-1Ch]
  unsigned __int8 v24; // [rsp+70h] [rbp+8h]

  v24 = a1; /*0xc314*/
  v17 = (unsigned __int8)a1 / 2; /*0xc32f*/
  v15 = a1 & 1; /*0xc340*/
  v1 = a1 & 1; /*0xc34a*/
  LOBYTE(a1) = v17; /*0xc34e*/
  v20 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(a1, v1, 117459220); /*0xc35c*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xc371*/
    DebugPrint(0x80000000, "[ARS Event] ScrubCtlReg on node %d, socket %d, iMC %d = %X\n", v24, v17, v15, v20); /*0xc3ac*/
  LOBYTE(v2) = v15; /*0xc3c3*/
  LOBYTE(v3) = v17; /*0xc3c7*/
  v22 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v3, v2, 117459212); /*0xc3d5*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xc3ea*/
    DebugPrint(0x80000000, "[ARS Event] ScrubAddrLoReg on node, socket %d, iMC %d %d = %X\n", v24, v17, v15, v22); /*0xc425*/
  LOBYTE(v4) = v15; /*0xc43c*/
  LOBYTE(v5) = v17; /*0xc440*/
  v23 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v5, v4, 117459216); /*0xc44e*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xc463*/
    DebugPrint(0x80000000, "[ARS Event] ScrubAddrHiReg on node, socket %d, iMC %d %d = %X\n", v24, v17, v15, v23); /*0xc49e*/
  LOBYTE(v6) = v15; /*0xc4ea*/
  LOBYTE(v7) = v17; /*0xc4ee*/
  (*(void (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))(v7, v6, 117459220, v20 & 0xFFFFFFF); /*0xc4f9*/
  if ( qword_1F208 ) /*0xc504*/
    return ArsDoScrub(); /*0xc50b*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xc526*/
    DebugPrint(0x80000000, "[ARS Event] ARS has completed\n"); /*0xc53e*/
  byte_1A2E0 = 0; /*0xc54f*/
  LOBYTE(v8) = v24; /*0xc556*/
  NfitSetDeviceHandle(v8); /*0xc55a*/
  v9 = (dword_C5458 << 8) | (unsigned int)v15; /*0xc575*/
  LOBYTE(v9) = v17; /*0xc587*/
  v21 = (*(unsigned int (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 24))( /*0xc597*/
          v9,
          170,
          (dword_C5458 << 8) | (unsigned int)v15);
  DebugLevelEnabled(); /*0xc59c*/
  for ( i = 0; i < 4u; ++i ) /*0xc60d*/
  {
    for ( j = 0; j < 2u; ++j ) /*0xc62c*/
    {
      if ( *(_BYTE *)(dst + 5337LL * i + 2956 + j + 2) ) /*0xc66b*/
      {
        v10 = j & 1 | (2 * (unsigned int)i); /*0xc694*/
        v19 = j & 1 | (2 * i); /*0xc698*/
        LOBYTE(v10) = i; /*0xc6a6*/
        (*(void (__fastcall **)(__int64, _QWORD, __int64))(qword_C5470 + 40))(v10, j, 117459220); /*0xc6b1*/
        if ( byte_1F210[v19] ) /*0xc6c4*/
        {
          v12 = dword_1F560; /*0xc6d1*/
          LOBYTE(v11) = j; /*0xc6e2*/
          LOBYTE(v12) = i; /*0xc6e6*/
          (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0xc6f1*/
            v12,
            v11,
            117459168,
            (unsigned int)dword_1F560[v19]);
          LOBYTE(IndexVal) = j & 1 | (2 * i); /*0xc6f4*/
          JedecNvDimmReadData(IndexVal); /*0xc6f8*/
        }
      }
    }
  }
  return v21; /*0xc70c*/
}


// Function: ArsErrorRecovery @ 0xc714 (0x652 bytes)
// Index: 72/150

__int64 __fastcall ArsErrorRecovery(__int64 a1)
{
  __int64 v1; // rdx
  __int64 v2; // rdx
  __int64 v3; // rcx
  __int64 v5; // rdx
  __int64 v6; // rdx
  __int64 v7; // rcx
  __int64 v8; // rdx
  __int64 v9; // rcx
  __int64 v10; // rcx
  __int64 v11; // rcx
  __int64 v12; // rcx
  __int64 v13; // rdx
  _DWORD *v14; // rcx
  __int64 IndexVal; // rcx
  __int64 v16; // rcx
  _QWORD *ProcessResult_1; // rcx
  __int64 v18; // rdx
  __int64 v19; // rcx
  int v20; // eax
  __int64 v21; // rdx
  __int64 v22; // rcx
  unsigned __int8 v23; // [rsp+30h] [rbp-68h]
  unsigned __int8 j; // [rsp+30h] [rbp-68h]
  unsigned __int8 v25; // [rsp+31h] [rbp-67h]
  unsigned __int8 k; // [rsp+31h] [rbp-67h]
  unsigned __int8 i; // [rsp+32h] [rbp-66h]
  unsigned int v28; // [rsp+34h] [rbp-64h]
  unsigned __int8 v29; // [rsp+38h] [rbp-60h]
  unsigned __int8 v30; // [rsp+39h] [rbp-5Fh]
  _QWORD *v31; // [rsp+40h] [rbp-58h]
  unsigned __int64 i_1; // [rsp+50h] [rbp-48h]
  int v33; // [rsp+58h] [rbp-40h]
  char *NvdimmBase; // [rsp+60h] [rbp-38h]
  __int64 ProcessResult; // [rsp+68h] [rbp-30h] BYREF
  __int64 v36; // [rsp+70h] [rbp-28h]
  int v37; // [rsp+78h] [rbp-20h]
  int v38; // [rsp+7Ch] [rbp-1Ch]
  unsigned __int64 v39; // [rsp+80h] [rbp-18h]
  char v40; // [rsp+A0h] [rbp+8h]

  v40 = a1; /*0xc714*/
  v36 = 0; /*0xc71f*/
  NvdimmBase = 0; /*0xc728*/
  i_1 = 0; /*0xc731*/
  v23 = (unsigned __int8)a1 / 2; /*0xc747*/
  v25 = a1 & 1; /*0xc75b*/
  v1 = a1 & 1; /*0xc765*/
  LOBYTE(a1) = v23; /*0xc769*/
  v33 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(a1, v1, 117459212); /*0xc777*/
  LOBYTE(v2) = v25; /*0xc781*/
  LOBYTE(v3) = v23; /*0xc785*/
  v37 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v3, v2, 117459216); /*0xc793*/
  v30 = BYTE2(v37) & 3; /*0xc7a1*/
  v39 = (unsigned int)(v33 << 6); /*0xc7ae*/
  for ( i = 0; i < 2u; ++i ) /*0xc7b6*/
  {
    NvdimmBase = SmbusGetNvdimmBase(v23, v30 + 3 * (v40 & 1u), i); /*0xc7fb*/
    if ( NvdimmBase ) /*0xc806*/
      break; /*0xc806*/
  }
  if ( !NvdimmBase ) /*0xc816*/
    return 0x8000000000000002uLL; /*0xc849*/
  v36 = SmbusWaitIdle(NvdimmBase, *(_QWORD *)(NvdimmBase + 10), v39, (unsigned __int64 *)&ProcessResult); /*0xc838*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "[ARS Error] Error at address: 0x%lX\n", ProcessResult);
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "[ARS Error] Error at DIMM: Socket = %X, McId = %X, Ch = %X, Dimm = %X\n", v23, v25, v30, i);
  if ( (unsigned int)i_1 < 0x80 ) /*0xc8f1*/
  {
    while ( i_1 < (unsigned int)i_1 && ProcessResult != qword_1A9EC[3 * i_1 + 2] + qword_1A9EC[3 * i_1 + 1] ) /*0xcbd8*/
      ++i_1; /*0xcbe4*/
    if ( i_1 == i_1 ) /*0xcbf6*/
    {
      ++byte_1A9AC; /*0xcc04*/
      v16 = (unsigned __int8)byte_1F540; /*0xcc11*/
      if ( (unsigned __int8)byte_1A9AC > (int)(unsigned __int8)byte_1F540 ) /*0xcc1a*/
      {
        LOBYTE(v16) = v40; /*0xcc1c*/
        return ArsReadScrubCtl(v16); /*0xcc28*/
      }
      v31 = &qword_1A9EC[3 * (unsigned int)i_1]; /*0xcc44*/
      *(_DWORD *)v31 = i | (16 * v30) | (v25 << 8) | (v23 << 12); /*0xcc71*/
      *((_DWORD *)v31 + 1) = 0; /*0xcc78*/
      ProcessResult_1 = (_QWORD *)ProcessResult; /*0xcc84*/
      v31[1] = ProcessResult; /*0xcc89*/
      v31[2] = 1; /*0xcc92*/
      ++i_1; /*0xcca2*/
      n44 += 24; /*0xccb2*/
    }
    else
    {
      ProcessResult_1 = &qword_1A9EC[3 * i_1]; /*0xccde*/
      ++ProcessResult_1[2]; /*0xcce3*/
    }
    LOBYTE(v5) = v25; /*0xccf6*/
    LOBYTE(ProcessResult_1) = v23; /*0xccfa*/
    (*(void (__fastcall **)(_QWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0xcd05*/
      ProcessResult_1,
      v5,
      117459212,
      (unsigned int)(v33 + 1));
    LOBYTE(v18) = v25; /*0xcd0e*/
    LOBYTE(v19) = v23; /*0xcd12*/
    v20 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v19, v18, 117459220); /*0xcd1d*/
    LOBYTE(v21) = v25; /*0xcd47*/
    LOBYTE(v22) = v23; /*0xcd4b*/
    (*(void (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0xcd56*/
      v22,
      v21,
      117459220,
      v20 & 0xF6FFFFFF | 0x1000000);
    return v36; /*0xcd59*/
  }
  else
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xc908*/
      DebugPrint(0x80000000, "[ARS Error] Too many error records! Stopping scrub...\n"); /*0xc920*/
    word_1A9E6 = 1; /*0xc936*/
    ProcessResult_1 = ProcessResult; /*0xc942*/
    v7 = qword_1A9CC + ProcessResult_0; /*0xc957*/
    qword_1A9DC = qword_1A9CC + ProcessResult_0 - ProcessResult; /*0xc962*/
    LOBYTE(v6) = v25; /*0xc96f*/
    LOBYTE(v7) = v23; /*0xc973*/
    v28 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v7, v6, 117459220) & 0xFFFFFFF; /*0xc9b1*/
    LOBYTE(v8) = v25; /*0xc9c0*/
    LOBYTE(v9) = v23; /*0xc9c4*/
    (*(void (__fastcall **)(__int64, __int64, __int64, _QWORD))(qword_C5470 + 48))(v9, v8, 117459220, v28); /*0xc9cf*/
    byte_1A2E0 = 0; /*0xc9d2*/
    LOBYTE(v10) = v40; /*0xc9d9*/
    NfitSetDeviceHandle(v10); /*0xc9e0*/
    v11 = (dword_C5458 << 8) | (unsigned int)v25; /*0xc9fb*/
    LOBYTE(v11) = v23; /*0xca0d*/
    v36 = (*(unsigned int (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 24))( /*0xca1d*/
            v11,
            170,
            (dword_C5458 << 8) | (unsigned int)v25);
    if ( DebugLevelEnabled() && v36 < 0 ) /*0xca34*/
    {
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0xca47*/
        DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v36); /*0xca64*/
      DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\JedecNvDimm.c", 0x14B7u, "!EFI_ERROR (Status)"); /*0xca88*/
    }
    for ( j = 0; j < 4u; ++j ) /*0xca93*/
    {
      for ( k = 0; k < 2u; ++k ) /*0xcab2*/
      {
        if ( *(_BYTE *)(dst + 5337LL * j + 2956 + k + 2) ) /*0xcaf1*/
        {
          v38 = 2 * j; /*0xcb03*/
          v12 = k & 1 | (unsigned int)v38; /*0xcb1a*/
          v29 = k & 1 | (2 * j); /*0xcb1e*/
          LOBYTE(v12) = j; /*0xcb2c*/
          (*(void (__fastcall **)(__int64, _QWORD, __int64))(qword_C5470 + 40))(v12, k, 117459220); /*0xcb37*/
          if ( byte_1F210[v29] ) /*0xcb4a*/
          {
            v14 = dword_1F560; /*0xcb57*/
            LOBYTE(v13) = k; /*0xcb68*/
            LOBYTE(v14) = j; /*0xcb6c*/
            (*(void (__fastcall **)(_DWORD *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0xcb77*/
              v14,
              v13,
              117459168,
              (unsigned int)dword_1F560[v29]);
            LOBYTE(IndexVal) = k & 1 | (2 * j); /*0xcb7a*/
            JedecNvDimmReadData(IndexVal); /*0xcb7e*/
          }
        }
      }
    }
    return 0x8000000000000002uLL; /*0xcb8d*/
  }
}


// Function: ArsEventHandler @ 0xcd68 (0x175 bytes)
// Index: 73/150

__int64 ArsEventHandler()
{
  __int64 v1; // rcx
  __int64 v2; // rcx
  __int64 v3; // rcx
  unsigned __int8 j; // [rsp+20h] [rbp-28h]
  unsigned __int8 i; // [rsp+21h] [rbp-27h]
  int v6; // [rsp+24h] [rbp-24h]
  __int64 ScrubCtl; // [rsp+30h] [rbp-18h]

  ScrubCtl = 0; /*0xcd80*/
  if ( !byte_1A2E0 ) /*0xcd92*/
    return 0; /*0xcd94*/
  for ( i = 0; i < 4u; ++i ) /*0xcd9e*/
  {
    for ( j = 0; j < 2u; ++j ) /*0xcdbd*/
    {
      if ( *(_BYTE *)(dst + 5337LL * i + 2956 + j + 2) ) /*0xcdfc*/
      {
        v1 = j & 1 | (2 * (unsigned int)i); /*0xce25*/
        LOBYTE(v1) = i; /*0xce37*/
        v6 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))(qword_C5470 + 40))(v1, j, 117459220); /*0xce45*/
        if ( v6 < 0 ) /*0xce55*/
        {
          if ( (((unsigned int)v6 >> 29) & 1) != 0 ) /*0xce63*/
          {
            LOBYTE(v2) = j & 1 | (2 * i); /*0xce65*/
            ScrubCtl = ArsReadScrubCtl(v2); /*0xce6e*/
          }
          if ( (((unsigned int)v6 >> 27) & 1) != 0 ) /*0xce7f*/
          {
            if ( DebugLevelEnabled() ) /*0xce81*/
            {
              if ( DebugLevelCheck(0x80000000) ) /*0xce92*/
                DebugPrint(0x80000000, "[ARS Event] ARS encountered an error\n"); /*0xceaa*/
            }
            LOBYTE(v3) = j & 1 | (2 * i); /*0xcebb*/
            ScrubCtl = ArsErrorRecovery(v3); /*0xcec4*/
          }
        }
      }
    }
  }
  return ScrubCtl; /*0xced8*/
}


// Function: ArsCheckCompletion @ 0xcee0 (0x1ce bytes)
// Index: 74/150

__int64 ArsCheckCompletion()
{
  int v1; // [rsp+20h] [rbp-28h]
  __int64 n2; // [rsp+28h] [rbp-20h]
  __int64 v3; // [rsp+30h] [rbp-18h]

  v1 = *(_DWORD *)(qword_C6F50 + 48); /*0xcef7*/
  switch ( v1 ) /*0xcf00*/
  {
    case 1: /*0xcf00*/
      n2 = 2; /*0xcf28*/
      *(_DWORD *)(qword_C6F50 + 84) = 0x20000; /*0xcf41*/
      *(_DWORD *)(qword_C6F50 + 60) = 8; /*0xcf4b*/
      v3 = qword_C6F50 + 196944; /*0xcf6a*/
      *(_DWORD *)(qword_C6F50 + 196944) = 4096; /*0xcf74*/
      *(_DWORD *)(v3 + 4) = dword_196E0; /*0xcf85*/
      break;
    case 2: /*0xcf00*/
      if ( (*(_WORD *)(qword_C6F50 + 80) & 1) != 0 ) /*0xcf9d*/
      {
        n2 = 2; /*0xcf9f*/
      }
      else
      {
        TableEntry = *(_QWORD *)(qword_C6F50 + 64); /*0xcfb5*/
        TableEntry = (TableEntry / 0x100uLL) << 8; /*0xcfd4*/
        qword_C5460 = *(_QWORD *)(qword_C6F50 + 72); /*0xcfe6*/
        n2 = ArsStartSpa(TableEntry, *(_QWORD *)(qword_C6F50 + 72)); /*0xd004*/
      }
      *(_DWORD *)(qword_C6F50 + 84) = n2; /*0xd014*/
      *(_DWORD *)(qword_C6F50 + 60) = 4; /*0xd01e*/
      *(_DWORD *)(qword_C6F50 + 196944) = dword_19150; /*0xd04d*/
      break;
    case 3: /*0xcf00*/
      n2 = ArsCheckStatus(); /*0xd056*/
      break;
    case 4: /*0xcf00*/
      n2 = ArsEventScrub(*(_QWORD *)(qword_C6F50 + 64), *(_QWORD *)(qword_C6F50 + 72)); /*0xd078*/
      break;
    default:
      n2 = 2; /*0xd07f*/
      break;
  }
  *(_DWORD *)(qword_C6F50 + 84) = 1; /*0xd08f*/
  *(_DWORD *)(qword_C6F50 + 60) = 0; /*0xd09d*/
  return n2; /*0xd0a9*/
}


// Function: NvdimmAcpiConfig @ 0xd0b0 (0x1c84 bytes)
// Index: 75/150

__int64 NvdimmAcpiConfig()
{
  __int64 n2_1; // rax
  unsigned __int8 v1; // [rsp+30h] [rbp-E8h] BYREF
  unsigned __int8 i; // [rsp+31h] [rbp-E7h]
  unsigned __int8 j; // [rsp+32h] [rbp-E6h]
  unsigned __int8 k; // [rsp+33h] [rbp-E5h]
  __int64 n2; // [rsp+38h] [rbp-E0h]
  unsigned __int8 v6; // [rsp+40h] [rbp-D8h] BYREF
  unsigned __int8 v7; // [rsp+41h] [rbp-D7h] BYREF
  unsigned __int8 v8; // [rsp+42h] [rbp-D6h] BYREF
  unsigned __int8 v9; // [rsp+43h] [rbp-D5h] BYREF
  int v10; // [rsp+44h] [rbp-D4h]
  _BYTE dst[200]; // [rsp+50h] [rbp-C8h] BYREF

  n2 = 2; /*0xd0cd*/
  i = 0; /*0xd0d6*/
  v6 = 0; /*0xd0db*/
  v7 = 0; /*0xd0e0*/
  v8 = 0; /*0xd0e5*/
  v9 = 0; /*0xd0ea*/
  j = 0; /*0xd0ef*/
  v1 = 0; /*0xd0f4*/
  if ( *(_DWORD *)(qword_C6F50 + 48) && *(_DWORD *)(qword_C6F50 + 48) < 5u && *(_DWORD *)(qword_C6F50 + 52) == -1 )
  {
    n2_1 = ArsCheckCompletion(); /*0xd120*/
    n2 = n2_1; /*0xd125*/
  }
  else
  {
    NvdimmSetSecurityState(&v6, &v7, &v8, &v9, *(_DWORD *)(qword_C6F50 ... [21338 chars total]


// Function: JedecNvDimmMain @ 0xedb0 (0xb47 bytes)
// Index: 76/150

__int64 __fastcall JedecNvDimmMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  __int64 v3; // rcx
  _BYTE v4[8]; // [rsp+20h] [rbp-58h] BYREF
  __int64 v5; // [rsp+28h] [rbp-50h]
  __int64 v6; // [rsp+30h] [rbp-48h] BYREF
  __int64 v7; // [rsp+38h] [rbp-40h] BYREF
  _WORD *v8; // [rsp+40h] [rbp-38h]
  _QWORD v9[2]; // [rsp+48h] [rbp-30h] BYREF
  __int64 n253; // [rsp+58h] [rbp-20h] BYREF
  __int64 v11; // [rsp+60h] [rbp-18h] BYREF
  _BYTE v12[16]; // [rsp+68h] [rbp-10h] BYREF
  EFI_HANDLE p_ImageHandle; // [rsp+80h] [rbp+8h] BYREF
  EFI_SYSTEM_TABLE *SystemTable_1; // [rsp+88h] [rbp+10h]

  SystemTable_1 = SystemTable; /*0xedb0*/
  p_ImageHandle = ImageHandle; /*0xedb5*/
  v5 = 0; /*0xedbe*/
  v7 = 0; /*0xedc7*/
  v4[0] = 0; /*0xedd0*/
  v5 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_190D0, 0, &qword_1A2F8); /*0xedf2*/
  if ( qword_1A2F8 ) /*0xedff*/
  {
    (*(void (__fastcall **)(__int64, _BYTE *))qword_1A2F8)(qword_1A2F8, v4); /*... [10158 chars total]


// Function: NvdimmGetSmbiosTable @ 0xf8f8 (0x6b bytes)
// Index: 77/150

__int64 __fastcall NvdimmGetSmbiosTable(__int64 a1, char a2)
{
  __int16 v2; // ax
  __int64 n3840; // rcx
  int v5; // ebx
  __int64 result; // rax
  __int64 v7; // rcx

  v2 = *(_WORD *)(a1 + 4); /*0xf902*/
  n3840 = 3840; /*0xf909*/
  LOBYTE(n3840) = a2; /*0xf911*/
  v5 = (v2 & 0xF00) != 0 ? 4 : 0;
  result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))( /*0xf92c*/
             n3840,
             0,
             (unsigned int)(v5 + 67453084));
  dword_1A9A8 = result; /*0xf92f*/
  if ( (result & 0x100000) != 0 ) /*0xf939*/
  {
    LOBYTE(v7) = a2; /*0xf952*/
    return (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))( /*0xf955*/
             v7,
             0,
             (unsigned int)(v5 + 67453084),
             (unsigned int)result & 0xFFEFFFFF);
  }
  return result; /*0xf95d*/
}


// Function: NvdimmConfigRead @ 0xf964 (0x52 bytes)
// Index: 78/150

__int64 NvdimmConfigRead()
{
  __int64 v0; // rax
  UINTN Count; // rdx
  __int16 v2; // ax
  _DWORD v4[6]; // [rsp+20h] [rbp-18h] BYREF

  v4[3] = 0; /*0xf96b*/
  v4[1] = 0; /*0xf973*/
  v4[2] = 512; /*0xf977*/
  v4[0] = 1024000; /*0xf97e*/
  v0 = (*(__int64 (__fastcall **)(_DWORD *))(qword_1A360 + 24))(v4); /*0xf98c*/
  v2 = LShiftU64(v0 + 64, Count); /*0xf993*/
  return IoRead32Port((v2 & 0xFF80) + 8) & 0xFFFFFF; /*0xf9b1*/
}


// Function: NvdimmGetNextOffset @ 0xf9b8 (0x36 bytes)
// Index: 79/150

__int64 __fastcall NvdimmGetNextOffset(unsigned int a1)
{
  unsigned int v2; // eax

  v2 = NvdimmConfigRead(); /*0xf9c0*/
  if ( a1 > v2 ) /*0xf9c7*/
    a1 |= 0xFF000000; /*0xf9c9*/
  return 1000 * (v2 - a1) / 0xDFB; /*0xf9e8*/
}


// Function: NvdimmReadFwData @ 0xf9f0 (0x1b6 bytes)
// Index: 80/150

__int64 __fastcall NvdimmReadFwData(__int64 a1, int *a2, unsigned __int8 a3, _BYTE *a4)
{
  __int16 v6; // ax
  char v8; // dl
  __int16 v10; // cx
  unsigned int n67453100; // ebp
  unsigned int n67453088; // r15d
  unsigned int n67453112; // r12d
  int v14; // ecx
  int v15; // ebx
  unsigned int v16; // ebx
  __int64 v17; // rcx
  unsigned int v18; // r13d
  __int64 v19; // rcx
  unsigned int v20; // ebx
  unsigned int n2; // r13d
  __int64 v22; // rcx
  unsigned int v23; // r15d
  char v24; // al
  int n4; // ebx
  int v26; // eax
  bool v27; // zf
  int v29; // [rsp+60h] [rbp+8h] BYREF
  __int16 v30; // [rsp+64h] [rbp+Ch]
  int v31; // [rsp+70h] [rbp+18h]

  v29 = *a2; /*0xfa09*/
  v6 = *((_WORD *)a2 + 2); /*0xfa10*/
  v8 = *(_BYTE *)(a1 + 1); /*0xfa17*/
  v30 = v6; /*0xfa22*/
  NvdimmGetSmbiosTable((__int64)&v29, v8); /*0xfa27*/
  v10 = *((_WORD *)a2 + 2); /*0xfa2c*/
  if ( (v10 & 0xF00) != 0 ) /*0xfa38*/
  {
    n67453100 = 67453100; /*0xfa49*/
    n67453088 = 67453088; /*0xfa4e*/
    n67453112 = 67453112; /*0xfa52*/
  }
  else
  {
    n67453100 = 67453096; /*0xfa3a*/
    n67453088 = 67453084; /*0xfa3f*/
    n67453112 = 67453108; /*0xfa43*/
  }
  v14 = a3 | ((v10 & 0xFE | 0x400000) << 7); /*0xfa66*/
  v15 = v14 | 0x20000; /*0xfa6f*/
  if ( *(_WORD *)a2 != 4 ) /*0xfa76*/
    v15 = v14; /*0xfa76*/
  v16 = v15 | 0x80000; /*0xfa79*/
  v18 = NvdimmConfigRead(); /*0xfa82*/
  do /*0xfaa8*/
    LOBYTE(v17) = *(_BYTE *)(a1 + 1); /*0xfa8f*/
  while ( ((*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v17, 0, n67453100) & 1) != 0 /*0xfaa8*/
       && (unsigned int)NvdimmGetNextOffset(v18) < (unsigned int)"HobStart != ((void *) 0)" );
  LOBYTE(v17) = *(_BYTE *)(a1 + 1); /*0xfab4*/
  (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(v17, 0, n67453088, v16); /*0xfabc*/
  v20 = NvdimmConfigRead(); /*0xfac4*/
  n2 = 0; /*0xfac6*/
  do /*0xfaeb*/
    LOBYTE(v19) = *(_BYTE *)(a1 + 1); /*0xfad3*/
  while ( ((*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v19, 0, n67453100) & 1) != 0 /*0xfaeb*/
       && (unsigned int)NvdimmGetNextOffset(v20) < (unsigned int)"HobStart != ((void *) 0)" );
  v23 = NvdimmConfigRead(); /*0xfaf2*/
  do /*0xfb1b*/
  {
    LOBYTE(v22) = *(_BYTE *)(a1 + 1); /*0xfaff*/
    v24 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v22, 0, n67453100); /*0xfb04*/
    n4 = v24 & 6; /*0xfb09*/
  }
  while ( (v24 & 6) == 0 && (unsigned int)NvdimmGetNextOffset(v23) < (unsigned int)"HobStart != ((void *) 0)" ); /*0xfb1b*/
  if ( n4 == 4 ) /*0xfb24*/
  {
    LOBYTE(v22) = *(_BYTE *)(a1 + 1); /*0xfb30*/
    v26 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v22, 0, n67453112); /*0xfb35*/
    v27 = *(_WORD *)a2 == 4; /*0xfb38*/
    v31 = v26; /*0xfb3b*/
    *a4 = v26; /*0xfb43*/
    if ( v27 ) /*0xfb46*/
      a4[1] = BYTE1(v31); /*0xfb4f*/
  }
  else
  {
    n2 = 2; /*0xfb55*/
  }
  LOBYTE(v22) = *(_BYTE *)(a1 + 1); /*0xfb78*/
  (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(
    v22,
    0,
    (a2[1] & 0xF00) != 0 ? 67453088 : 67453084,
    (unsigned int)dword_1A9A8);
  return n2; /*0xfb96*/
}


// Function: NvdimmReadStatus @ 0xfba8 (0x1a1 bytes)
// Index: 81/150

unsigned __int64 __fastcall NvdimmReadStatus(_BYTE *a1, unsigned __int8 a2, _BYTE *a3)
{
  char v6; // r10
  char v7; // r14
  int v8; // r13d
  __int16 v9; // r14
  int n2; // eax
  __int64 n3840; // rcx
  unsigned int v12; // edi
  int v13; // eax
  __int64 v14; // rcx
  unsigned int v15; // ebx
  __int64 v16; // rcx
  int v18; // [rsp+50h] [rbp+30h] BYREF
  __int16 v19; // [rsp+54h] [rbp+34h]

  LOWORD(v18) = 1; /*0xfbd5*/
  v6 = *a1 & 1; /*0xfbef*/
  v7 = a1[2]; /*0xfc02*/
  BYTE2(v18) = *a1; /*0xfc0c*/
  v8 = v18; /*0xfc10*/
  v9 = v19 & 0x81 /*0xfc73*/
     | ((((unsigned __int8)(a1[3] + 3 * v6) / 3u) & 0xF) << 8)
     | (2 * (2 * ((unsigned __int8)(a1[3] + 3 * v6) % 3u) + v7)) & 0xE
     | 0x80;
  v19 = v9; /*0xfc7a*/
  n2 = NvdimmReadFwData((__int64)a1, &v18, a2, a3); /*0xfc7f*/
  if ( n2 == 2 )
  {
    n3840 = 3840; /*0xfc8d*/
    LOBYTE(n3840) = a1[1]; /*0xfc99*/
    v12 = (v9 & 0xF00) != 0 ? 67453088 : 67453084;
    v13 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(n3840, 0, v12); /*0xfcb6*/
    LOBYTE(v14) = a1[1]; /*0xfcb9*/
    v15 = v13 & 0xDEFFFFFF | 0x1000000; /*0xfcce*/
    (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(v14, 0, v12, v15); /*0xfcd5*/
    PciExpressWrite((unsigned int)&n35795_); /*0xfcdd*/
    LOBYTE(v16) = a1[1]; /*0xfced*/
    (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))( /*0xfcfc*/
      v16,
      0,
      v12,
      v15 & 0xDEFFFFFF | 0x20000000);
    v18 = v8; /*0xfd02*/
    v19 = v9; /*0xfd09*/
    n2 = NvdimmReadFwData((__int64)a1, &v18, a2, a3); /*0xfd15*/
  }
  return -(__int64)(n2 != 0) & 0x8000000000000007uLL; /*0xfd3b*/
}


// Function: NvdimmReadExtended @ 0xfd4c (0x1d9 bytes)
// Index: 82/150

__int64 __fastcall NvdimmReadExtended(_BYTE *a1, unsigned __int8 a2, unsigned __int8 *a3)
{
  char v6; // r10
  char v7; // bp
  char v8; // dl
  unsigned __int16 v9; // bp
  __int16 v10; // bp
  unsigned int n67453088; // r15d
  unsigned int n67453100; // r14d
  unsigned int n67453112; // r12d
  unsigned int v14; // edi
  unsigned int v15; // ebx
  __int64 v16; // rcx
  unsigned int v17; // r13d
  __int64 v18; // rcx
  __int64 v19; // rcx
  unsigned int v20; // ebx
  int v22; // [rsp+60h] [rbp+8h] BYREF
  unsigned __int16 v23; // [rsp+64h] [rbp+Ch]
  int v24; // [rsp+78h] [rbp+20h]
  int v25; // [rsp+7Ch] [rbp+24h]

  LOWORD(v24) = 1; /*0xfd6e*/
  v6 = *a1 & 1; /*0xfd89*/
  v7 = a1[2]; /*0xfd9c*/
  BYTE2(v24) = *a1; /*0xfda5*/
  v8 = a1[1]; /*0xfde8*/
  v9 = v25 & 0x81 /*0xfdf9*/
     | ((((unsigned __int8)(a1[3] + 3 * v6) / 3u) & 0xF) << 8)
     | (2 * (2 * ((unsigned __int8)(a1[3] + 3 * v6) % 3u) + v7)) & 0xE
     | 0x80;
  LOWORD(v25) = v9; /*0xfe05*/
  v22 = v24; /*0xfe0a*/
  v23 = v9; /*0xfe0e*/
  NvdimmGetSmbiosTable((__int64)&v22, v8); /*0xfe13*/
  v10 = HIBYTE(v9) & 0xF; /*0xfe1c*/
  if ( v10 ) /*0xfe20*/
  {
    n67453088 = 67453088; /*0xfe32*/
    n67453100 = 67453100; /*0xfe38*/
    n67453112 = 67453112; /*0xfe3c*/
  }
  else
  {
    n67453088 = 67453084; /*0xfe22*/
    n67453100 = 67453096; /*0xfe28*/
    n67453112 = 67453108; /*0xfe2c*/
  }
  v14 = *a3 << 16; /*0xfe57*/
  v15 = a2 | ((v25 & 0xFE | 0x400100) << 7) | 0x80000; /*0xfe5f*/
  v17 = NvdimmConfigRead(); /*0xfe68*/
  do /*0xfe8f*/
    LOBYTE(v16) = a1[1]; /*0xfe75*/
  while ( ((*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v16, 0, n67453100) & 1) != 0 /*0xfe8f*/
       && (unsigned int)NvdimmGetNextOffset(v17) < (unsigned int)"HobStart != ((void *) 0)" );
  LOBYTE(v16) = a1[1]; /*0xfe9b*/
  (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(v16, 0, n67453112, v14); /*0xfea3*/
  LOBYTE(v18) = a1[1]; /*0xfeb0*/
  (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(v18, 0, n67453088, v15); /*0xfeb8*/
  v20 = NvdimmConfigRead(); /*0xfec0*/
  do /*0xfee5*/
    LOBYTE(v19) = a1[1]; /*0xfecc*/
  while ( ((*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(qword_C5470 + 8))(v19, 0, n67453100) & 0xA) == 0 /*0xfee5*/
       && (unsigned int)NvdimmGetNextOffset(v20) < (unsigned int)"HobStart != ((void *) 0)" );
  LOBYTE(v19) = a1[1]; /*0xfef8*/
  (*(void (__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(qword_C5470 + 16))(
    v19,
    0,
    v10 != 0 ? 67453088 : 67453084,
    (unsigned int)dword_1A9A8);
  return 0; /*0xff15*/
}


// Function: NvdimmFwSendCommand @ 0xff28 (0xe9 bytes)
// Index: 83/150

unsigned __int64 __fastcall NvdimmFwSendCommand(_BYTE *a1, unsigned __int8 a2)
{
  unsigned __int64 n5; // rdi
  signed __int64 v5; // rax
  signed __int64 v7; // rax
  unsigned __int8 v8; // [rsp+48h] [rbp+10h] BYREF
  unsigned __int8 v9; // [rsp+50h] [rbp+18h] BYREF

  v8 = a2; /*0xff2d*/
  n5 = 0; /*0xff44*/
  v5 = NvdimmReadStatus(a1, 0, &v9); /*0xff46*/
  if ( v5 < 0 ) /*0xff53*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v5); /*0xff61*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvDimmAccess.c", 0x1CCu, "!EFI_ERROR (Status)"); /*0xff79*/
  }
  if ( v9 == a2 ) /*0xff82*/
    return 0; /*0xff84*/
  NvdimmReadExtended(a1, 0, &v8); /*0xff92*/
  do /*0xffee*/
  {
    PciExpressWrite(0x8BD3u); /*0xff9c*/
    v7 = NvdimmReadStatus(a1, 0, &v9); /*0xffab*/
    if ( v7 < 0 ) /*0xffb3*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v7); /*0xffc2*/
      DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvDimmAccess.c", 0x1D9u, "!EFI_ERROR (Status)"); /*0xffda*/
    }
    ++n5; /*0xffe3*/
  }
  while ( n5 < 5 && v9 != a2 ); /*0xffee*/
  return -(__int64)(a2 != v9) & 0x8000000000000007uLL; /*0x10009*/
}


// Function: NvdimmReadSpdData @ 0x10014 (0x3c9 bytes)
// Index: 84/150

__int64 __fastcall NvdimmReadSpdData(unsigned __int16 *a1)
{
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1002e*/
    DebugPrint(0x80000000, "Memory Device to SPA Table\n"); /*0x10046*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10068*/
    DebugPrint(0x80000000, "\tType.......................0x%02X\n", *a1); /*0x1008b*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x100ad*/
    DebugPrint(0x80000000, "\tLength.....................0x%02X\n", a1[1]); /*0x100d1*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x100f3*/
    DebugPrint(0x80000000, "\tDevice Handle..............0x%04X\n", *((_DWORD *)a1 + 1)); /*0x10114*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10136*/
    DebugPrint(0x80000000, "\tPhysical ID................0x%02X\n", a1[4]); /*0x1015a*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1017c*/
    DebugPrint(0x80000000, "\tRegion ID..................0x%02X\n", a1[5]); /*0x101a0*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x101c2*/
    DebugPrint(0x80000000, "\tSPA Index..................0x%02X\n", a1[6]); /*0x101e6*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10208*/
    DebugPrint(0x80000000, "\tNVDIMM Ctrl Region Index...0x%02X\n", a1[7]); /*0x1022c*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1024e*/
    DebugPrint(0x80000000, "\tRegion Size................0x%08llX\n", *((_QWORD *)a1 + 2)); /*0x1026f*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10291*/
    DebugPrint(0x80000000, "\tRegion Offset..............0x%08llX\n", *((_QWORD *)a1 + 3)); /*0x102b2*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x102d4*/
    DebugPrint(0x80000000, "\tPhysical Address Base......0x%08llX\n", *((_QWORD *)a1 + 4)); /*0x102f5*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10317*/
    DebugPrint(0x80000000, "\tInterleave Structure Index.0x%02X\n", a1[20]); /*0x1033b*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x1035d*/
    DebugPrint(0x80000000, "\tInterleave Ways............0x%02X\n", a1[21]); /*0x10381*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x103a3*/
    DebugPrint(0x80000000, "\tFlags......................0x%02X\n", a1[22]); /*0x103c7*/
  return 0; /*0x103d8*/
}


// Function: PciConfigRead @ 0x103e0 (0xe3 bytes)
// Index: 85/150

__int64 __fastcall PciConfigRead(unsigned __int8 n4, unsigned __int8 n6, char a3)
{
  char v4; // [rsp+20h] [rbp-18h]
  char buf[20]; // [rsp+24h] [rbp-14h] BYREF

  NvdimmFwUpdateSlot((__int64)buf, 4u); /*0x103fb*/
  if ( n4 >= 4u || n6 >= 6u ) /*0x10412*/
    return *(unsigned int *)buf; /*0x10414*/
  if ( n6 >= 3u ) /*0x10425*/
  {
    v4 = 1; /*0x1042e*/
    n6 -= 3; /*0x1043b*/
  }
  else
  {
    v4 = 0; /*0x10427*/
  }
  return ((n4 & 0xF) << 12) /*0x104be*/
       | ((v4 & 0xF) << 8) & 0xFFF
       | (unsigned __int8)(16 * (n6 & 0xF))
       | a3 & 0xF
       | *(_DWORD *)buf & 0xF0000000;
}


// Function: SpdReadSmbus @ 0x104c4 (0x1ab bytes)
// Index: 86/150

char __fastcall SpdReadSmbus(unsigned __int8 n4, __int64 n2, unsigned __int8 n0x18)
{
  char n3; // [rsp+20h] [rbp-18h]
  __int64 v6; // [rsp+28h] [rbp-10h]

  if ( n4 >= 4u || (unsigned __int8)n2 >= 2u || n0x18 >= 0x18u ) /*0x104f1*/
    return 0; /*0x104f3*/
  v6 = dst + 5337LL * n4 + 2956 + 19LL * n0x18 + 213; /*0x10526*/
  if ( DebugLevelEnabled() && !v6 ) /*0x1053d*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0xD1u, "pSAD != ((void *) 0)"); /*0x10552*/
  if ( !v6 ) /*0x10563*/
    return 0; /*0x10565*/
  n3 = NvdimmStatusDecode(v6); /*0x10576*/
  if ( n3 == 7 )
  {
    if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: SAD is 3 way Ch interleaved.\n");
    }
    return 3; /*0x105be*/
  }
  else if ( n3 == 3 || n3 == 5 || n3 == 6 )
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "Nfit: SAD is 2 way Ch interleaved.\n");
    return 2; /*0x10620*/
  }
  else
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "Nfit: SAD is 1 way Ch interleaved.\n");
    return 1; /*0x10661*/
  }
}


// Function: SpdSetDefaults @ 0x10670 (0x80 bytes)
// Index: 87/150

char __fastcall SpdSetDefaults(char *buf, unsigned int i)
{
  char v3; // [rsp+0h] [rbp-18h]
  unsigned __int64 j; // [rsp+8h] [rbp-10h]

  if ( !buf || !i ) /*0x1068a*/
    return 0; /*0x1068c*/
  v3 = *buf; /*0x10697*/
  for ( j = 1; j < i; ++j ) /*0x1069a*/
    v3 += buf[j]; /*0x106d6*/
  return -v3; /*0x106eb*/
}


// Function: PciConfigGetData @ 0x106f0 (0xa6 bytes)
// Index: 88/150

__int64 __fastcall PciConfigGetData(unsigned __int8 n4, unsigned __int8 a2, unsigned __int8 a3)
{
  unsigned __int8 i; // [rsp+0h] [rbp-18h]

  for ( i = 0; i < (int)(unsigned __int16)word_C5468; ++i ) /*0x10701*/
  {
    if ( LOBYTE(word_1F420[3 * i]) == n4 && HIBYTE(word_1F420[3 * i]) == a2 && LOBYTE(word_1F420[3 * i + 1]) == a3 ) /*0x10772*/
      return (unsigned __int16)word_1F420[3 * i + 2]; /*0x10788*/
  }
  return 0; /*0x10791*/
}


// Function: NvdimmDispatchCommands @ 0x10798 (0x776 bytes)
// Index: 89/150

__int64 __fastcall NvdimmDispatchCommands(
        __int64 a1,
        __int64 n4,
        unsigned __int8 n4a_2,
        unsigned __int8 n4a_3,
        __int64 a5,
        int a6,
        __int64 a7,
        unsigned __int16 n4a_5,
        unsigned __int8 n4a_4,
        _BYTE *a10)
{
  __int64 n4a_1; // rax
  unsigned __int8 v11; // [rsp+20h] [rbp-38h] BYREF
  char v12; // [rsp+21h] [rbp-37h]
  unsigned __int16 *v13; // [rsp+28h] [rbp-30h]
  signed __int64 v14; // [rsp+30h] [rbp-28h]
  __int64 v15; // [rsp+38h] [rbp-20h]
  __int64 n4a_6; // [rsp+40h] [rbp-18h]
  __int64 v17; // [rsp+48h] [rbp-10h]
  unsigned __int8 n4a; // [rsp+68h] [rbp+10h]

  n4a = n4; /*0x107a2*/
  v14 = 0; /*0x107af*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x107c9*/
    DebugPrint(0x80000000, "Entering BldMemDevToSPARngMap!\n"); /*0x107e1*/
  v12 = a10[2]; /*0x107fd*/
  n4a_1 = n4a; /*0x10801*/
  if ( n4a < 4u )
  {
    n4a_1 = n4a_2; /*0x1080b*/
    if ( n4a_2 < 2u )
    {
      n4a_1 = n4a_3; /*0x10815*/
      if ( n4a_3 < 6u )
      {
        n4a_1 = n4a_4; /*0x1081f*/
        if ( n4a_4 < 0x18u )
        {
          n4a_1 = n4a_5; /*0x1082c*/
          if ( n4a_5 )
          {
            if ( a5 && a1 )
            {
              v15 = dst + 5337LL * n4a + 2956 + 19LL * n4a_4 + 213; /*0x10884*/
              if ( DebugLevelEnabled() && !v15 ) /*0x1089b*/
                DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x267u, "pSAD != ((void *) 0)"); /*0x108b0*/
              n4a_1 = 0; /*0x108b5*/
              if ( v15 )
              {
                v13 = (unsigned __int16 *)(*(unsigned int *)(a1 + 4) + a1 + 40); /*0x108e6*/
                *v13 = 1; /*0x108f5*/
                v13[1] = 48; /*0x10902*/
                *((_DWORD *)v13 + 1) = PciConfigRead(n4a, n4a_3, v12); /*0x1091d*/
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
                  DebugPrint(0x80000000, "Nfit: NfitDevHandle = 0x%X\n", *((_DWORD *)v13 + 1));
                v13[4] = PciConfigGetData(n4a, n4a_3, v12); /*0x1097a*/
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
                  DebugPrint(0x80000000, "Nfit: SMBIOSHandle = 0x%X\n", v13[4]);
                v13[5] = word_1A818++; /*0x109d0*/
                v13[6] = *(_WORD *)(a5 + 4); /*0x109f6*/
                v13[7] = (unsigned __int8)a10[4]; /*0x10a0b*/
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
                  DebugPrint(0x80000000, "Nfit: CntrlRgnInx = 0x%X\n", v13[7]);
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
                  DebugPrint(0x80000000, "Nfit: RegionOffset = 0x%llx\n", a7);
                n4a_6 = n4a_5; /*0x10a9f*/
                *((_QWORD *)v13 + 2) = *(_QWORD *)(a5 + 40) / (unsigned __int64)n4a_5; /*0x10abf*/
                v17 = *(unsigned int *)(dst /*0x10b05*/
                                      + 5337LL * n4a
                                      + 2956
                                      + 527LL * n4a_3
                                      + 2175
                                      + 168LL * (unsigned __int8)v12
                                      + 224);
                *((_QWORD *)v13 + 4) = v17 << 26; /*0x10b18*/
                *((_QWORD *)v13 + 3) = a7; /*0x10b29*/
                v13[20] = 0; /*0x10b34*/
                v13[21] = n4a_5; /*0x10b45*/
                v13[22] = 32; /*0x10b53*/
                v14 = NvdimmFwSendCommand(a10, 0); /*0x10b66*/
                if ( DebugLevelEnabled() && v14 < 0 ) /*0x10b7d*/
                {
                  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10b90*/
                    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v14); /*0x10bad*/
                  DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x28Cu, "!EFI_ERROR (Status)"); /*0x10bd1*/
                }
                v14 = NvdimmReadStatus(a10, 0x64u, &v11); /*0x10bf0*/
                if ( DebugLevelEnabled() && v14 < 0 ) /*0x10c07*/
                {
                  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10c1a*/
                    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v14); /*0x10c37*/
                  DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x28Fu, "!EFI_ERROR (Status)"); /*0x10c5b*/
                }
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10c77*/
                  DebugPrint(0x80000000, "SAVE_STATUS = 0x%x\n", v11); /*0x10c97*/
                if ( (v11 & 2) != 0 ) /*0x10cb2*/
                  v13[22] |= 1u; /*0x10cc5*/
                v14 = NvdimmReadStatus(a10, 0x66u, &v11); /*0x10cdd*/
                if ( DebugLevelEnabled() && v14 < 0 ) /*0x10cf4*/
                {
                  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10d07*/
                    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v14); /*0x10d24*/
                  DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x295u, "!EFI_ERROR (Status)"); /*0x10d48*/
                }
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10d64*/
                  DebugPrint(0x80000000, "RESTORE_STATUS = 0x%x\n", v11); /*0x10d84*/
                if ( (v11 & 2) != 0 ) /*0x10d9f*/
                  v13[22] |= 2u; /*0x10db2*/
                v14 = NvdimmReadStatus(a10, 0x6Au, &v11); /*0x10dca*/
                if ( DebugLevelEnabled() && v14 < 0 ) /*0x10de1*/
                {
                  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10df4*/
                    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v14); /*0x10e11*/
                  DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x29Bu, "!EFI_ERROR (Status)"); /*0x10e35*/
                }
                if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10e51*/
                  DebugPrint(0x80000000, "ARM_STATUS = 0x%x\n", v11); /*0x10e71*/
                if ( (v11 & 2) != 0 ) /*0x10e8c*/
                  v13[22] |= 8u; /*0x10e9f*/
                NvdimmReadSpdData(v13); /*0x10ea8*/
                if ( DebugLevelEnabled() ) /*0x10ead*/
                {
                  if ( *(_DWORD *)(a1 + 4) + (unsigned int)v13[1] > n98344 ) /*0x10ed0*/
                    DebugAssert( /*0x10ee5*/
                      "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c",
                      0x2A4u,
                      "(pNfit->Length + pMDTSPARMT->Length) <= mNfitSize");
                }
                n4a_1 = *(_DWORD *)(a1 + 4) + (unsigned int)v13[1]; /*0x10efe*/
                *(_DWORD *)(a1 + 4) = n4a_1; /*0x10f06*/
              }
            }
          }
        }
      }
    }
  }
  return n4a_1; /*0x10f09*/
}


// Function: NvdimmAddControlRegion @ 0x10f10 (0x6c0 bytes)
// Index: 90/150

__int64 __fastcall NvdimmAddControlRegion(char *buf, unsigned __int8 *dst)
{
  __int64 result; // rax
  char *v3; // [rsp+30h] [rbp-18h]
  char *NvdimmBase; // [rsp+38h] [rbp-10h]

  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) ) /*0x10f38*/
    DebugPrint(0x80000000, "Entering AddCtrlRgnToNfit!\n"); /*0x10f50*/
  if ( buf )
  {
    NvdimmBase = SmbusGetNvdimmBase(dst[1], dst[3] + 3 * *dst, dst[2]); /*0x11008*/
    if ( NvdimmBase )
    {
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(
          0x80000000,
          "Nfit: Adding CntrlRgn for a NvmDimm on Socket = %d, Channel = %d, Dimm = %d\n",
          dst[1],
          dst[3] + 3 * *dst,
          dst[2]);
      v3 = &buf[*((unsigned int *)buf + 1) + 40]; /*0x11110*/
      *(_WORD *)v3 = 4; /*0x1111f*/
      *((_WORD *)v3 + 1) = 80; /*0x1112c*/
      *((_WORD *)v3 + 2) = dst[4]; /*0x1113e*/
      *((_WORD *)v3 + 3) = *((_WORD *)NvdimmBase + 14); /*0x11150*/
      *((_WORD *)v3 + 4) = *((_WORD *)NvdimmBase + 13); /*0x11162*/
      *((_WORD *)v3 + 5) = *((_WORD *)NvdimmBase + 15); /*0x11174*/
      *((_WORD *)v3 + 6) = *((_WORD *)NvdimmBase + 16); /*0x11186*/
      *((_WORD *)v3 + 7) = *((_WORD *)NvdimmBase + 17); /*0x11198*/
      *((_WORD *)v3 + 8) = *((_WORD *)NvdimmBase + 18); /*0x111aa*/
      v3[18] = 1; /*0x111b3*/
      v3[19] = NvdimmBase[38]; /*0x111c4*/
      *((_WORD *)v3 + 10) = *(_WORD *)(NvdimmBase + 39); /*0x111d5*/
      if ( *(_DWORD *)(NvdimmBase + 43) ) /*0x111de*/
        *((_DWORD *)v3 + 6) = *(_DWORD *)(NvdimmBase + 43); /*0x11204*/
      else
        *((_DWORD *)v3 + 6) = dst[4]; /*0x111f2*/
      *((_WORD *)v3 + 14) = *(_WORD *)(NvdimmBase + 41); /*0x11215*/
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgnIndex = 0x%X\n", *((unsigned __int16 *)v3 + 2));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn VendorID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 14));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn DeviceID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 13));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn RevisionID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 15));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn SubsystemVendorID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 16));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn SubsystemDeviceID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 17));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn SubsystemRevisionID = 0x%X\n", *((unsigned __int16 *)NvdimmBase + 18));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn ManufLocation = 0x%X\n", (unsigned __int8)NvdimmBase[38]);
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn ManufDate = 0x%X\n", *(unsigned __int16 *)(NvdimmBase + 39));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn SerialNumber = 0x%X\n", *((_DWORD *)v3 + 6));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: CntrlRgn RegionFormatInterfaceCode = 0x%X\n", *((unsigned __int16 *)v3 + 14));
      *((_WORD *)v3 + 15) = 0; /*0x1151f*/
      *((_QWORD *)v3 + 4) = 0; /*0x11528*/
      *((_QWORD *)v3 + 5) = 0; /*0x11535*/
      *((_QWORD *)v3 + 6) = 0; /*0x11542*/
      *((_QWORD *)v3 + 7) = 0; /*0x1154f*/
      *((_QWORD *)v3 + 8) = 0; /*0x1155c*/
      *((_WORD *)v3 + 36) = 0; /*0x1156b*/
      if ( DebugLevelEnabled() && *((_DWORD *)buf + 1) + (unsigned int)*((unsigned __int16 *)v3 + 1) > n98344 ) /*0x11592*/
        DebugAssert( /*0x115a7*/
          "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c",
          0x2F9u,
          "(pNfit->Length + pCntrlRgnTbl->Length) <= mNfitSize");
      result = *((_DWORD *)buf + 1) + (unsigned int)*((unsigned __int16 *)v3 + 1); /*0x115c0*/
      *((_DWORD *)buf + 1) = result; /*0x115c8*/
    }
    else
    {
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: dimm information structure not found! AddCtrlRgnToNfit interrupted!\n");
      if ( DebugLevelEnabled() ) /*0x1104f*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x2C8u, "pDimm != ((void *) 0)"); /*0x11076*/
      return 0; /*0x1107b*/
    }
  }
  else
  {
    if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
      DebugPrint(0x80000000, "Nfit: Parameters error! AddCtrlRgnToNfit interrupted!\n");
    if ( DebugLevelEnabled() ) /*0x10fa3*/
      DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x2C0u, "pNfit != ((void *) 0)"); /*0x10fca*/
    return 0; /*0x10fcf*/
  }
  return result; /*0x115cb*/
}


// Function: NvdimmGetHealth @ 0x115d0 (0x4a8 bytes)
// Index: 91/150

void __fastcall NvdimmGetHealth(char *buf, unsigned __int8 n4, __int64 n2, __int64 a4, unsigned __int8 *n4_3)
{
  unsigned __int8 *n4_1; // rdx
  unsigned __int8 *n4_2; // rdx
  int v7; // [rsp+28h] [rbp-320h]
  unsigned __int8 n4a; // [rsp+50h] [rbp-2F8h]
  unsigned __int8 n4b; // [rsp+50h] [rbp-2F8h]
  char v10; // [rsp+51h] [rbp-2F7h]
  __int16 v11; // [rsp+54h] [rbp-2F4h]
  __int64 v12; // [rsp+58h] [rbp-2F0h]
  unsigned int v13; // [rsp+60h] [rbp-2E8h]
  __int64 Result2; // [rsp+68h] [rbp-2E0h]
  _BYTE dst[176]; // [rsp+70h] [rbp-2D8h] BYREF
  _BYTE dst_1[176]; // [rsp+120h] [rbp-228h] BYREF
  _BYTE dst_2[176]; // [rsp+1D0h] [rbp-178h] BYREF
  _BYTE dst_3[200]; // [rsp+280h] [rbp-C8h] BYREF

  n4a = 0; /*0x115ec*/
  if ( buf && n2 && n4 )
  {
    v11 = word_1A9A4 + 1; /*0x11621*/
    v12 = 0; /*0x11626*/
    Result2 = dst + 5337LL * n4_3[17] + 2956 + 19LL * n4_3[16] + 213; /*0x11669*/
    v10 = NvdimmStatusDecode(Result2); /*0x11678*/
    v13 = NvdimmParseConfig(Result2); /*0x11686*/
    if ( (v10 & 1) == 1 ) /*0x11695*/
    {
      n4a = 0; /*0x11697*/
    }
    else if ( (v10 & 2) == 2 ) /*0x116a9*/
    {
      n4a = 1; /*0x116ab*/
    }
    else if ( (v10 & 4) == 4 ) /*0x116bd*/
    {
      n4a = 2; /*0x116bf*/
    }
    if ( 2 * n4_3[17] < 8 )
    {
      if ( *(_BYTE *)(dst + 5337LL * n4_3[17] + 2956 + 8LL * n4_3[16] + 4 + 2 * n4_3[17]) ) /*0x1175a*/
      {
        n4_1 = n4_3; /*0x11785*/
        if ( n4 == 1 ) /*0x11771*/
        {
          qmemcpy(dst, n4_3 + 19, 0xA3u); /*0x1179a*/
          LOWORD(v7) = 0; /*0x117cc*/
          LOBYTE(n4_1) = n4_3[17]; /*0x117f0*/
          NvdimmDispatchCommands((__int64)buf, (__int64)n4_1, 0, n4a, n2, v7, 0, n4, n4_3[16], dst); /*0x117fb*/
        }
        else
        {
          qmemcpy(dst_1, n4_3 + 19, 0xA3u); /*0x1182b*/
          LOWORD(v7) = v11; /*0x11865*/
          LOBYTE(n4_1) = n4_3[17]; /*0x11887*/
          NvdimmDispatchCommands((__int64)buf, (__int64)n4_1, 0, n4a, n2, v7, 0, n4, n4_3[16], dst_1); /*0x11892*/
          ++v11; /*0x1189f*/
          v12 = v13; /*0x118b3*/
        }
      }
      if ( *(_BYTE *)(dst + 5337LL * n4_3[17] + 2956 + 8LL * n4_3[16] + 4 + 2 * n4_3[17] + 1) ) /*0x118fe*/
      {
        n4b = n4a + 3; /*0x11912*/
        n4_2 = n4_3; /*0x11938*/
        if ( n4 == 1 ) /*0x11921*/
        {
          qmemcpy(dst_2, n4_3 + 19, 0xA3u); /*0x1194d*/
          LOWORD(v7) = 0; /*0x11982*/
          LOBYTE(n4_2) = n4_3[17]; /*0x119a6*/
          NvdimmDispatchCommands((__int64)buf, (__int64)n4_2, 1u, n4b, n2, v7, v12, n4, n4_3[16], dst_2); /*0x119b1*/
        }
        else
        {
          qmemcpy(dst_3, n4_3 + 19, 0xA3u); /*0x119e1*/
          LOWORD(v7) = v11; /*0x11a1b*/
          LOBYTE(n4_2) = n4_3[17]; /*0x11a3d*/
          NvdimmDispatchCommands((__int64)buf, (__int64)n4_2, 1u, n4b, n2, v7, v12, n4, n4_3[16], dst_3); /*0x11a48*/
        }
      }
    }
    else if ( DebugLevelEnabled() )
    {
      if ( DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: BuildMemDevFor1WayChInt (PmemRegion->SocketNum * MAX_IMC) >= MC_MAX_NODE \n");
    }
  }
}


// Function: NvdimmSetEvent @ 0x11a78 (0x58d bytes)
// Index: 92/150

void __fastcall NvdimmSetEvent(char *buf, unsigned __int8 n2, __int64 a3, __int64 a4, __int64 n4)
{
  __int64 n4_3; // rdx
  _BYTE *dst_2; // rdx
  __int64 n4_5; // rdx
  _BYTE *dst_5; // rdx
  int v9; // [rsp+28h] [rbp-330h]
  int v10; // [rsp+28h] [rbp-330h]
  int v11; // [rsp+28h] [rbp-330h]
  unsigned __int8 n4a; // [rsp+50h] [rbp-308h]
  unsigned __int8 n4_1; // [rsp+51h] [rbp-307h]
  __int16 n4_2; // [rsp+52h] [rbp-306h]
  __int16 n4_4; // [rsp+54h] [rbp-304h]
  __int16 n4_4a; // [rsp+54h] [rbp-304h]
  char v17; // [rsp+58h] [rbp-300h]
  unsigned int VendorDetails; // [rsp+5Ch] [rbp-2FCh]
  __int64 v19; // [rsp+60h] [rbp-2F8h]
  unsigned int VendorDetails_1; // [rsp+68h] [rbp-2F0h]
  __int64 Result2; // [rsp+70h] [rbp-2E8h]
  unsigned __int64 v22; // [rsp+78h] [rbp-2E0h]
  _BYTE dst[176]; // [rsp+80h] [rbp-2D8h] BYREF
  _BYTE dst_1[176]; // [rsp+130h] [rbp-228h] BYREF
  _BYTE dst_3[176]; // [rsp+1E0h] [rbp-178h] BYREF
  _BYTE dst_4[200]; // [rsp+290h] [rbp-C8h] BYREF

  n4_2 = 256; /*0x11a94*/
  if ( buf && a3 && n2 ) /*0x11abe*/
  {
    v19 = 0; /*0x11ac5*/
    for ( n4a = 0; n4a < 4u; ++n4a ) /*0x11ace*/
    {
      for ( n4_1 = 0; n4_1 < 0x18u; ++n4_1 ) /*0x11aed*/
      {
        Result2 = dst + 5337LL * n4a + 2956 + 19LL * n4_1 + 213; /*0x11b38*/
        if ( DebugLevelEnabled() && !Result2 ) /*0x11b4f*/
          DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x37Eu, "pSAD != ((void *) 0)"); /*0x11b64*/
        if ( !Result2 ) /*0x11b75*/
          break; /*0x11b75*/
        v17 = NvdimmStatusDecode(Result2); /*0x11b86*/
        VendorDetails_1 = NvdimmParseConfig(Result2); /*0x11b94*/
        VendorDetails = NvdimmGetVendorDetails(Result2); /*0x11ba2*/
        if ( n4_1 ) /*0x11bad*/
          v22 = (unsigned __int64)*(unsigned int *)(dst + 5337LL * n4a + 2956 + 19LL * (n4_1 - 1) + 217) << 26; /*0x11bee*/
        else
          v22 = 0; /*0x11baf*/
        if ( v22 == a4 && *(_BYTE *)(dst + 5337LL * n4a + 2956 + 19LL * n4_1 + 227) ) /*0x11c2a*/
        {
          if ( (v17 & 3) == 3 ) /*0x11c45*/
          {
            n4_2 = 256; /*0x11c47*/
          }
          else if ( (v17 & 5) == 5 ) /*0x11c5e*/
          {
            n4_2 = 512; /*0x11c60*/
          }
          else if ( (v17 & 6) == 6 ) /*0x11c77*/
          {
            n4_2 = 513; /*0x11c79*/
          }
          n4_4 = word_1A9A4 + 1; /*0x11c8c*/
          if ( *(_BYTE *)(dst + 5337LL * n4a + 2956 + 8LL * n4_1 + 4 + 2 * n4a) ) /*0x11cc0*/
          {
            n4_3 = n4; /*0x11cdd*/
            qmemcpy(dst, (const void *)(n4 + 19), 0xA3u); /*0x11cf2*/
            LOWORD(v9) = word_1A9A4 + 1; /*0x11d27*/
            LOBYTE(n4_3) = n4a; /*0x11d41*/
            NvdimmDispatchCommands((__int64)buf, n4_3, 0, n4_2, a3, v9, v19, 2 * n2, n4_1, dst); /*0x11d4d*/
            n4_4a = n4_4 + 1; /*0x11d5a*/
            qmemcpy(dst_1, (const void *)(n4 + 182), 0xA3u); /*0x11d85*/
            dst_2 = dst_1; /*0x11da0*/
            LOWORD(v10) = n4_4a; /*0x11dc4*/
            LOBYTE(dst_2) = n4a; /*0x11dde*/
            NvdimmDispatchCommands( /*0x11dea*/
              (__int64)buf,
              (__int64)dst_2,
              0,
              HIBYTE(n4_2),
              a3,
              v10,
              VendorDetails + v19,
              2 * n2,
              n4_1,
              dst_1);
            n4_4 = n4_4a + 1; /*0x11df7*/
            if ( VendorDetails_1 == VendorDetails ) /*0x11e04*/
              v19 += 2 * VendorDetails; /*0x11e2f*/
            else
              v19 += VendorDetails_1; /*0x11e15*/
          }
          if ( *(_BYTE *)(dst + 5337LL * n4a + 2956 + 8LL * n4_1 + 4 + 2 * n4a + 1) ) /*0x11e65*/
          {
            LOBYTE(n4_2) = n4_2 + 3; /*0x11e79*/
            n4_5 = n4; /*0x11e8e*/
            qmemcpy(dst_3, (const void *)(n4 + 19), 0xA3u); /*0x11ea3*/
            LOWORD(v9) = n4_4; /*0x11ed8*/
            LOBYTE(n4_5) = n4a; /*0x11ef2*/
            NvdimmDispatchCommands((__int64)buf, n4_5, 1u, n4_2, a3, v9, v19, 2 * n2, n4_1, dst_3); /*0x11efe*/
            HIBYTE(n4_2) += 3; /*0x11f18*/
            qmemcpy(dst_4, (const void *)(n4 + 182), 0xA3u); /*0x11f42*/
            dst_5 = dst_4; /*0x11f5d*/
            LOWORD(v11) = n4_4 + 1; /*0x11f81*/
            LOBYTE(dst_5) = n4a; /*0x11f9b*/
            NvdimmDispatchCommands( /*0x11fa7*/
              (__int64)buf,
              (__int64)dst_5,
              1u,
              HIBYTE(n4_2),
              a3,
              v11,
              VendorDetails + v19,
              2 * n2,
              n4_1,
              dst_4);
            if ( VendorDetails_1 == VendorDetails ) /*0x11fc1*/
              v19 += 2 * VendorDetails; /*0x11fec*/
            else
              v19 += VendorDetails_1; /*0x11fd2*/
          }
        }
      }
    }
  }
}


// Function: NvdimmGetExtendedStatus @ 0x12008 (0x63a bytes)
// Index: 93/150

void __fastcall NvdimmGetExtendedStatus(char *buf, unsigned __int8 n2, __int64 a3, __int64 a4, __int64 n4)
{
  _BYTE *dst_1; // rdx
  _BYTE *dst_3; // rdx
  _BYTE *dst_5; // rdx
  _BYTE *dst_7; // rdx
  _BYTE *dst_9; // rdx
  _BYTE *dst_11; // rdx
  int v11; // [rsp+28h] [rbp-480h]
  int v12; // [rsp+28h] [rbp-480h]
  int v13; // [rsp+28h] [rbp-480h]
  int v14; // [rsp+28h] [rbp-480h]
  int v15; // [rsp+28h] [rbp-480h]
  unsigned __int8 v16; // [rsp+50h] [rbp-458h]
  unsigned __int8 v17; // [rsp+50h] [rbp-458h]
  unsigned __int8 v18; // [rsp+50h] [rbp-458h]
  unsigned __int8 n4a; // [rsp+51h] [rbp-457h]
  unsigned __int8 n4_1; // [rsp+52h] [rbp-456h]
  __int16 n4_3; // [rsp+54h] [rbp-454h]
  __int16 n4_3a; // [rsp+54h] [rbp-454h]
  __int16 n4_3b; // [rsp+54h] [rbp-454h]
  int n4_7; // [rsp+58h] [rbp-450h]
  __int64 v25; // [rsp+60h] [rbp-448h]
  unsigned __int64 v26; // [rsp+68h] [rbp-440h]
  _BYTE dst[176]; // [rsp+70h] [rbp-438h] BYREF
  _BYTE dst_2[176]; // [rsp+120h] [rbp-388h] BYREF
  _BYTE dst_4[176]; // [rsp+1D0h] [rbp-2D8h] BYREF
  _BYTE dst_6[176]; // [rsp+280h] [rbp-228h] BYREF
  _BYTE dst_8[176]; // [rsp+330h] [rbp-178h] BYREF
  _BYTE dst_10[200]; // [rsp+3E0h] [rbp-C8h] BYREF

  if ( buf && a3 && n2 ) /*0x12044*/
  {
    v16 = 0; /*0x1204b*/
    n4_3 = word_1A9A4 + 1; /*0x12059*/
    for ( n4a = 0; n4a < 4u; ++n4a ) /*0x1205e*/
    {
      for ( n4_1 = 0; n4_1 < 0x18u; ++n4_1 ) /*0x1207d*/
      {
        v25 = dst + 5337LL * n4a + 2956 + 19LL * n4_1 + 213; /*0x120c8*/
        if ( DebugLevelEnabled() && !v25 ) /*0x120df*/
          DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x3EEu, "pSAD != ((void *) 0)"); /*0x120f4*/
        if ( !v25 ) /*0x12105*/
          break; /*0x12105*/
        n4_7 = NvdimmGetVendorDetails(v25); /*0x12116*/
        if ( n4_1 ) /*0x12121*/
          v26 = (unsigned __int64)*(unsigned int *)(dst + 5337LL * n4a + 2956 + 19LL * (n4_1 - 1) + 217) << 26; /*0x12162*/
        else
          v26 = 0; /*0x12123*/
        if ( v26 == a4 && *(_BYTE *)(dst + 5337LL * n4a + 2956 + 19LL * n4_1 + 227) ) /*0x1219e*/
        {
          if ( *(_BYTE *)(dst + 5337LL * n4a + 2956 + 8LL * n4_1 + 4 + 2 * n4a) ) /*0x121dd*/
          {
            qmemcpy(dst, (const void *)(n4 + 19), 0xA3u); /*0x1220c*/
            dst_1 = dst; /*0x1222f*/
            LOWORD(v11) = n4_3; /*0x12250*/
            LOBYTE(dst_1) = n4a; /*0x12268*/
            NvdimmDispatchCommands( /*0x12274*/
              (__int64)buf,
              (__int64)dst_1,
              0,
              0,
              a3,
              v11,
              (unsigned int)(n4_7 * dword_1A210[v16]),
              3 * n2,
              n4_1,
              dst);
            n4_3a = n4_3 + 1; /*0x12281*/
            v17 = v16 + 1; /*0x1228c*/
            qmemcpy(dst_2, (const void *)(n4 + 182), 0xA3u); /*0x122b6*/
            dst_3 = dst_2; /*0x122d9*/
            LOWORD(v12) = n4_3a; /*0x122fd*/
            LOBYTE(dst_3) = n4a; /*0x12315*/
            NvdimmDispatchCommands( /*0x12321*/
              (__int64)buf,
              (__int64)dst_3,
              0,
              1u,
              a3,
              v12,
              (unsigned int)(n4_7 * dword_1A210[v17]),
              3 * n2,
              n4_1,
              dst_2);
            ++n4_3a; /*0x1232e*/
            ++v17; /*0x12339*/
            qmemcpy(dst_4, (const void *)(n4 + 345), 0xA3u); /*0x12363*/
            dst_5 = dst_4; /*0x12386*/
            LOWORD(v13) = n4_3a; /*0x123aa*/
            LOBYTE(dst_5) = n4a; /*0x123c2*/
            NvdimmDispatchCommands( /*0x123ce*/
              (__int64)buf,
              (__int64)dst_5,
              0,
              2u,
              a3,
              v13,
              (unsigned int)(n4_7 * dword_1A210[v17]),
              3 * n2,
              n4_1,
              dst_4);
            n4_3 = n4_3a + 1; /*0x123db*/
            v16 = v17 + 1; /*0x123e6*/
          }
          if ( *(_BYTE *)(dst + 5337LL * n4a + 2956 + 8LL * n4_1 + 4 + 2 * n4a + 1) ) /*0x1241b*/
          {
            qmemcpy(dst_6, (const void *)(n4 + 19), 0xA3u); /*0x1244d*/
            dst_7 = dst_6; /*0x12470*/
            LOWORD(v11) = n4_3; /*0x12494*/
            LOBYTE(dst_7) = n4a; /*0x124ac*/
            NvdimmDispatchCommands( /*0x124b8*/
              (__int64)buf,
              (__int64)dst_7,
              1u,
              3u,
              a3,
              v11,
              (unsigned int)(n4_7 * dword_1A210[v16]),
              3 * n2,
              n4_1,
              dst_6);
            n4_3b = n4_3 + 1; /*0x124c5*/
            v18 = v16 + 1; /*0x124d0*/
            qmemcpy(dst_8, (const void *)(n4 + 182), 0xA3u); /*0x124fa*/
            dst_9 = dst_8; /*0x1251d*/
            LOWORD(v14) = n4_3b; /*0x12541*/
            LOBYTE(dst_9) = n4a; /*0x12559*/
            NvdimmDispatchCommands( /*0x12565*/
              (__int64)buf,
              (__int64)dst_9,
              1u,
              4u,
              a3,
              v14,
              (unsigned int)(n4_7 * dword_1A210[v18]),
              3 * n2,
              n4_1,
              dst_8);
            ++n4_3b; /*0x12572*/
            ++v18; /*0x1257d*/
            qmemcpy(dst_10, (const void *)(n4 + 345), 0xA3u); /*0x125a7*/
            dst_11 = dst_10; /*0x125ca*/
            LOWORD(v15) = n4_3b; /*0x125ee*/
            LOBYTE(dst_11) = n4a; /*0x12606*/
            NvdimmDispatchCommands( /*0x12612*/
              (__int64)buf,
              (__int64)dst_11,
              1u,
              5u,
              a3,
              v15,
              (unsigned int)(n4_7 * dword_1A210[v18]),
              3 * n2,
              n4_1,
              dst_10);
            n4_3 = n4_3b + 1; /*0x1261f*/
            v16 = v18 + 1; /*0x1262a*/
          }
        }
      }
    }
  }
}


// Function: NvdimmLogString @ 0x12644 (0x114 bytes)
// Index: 94/150

void __fastcall NvdimmLogString(char *buf, __int64 i)
{
  unsigned __int8 j; // [rsp+20h] [rbp-28h]
  char *v3; // [rsp+28h] [rbp-20h]

  if ( buf ) /*0x12653*/
  {
    v3 = &buf[*((unsigned int *)buf + 1) + 40]; /*0x12678*/
    *(_WORD *)v3 = 3; /*0x12687*/
    *((_WORD *)v3 + 1) = 2 * word_C5468 + 8; /*0x1269e*/
    for ( j = 0; j < (int)(unsigned __int16)word_C5468; ++j ) /*0x126b0*/
      *(_WORD *)&v3[2 * j + 8] = word_1F420[3 * j + 2]; /*0x126f0*/
    if ( DebugLevelEnabled() ) /*0x126f7*/
    {
      if ( *((_DWORD *)buf + 1) + (unsigned int)*((unsigned __int16 *)v3 + 1) > n98344 ) /*0x1271a*/
        DebugAssert( /*0x1272f*/
          "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c",
          0x439u,
          "(pNfit->Length + pSMBiosTbl->Length) <= mNfitSize");
    }
    *((_DWORD *)buf + 1) += *((unsigned __int16 *)v3 + 1); /*0x12750*/
  }
}


// Function: NvdimmLogExtendedData @ 0x12758 (0x60c bytes)
// Index: 95/150

void __fastcall NvdimmLogExtendedData(char *buf, __int64 n4, unsigned __int8 n0x18, __int64 n4_1)
{
  __int64 n2_2; // rdx
  unsigned __int8 i; // [rsp+30h] [rbp-118h]
  bool n2; // [rsp+31h] [rbp-117h]
  unsigned __int8 n2_1; // [rsp+32h] [rbp-116h]
  char *n2_7; // [rsp+38h] [rbp-110h]
  char Smbus; // [rsp+40h] [rbp-108h]
  __int64 Result2; // [rsp+48h] [rbp-100h]
  int p_n1727058809; // [rsp+50h] [rbp-F8h] BYREF
  __int16 v12; // [rsp+54h] [rbp-F4h]
  __int16 n16500; // [rsp+56h] [rbp-F2h]
  char v14; // [rsp+58h] [rbp-F0h]
  char n67; // [rsp+59h] [rbp-EFh]
  char n13; // [rsp+5Ah] [rbp-EEh]
  char n51; // [rsp+5Bh] [rbp-EDh]
  char n24; // [rsp+5Ch] [rbp-ECh]
  char v19; // [rsp+5Dh] [rbp-EBh]
  char v20; // [rsp+5Eh] [rbp-EAh]
  char v21; // [rsp+5Fh] [rbp-E9h]
  __int64 v22; // [rsp+60h] [rbp-E8h]
  int v23; // [rsp+68h] [rbp-E0h]
  int v24; // [rsp+6Ch] [rbp-DCh]
  int VendorDetails; // [rsp+70h] [rbp-D8h]
  unsigned __int8 dst[200]; // [rsp+80h] [rbp-C8h] BYREF
  unsigned __int8 n4a; // [rsp+158h] [rbp+10h]

  n4a = n4; /*0x12762*/
  v22 = 0; /*0x1277d*/
  n2 = 0; /*0x12786*/
  p_n1727058809 = 1727058809; /*0x1278b*/
  v12 = -19213; /*0x12798*/
  n16500 = 16500; /*0x127a2*/
  v14 = -84; /*0x127a7*/
  n67 = 67; /*0x127ac*/
  n13 = 13; /*0x127b1*/
  n51 = 51; /*0x127b6*/
  n24 = 24; /*0x127bb*/
  v19 = -73; /*0x127c0*/
  v20 = -116; /*0x127c5*/
  v21 = -37; /*0x127ca*/
  if ( buf && (unsigned __int8)n4 < 4u && n0x18 < 0x18u )
  {
    Result2 = ::dst + 5337LL * (unsigned __int8)n4 + 2956 + 19LL * n0x18 + 213; /*0x1282b*/
    if ( DebugLevelEnabled() && !Result2 ) /*0x12842*/
      DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c", 0x497u, "pSAD != ((void *) 0)"); /*0x12857*/
    if ( Result2 )
    {
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: NfitTables = 0x%X\n", (_DWORD)buf + 40);
      n2_7 = &buf[*((unsigned int *)buf + 1) + 40]; /*0x128e6*/
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: pSPARDT = 0x%X\n", (_DWORD)n2_7);
      *(_WORD *)n2_7 = 0; /*0x12931*/
      *((_QWORD *)n2_7 + 6) = 0; /*0x12939*/
      NvdimmFwWriteBlock((__int64 *)n2_7 + 2, &p_n1727058809); /*0x12952*/
      *((_QWORD *)n2_7 + 6) = 32776; /*0x1295c*/
      if ( *(_BYTE *)(Result2 + 16) ) /*0x12969*/
        *((_QWORD *)n2_7 + 6) |= 0x10000uLL; /*0x12984*/
      *((_WORD *)n2_7 + 2) = word_1A810++; /*0x12994*/
      if ( *(_BYTE *)(::dst + 37) && *(_BYTE *)(::dst + 38) == 2 ) /*0x129c6*/
      {
        n2 = *(_BYTE *)(::dst + 5337LL * n4a + 2956 + 8LL * n0x18 + 4 + 2 * n4a) == 0; /*0x12a06*/
        *((_DWORD *)n2_7 + 3) = n2 + 2 * n4a; /*0x12a29*/
      }
      else
      {
        *((_DWORD *)n2_7 + 3) = n4a; /*0x12a3b*/
      }
      *((_WORD *)n2_7 + 3) = 2; /*0x12a48*/
      *((_QWORD *)n2_7 + 4) = *(_QWORD *)n4_1; /*0x12a5c*/
      v22 = *((_QWORD *)n2_7 + 4); /*0x12a69*/
      *((_QWORD *)n2_7 + 5) = *(_QWORD *)(n4_1 + 8); /*0x12a7f*/
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: StartAddr = 0x%lx\n", *((_QWORD *)n2_7 + 4));
      if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
        DebugPrint(0x80000000, "Nfit: Size = 0x%lx\n", *((_QWORD *)n2_7 + 5));
      *((_WORD *)n2_7 + 1) = 56; /*0x12b13*/
      if ( DebugLevelEnabled() && *((_DWORD *)buf + 1) + (unsigned int)*((unsigned __int16 *)n2_7 + 1) > n98344 ) /*0x12b3d*/
        DebugAssert( /*0x12b52*/
          "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\Nfit.c",
          0x4CEu,
          "(pNfit->Length + pSPARDT->Length) <= mNfitSize");
      *((_DWORD *)buf + 1) += *((unsigned __int16 *)n2_7 + 1); /*0x12b79*/
      for ( i = 0; i < (int)*(unsigned __int8 *)(n4_1 + 18); ++i ) /*0x12b7c*/
      {
        *(_BYTE *)(n4_1 + 163LL * i + 23) = ++byte_1A300; /*0x12bca*/
        qmemcpy(dst, (const void *)(n4_1 + 163LL * i + 19), 0xA3u); /*0x12bf7*/
        NvdimmAddControlRegion(buf, dst); /*0x12c09*/
      }
      LOBYTE(n2_2) = n2; /*0x12c1b*/
      Smbus = SpdReadSmbus(n4a, n2_2, n0x18); /*0x12c2b*/
      n2_1 = NvdimmGetPageSize(n4a, n0x18); /*0x12c42*/
      v23 = (unsigned __int8)NvdimmStatusDecode(Result2); /*0x12c53*/
      v24 = NvdimmParseConfig(Result2); /*0x12c61*/
      VendorDetails = NvdimmGetVendorDetails(Result2); /*0x12c6f*/
      switch ( Smbus )
      {
        case 1:
          if ( n2_1 )
          {
            NvdimmGetHealth(buf, n2_1, (__int64)n2_7, v22, (unsigned __int8 *)n4_1); /*0x12d01*/
          }
          else if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
          {
            DebugPrint(0x80000000, "Nfit: iMCWays = 0\n");
          }
          break;
        case 2:
          NvdimmSetEvent(buf, n2_1, (__int64)n2_7, v22, n4_1); /*0x12d2b*/
          break;
        case 3:
          NvdimmGetExtendedStatus(buf, n2_1, (__int64)n2_7, v22, n4_1); /*0x12d55*/
          break;
      }
    }
  }
}


// Function: NvdimmStringLength @ 0x12d64 (0x48 bytes)
// Index: 96/150

unsigned __int64 __fastcall NvdimmStringLength(char *buf)
{
  if ( !buf ) /*0x12d73*/
    return 0x8000000000000002uLL; /*0x12d75*/
  buf[9] = SpdSetDefaults(buf, *((_DWORD *)buf + 1)); /*0x12da2*/
  return 0; /*0x12da7*/
}


// Function: NvdimmFormatMessage @ 0x12dac (0x282 bytes)
// Index: 97/150

unsigned __int64 __fastcall NvdimmFormatMessage(char *buf, __int64 n98344, __int64 j)
{
  unsigned __int64 src; // rax
  __int64 n4; // rdx
  unsigned __int8 i; // [rsp+20h] [rbp-28h]
  unsigned __int8 n0x18; // [rsp+21h] [rbp-27h]
  unsigned int n98344_1; // [rsp+58h] [rbp+10h]

  n98344_1 = n98344; /*0x12db1*/
  if ( !buf ) /*0x12dce*/
    return 0x8000000000000002uLL; /*0x12dd0*/
  byte_1A820 = 0; /*0x12ddf*/
  word_1A810 = 1; /*0x12deb*/
  word_1A9A4 = 0; /*0x12df4*/
  word_1A818 = 0; /*0x12e02*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "Nfit: main table address = 0x%p\n", buf);
  ::n98344 = n98344_1; /*0x12e56*/
  NvdimmFwUpdateSlot((__int64)buf, n98344_1); /*0x12e69*/
  *(_QWORD *)buf = 1414088270; /*0x12e73*/
  buf[8] = 1; /*0x12e8a*/
  src = BaseLibSetMem32(31); /*0x12e93*/
  NvdimmFwGetInfo((unsigned __int64)(buf + 10), src, 6u); /*0x12eaa*/
  *((_QWORD *)buf + 2) = BaseLibSetMem16(32); /*0x12ebe*/
  *((_DWORD *)buf + 6) = 2; /*0x12ec7*/
  *((_DWORD *)buf + 7) = 1280593481; /*0x12ed3*/
  *((_DWORD *)buf + 8) = 537464851; /*0x12edf*/
  for ( i = 0; i < 0x18u; ++i ) /*0x12ee6*/
  {
    if ( *(_QWORD *)(j + 1323LL * i + 8) ) /*0x12f16*/
    {
      n0x18 = *(_BYTE *)(j + 1323LL * i + 16); /*0x12f4e*/
      if ( *(_BYTE *)(dst + 5337LL * *(unsigned __int8 *)(j + 1323LL * i + 17) + 2956 + 19LL * n0x18 + 227) ) /*0x12f76*/
      {
        LOBYTE(n4) = *(_BYTE *)(j + 1323LL * i + 17); /*0x12fa1*/
        NvdimmLogExtendedData(buf, n4, n0x18, 1323LL * i + j); /*0x12faa*/
      }
    }
  }
  NvdimmLogString(buf, n4); /*0x12fb9*/
  *((_DWORD *)buf + 1) += 40; /*0x12fcf*/
  if ( DebugLevelEnabled() && DebugLevelCheck(0x80000000) )
    DebugPrint(0x80000000, "Nfit: After adding all tables, Nfit Length = 0x%X\n", *((_DWORD *)buf + 1));
  return NvdimmStringLength(buf); /*0x13029*/
}


// Function: NvdimmGetAcpiTable @ 0x13030 (0xb9 bytes)
// Index: 98/150

void *__fastcall NvdimmGetAcpiTable(__int64 a1)
{
  __int64 v2; // rdi
  unsigned int n8; // esi

  if ( *(_BYTE *)a1 != 14 ) /*0x13045*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x69u, "*TablePointer == 0x0e"); /*0x1305a*/
  v2 = HIDWORD(*(_QWORD *)(a1 + 1)); /*0x13063*/
  n8 = (unsigned int)HIDWORD(*(_QWORD *)(a1 + 1)) >> 8; /*0x13069*/
  if ( *(_BYTE *)(a1 + 9) != 14 ) /*0x13070*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x73u, "LengthPrefix == 0x0e"); /*0x13085*/
  if ( (_BYTE)v2 != 1 ) /*0x1308e*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x74u, "RegionType == 1"); /*0x130a3*/
  if ( (unsigned __int8)n8 > 8u ) /*0x130ac*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x75u, "RegionIndex <= 8"); /*0x130c1*/
  *(_QWORD *)(a1 + 1) = &unk_1A6A0; /*0x130d2*/
  *(_QWORD *)(a1 + 10) = 280; /*0x130d6*/
  return &unk_1A6A0; /*0x130e3*/
}


// Function: NvdimmPutAcpiTable @ 0x130ec (0xb9 bytes)
// Index: 99/150

void *__fastcall NvdimmPutAcpiTable(__int64 a1)
{
  __int64 n2; // rdi
  unsigned int n8; // esi

  if ( *(_BYTE *)a1 != 14 ) /*0x13101*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x96u, "*TablePointer == 0x0e"); /*0x13116*/
  n2 = HIDWORD(*(_QWORD *)(a1 + 1)); /*0x1311f*/
  n8 = (unsigned int)HIDWORD(*(_QWORD *)(a1 + 1)) >> 8; /*0x13125*/
  if ( *(_BYTE *)(a1 + 9) != 14 ) /*0x1312c*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xA0u, "LengthPrefix == 0x0e"); /*0x13141*/
  if ( (_BYTE)n2 != 2 ) /*0x1314a*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xA1u, "RegionType == 2"); /*0x1315f*/
  if ( (unsigned __int8)n8 > 8u ) /*0x13168*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xA2u, "RegionIndex <= 8"); /*0x1317d*/
  *(_QWORD *)(a1 + 1) = &unk_1A5A0; /*0x1318e*/
  *(_QWORD *)(a1 + 10) = 256; /*0x13192*/
  return &unk_1A5A0; /*0x1319f*/
}


// Function: NvdimmValidateTable @ 0x131a8 (0x104 bytes)
// Index: 100/150

__int64 __fastcall NvdimmValidateTable(unsigned __int8 **a1, char a2)
{
  unsigned int v2; // ebx
  unsigned __int8 n3; // si

  v2 = 0; /*0x131c4*/
  n3 = **a1 >> 6; /*0x131cf*/
  if ( n3 && (**a1 & 0x30) != 0 ) /*0x131de*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xC1u, "((*TablePointer)[0] & 0x30) == 0"); /*0x131f3*/
  if ( a2 && n3 != 3 ) /*0x13201*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xC4u, "ExtraBytes == 3"); /*0x13216*/
  if ( n3 ) /*0x13222*/
  {
    switch ( n3 ) /*0x13227*/
    {
      case 1u: /*0x13227*/
LABEL_13:
        v2 = **a1 & 0xF | (16 * ((*a1)[1] | v2)); /*0x13249*/
        break; /*0x1325d*/
      case 2u: /*0x13227*/
LABEL_12:
        v2 = ((*a1)[2] | v2) << 8; /*0x1323d*/
        goto LABEL_13; /*0x13246*/
      case 3u: /*0x13227*/
        v2 = (*a1)[3] << 8; /*0x1323a*/
        goto LABEL_12; /*0x1323a*/
    }
  }
  else
  {
    if ( **a1 >= 0x40u ) /*0x13265*/
      DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xD3u, "(*TablePointer)[0] < 0x40"); /*0x1327a*/
    v2 = **a1; /*0x13282*/
  }
  *a1 += n3 + 1; /*0x13285*/
  return v2; /*0x132a5*/
}


// Function: NvdimmAllocPages @ 0x132ac (0x5d bytes)
// Index: 101/150

char __fastcall NvdimmAllocPages(unsigned __int64 n0x2000000, __int64 a2)
{
  unsigned __int64 v4; // rbx
  char v5; // al
  char result; // al

  if ( n0x2000000 >= 0x2000000 ) /*0x132c3*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0xECu, "PackageLength < (1U << 25)"); /*0x132d8*/
  v4 = 8 * n0x2000000; /*0x132dd*/
  v5 = v4; /*0x132e1*/
  v4 >>= 4; /*0x132e3*/
  *(_BYTE *)(a2 + 1) = v4; /*0x132e7*/
  result = v5 & 0xF | 0xC0; /*0x132f0*/
  *(_WORD *)(a2 + 2) = (unsigned int)v4 >> 8; /*0x132f2*/
  *(_BYTE *)a2 = result; /*0x13301*/
  return result; /*0x13303*/
}


// Function: NvdimmAllocNfitSpace @ 0x1330c (0x1a2 bytes)
// Index: 102/150

unsigned __int8 __fastcall NvdimmAllocNfitSpace(
        _BYTE *a1,
        int a2,
        unsigned __int64 n0x2000000,
        unsigned int a4,
        int a5,
        int a6)
{
  unsigned __int8 *v10; // rbx
  unsigned __int8 n67; // al
  unsigned __int8 n84; // al
  unsigned __int8 *v13; // rbx
  unsigned __int8 result; // al
  unsigned __int8 v15; // si
  int v16; // edi
  unsigned __int8 *v17; // rbx
  unsigned __int8 *v18; // rbx
  unsigned __int8 *v19; // [rsp+40h] [rbp+8h] BYREF

  if ( *(_WORD *)a1 != 0x815B ) /*0x13333*/
    DebugAssert( /*0x1334a*/
      "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c",
      0x11Au,
      "TablePointer[0] == 0x5b && TablePointer[1] == 0x81");
  v19 = a1 + 2; /*0x1335a*/
  NvdimmValidateTable(&v19, 0); /*0x1335f*/
  v10 = v19; /*0x13364*/
  if ( *v19 != 67 || (n67 = v19[1], n67 != 67) && n67 != 70 || (n84 = v19[2], n84 != 84) && n84 != 72 || v19[3] != 56 ) /*0x13388*/
    DebugAssert( /*0x13399*/
      "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c",
      0x121u,
      "RegionNamePointer[0] == 'C' && (RegionNamePointer[1] == 'C' || RegionNamePointer[1] == 'F') && (RegionNamePointer["
      "2] == 'T' || RegionNamePointer[2] == 'H') && RegionNamePointer[3] == '8'");
  if ( v10[5] ) /*0x1339e*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x123u, "TablePointer[0] == 0x00"); /*0x133b3*/
  v13 = v10 + 6; /*0x133b8*/
  v19 = v13; /*0x133c3*/
  if ( (unsigned int)NvdimmValidateTable(&v19, 1) >> 15 != a2 ) /*0x133d5*/
    DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x128u, "(OffsetDelta >> 12) == Magic"); /*0x133e6*/
  result = NvdimmAllocPages(n0x2000000, (__int64)v13); /*0x133f1*/
  v15 = 1; /*0x133f6*/
  if ( a4 > 1 ) /*0x133fc*/
  {
    v16 = a6 & a5; /*0x13406*/
    do /*0x13495*/
    {
      v17 = v19; /*0x1340a*/
      if ( (a6 & *(_DWORD *)v19) != v16 || v19[4] != 64 || v19[5] != 4 ) /*0x13423*/
        DebugAssert( /*0x13434*/
          "e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c",
          0x12Du,
          "(*NamePtr & RegNameMask) == (RegName & RegNameMask) && TablePointer[4] == 0x40 && TablePointer[5] == 0x04");
      if ( v17[5] ) /*0x13439*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x12Fu, "TablePointer[0] == 0x00"); /*0x1344e*/
      v18 = v17 + 6; /*0x13453*/
      v19 = v18; /*0x1345e*/
      if ( (unsigned int)NvdimmValidateTable(&v19, 1) >> 3 != 1048568 ) /*0x13470*/
        DebugAssert("e:\\hs\\PurleySktPkg\\Dxe\\JedecNvDimm\\NvdimmAcpiConfig.c", 0x134u, "OffsetDelta == 0xFFFF8"); /*0x13481*/
      ++v15; /*0x13486*/
      *(_DWORD *)v18 = 192; /*0x13489*/
      result = v15; /*0x1348f*/
    }
    while ( v15 < a4 ); /*0x13495*/
  }
  return result; /*0x134a5*/
}


// Function: NvdimmGetSocketCount @ 0x134b0 (0x26 bytes)
// Index: 103/150

unsigned __int8 __fastcall NvdimmGetSocketCount(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 384, 0, 1u, 0, 0); /*0x134d1*/
}


// Function: NvdimmGetChannelCount @ 0x134d8 (0x27 bytes)
// Index: 104/150

unsigned __int8 __fastcall NvdimmGetChannelCount(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 385, 8u, 1u, 0, 0); /*0x134fa*/
}


// Function: NvdimmGetDimmPerCh @ 0x13500 (0x2d bytes)
// Index: 105/150

unsigned __int8 __fastcall NvdimmGetDimmPerCh(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 426, 0x10u, 0x20u, 1482182217, 0xFFFF); /*0x13528*/
}


// Function: NvdimmGetSubChPerDimm @ 0x13530 (0x2d bytes)
// Index: 106/150

unsigned __int8 __fastcall NvdimmGetSubChPerDimm(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 443, 0x90u, 0x20u, 1482184015, 0xFFFF); /*0x13558*/
}


// Function: NvdimmGetDomainPerCh @ 0x13560 (0x27 bytes)
// Index: 107/150

unsigned __int8 __fastcall NvdimmGetDomainPerCh(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 386, 0x110u, 1u, 0, 0); /*0x13582*/
}


// Function: NvdimmPlatformNullSub @ 0x13588 (0x3 bytes)
// Index: 108/150

// (too small: 0x3 bytes)


// Function: NvdimmPlatformNull @ 0x1358c (0x2c bytes)
// Index: 109/150

unsigned __int8 __fastcall NvdimmPlatformNull(_BYTE *a1)
{
  return NvdimmAllocNfitSpace(a1, 387, 0, 0x20u, 1482181702, 0xFFFF); /*0x135b3*/
}


// Function: AcpiOpenDevice @ 0x135b8 (0xab bytes)
// Index: 110/150

__int64 __fastcall AcpiOpenDevice(EFI_HANDLE *p_ImageHandle)
{
  psub_13030 = (__int64)NvdimmGetAcpiTable; /*0x135c2*/
  psub_130EC = (__int64)NvdimmPutAcpiTable; /*0x135d7*/
  psub_134B0 = (__int64)NvdimmGetSocketCount; /*0x135ec*/
  psub_134D8 = (__int64)NvdimmGetChannelCount; /*0x135fa*/
  psub_13500 = (__int64)NvdimmGetDimmPerCh; /*0x13608*/
  psub_13530 = (__int64)NvdimmGetSubChPerDimm; /*0x13616*/
  psub_13560 = (__int64)NvdimmGetDomainPerCh; /*0x13624*/
  nullsub = (__int64)NvdimmPlatformNullSub; /*0x13632*/
  nullsub_0 = (__int64)NvdimmPlatformNullSub; /*0x13640*/
  psub_1358C = (__int64)NvdimmPlatformNull; /*0x1364e*/
  return (*(__int64 (__fastcall **)(EFI_HANDLE *, void *, _QWORD, __int64 *))(BootServices + 128))(
           p_ImageHandle,
           &unk_190C0,
           0,
           &psub_13030);
}


// Function: NvdimmCrcCalc @ 0x13664 (0x1d4 bytes)
// Index: 111/150

unsigned __int64 __fastcall NvdimmCrcCalc(__int64 *buf, __int64 a2)
{
  char v2; // bp
  __int64 *buf_1; // r12
  char v4; // si
  char buf_2; // r14
  __int64 v6; // r15
  char v7; // al
  __int64 v8; // rdx
  char v9; // bl
  __int64 v10; // rcx
  unsigned int v11; // eax
  char v12; // r13
  unsigned int v13; // edi
  __int64 v14; // rcx
  int v15; // eax
  __int64 v16; // rdx
  unsigned __int16 v17; // ax
  __int64 v19; // rsi
  unsigned __int64 v20; // rsi
  unsigned __int64 v21; // rbx
  unsigned __int8 v22; // [rsp+60h] [rbp+8h]
  unsigned __int8 v23; // [rsp+68h] [rbp+10h]

  v2 = *((_BYTE *)buf + 104); /*0x13678*/
  buf_1 = buf; /*0x1367c*/
  v4 = *((_BYTE *)buf + 57); /*0x1367f*/
  v6 = *buf; /*0x1368e*/
  LOBYTE(buf) = *((_BYTE *)buf + 32); /*0x1369f*/
  buf_2 = (char)buf; /*0x13686*/
  LOBYTE(a2) = v4 + 3 * (v2 & 1); /*0x136ac*/
  v7 = (*(__int64 (__fastcall **)(__int64 *, __int64, __int64))(qword_C5470 + 8))(buf, a2, 117522564); /*0x136af*/
  LOBYTE(v8) = v4 + 3 * (v2 & 1); /*0x136b8*/
  v9 = v7; /*0x136bb*/
  LOBYTE(v10) = buf_2; /*0x136bd*/
  v11 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 8))(v10, v8, 117522568); /*0x136c7*/
  v12 = v11 & 1; /*0x136e1*/
  v13 = (v11 >> 2) & 3; /*0x136e5*/
  v14 = v13; /*0x136ed*/
  v22 = 1 << (v11 & 1); /*0x136ef*/
  LOBYTE(v14) = buf_2; /*0x136fa*/
  v23 = 1 << ((v11 >> 2) & 3); /*0x136fd*/
  v15 = v2 & 1; /*0x13701*/
  v16 = (unsigned int)(2 * v15); /*0x13704*/
  LOBYTE(v16) = v4 + 3 * v15; /*0x13711*/
  v17 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 8))(v14, v16, 117522576); /*0x13714*/
  if ( (v9 & 0xF) != 0 ) /*0x13724*/
  {
    switch ( v9 & 0xF ) /*0x1372d*/
    {
      case 1: /*0x1372d*/
        v19 = 0x200000000LL; /*0x137a4*/
        break;
      case 2: /*0x1372d*/
        v19 = 0x400000000LL; /*0x13798*/
        break;
      case 3: /*0x1372d*/
        v19 = 0x800000000LL; /*0x1378c*/
        break;
      case 4: /*0x1372d*/
        v19 = 0x1000000000LL; /*0x13780*/
        break;
      case 5: /*0x1372d*/
        v19 = 0x2000000000LL; /*0x13774*/
        break;
      case 6: /*0x1372d*/
        v19 = 0x4000000000LL; /*0x13768*/
        break;
      case 7: /*0x1372d*/
        v19 = 0x8000000000LL; /*0x1375c*/
        break;
      default:
        return 0x8000000000000002uLL; /*0x13757*/
    }
  }
  else
  {
    v19 = 0x100000000LL; /*0x137b0*/
  }
  v20 = (v6 - ((unsigned __int64)v17 << 32)) & ((v19 << ((unsigned __int8)v13 + v12)) - 1); /*0x137c9*/
  v21 = (((v20 >> 8) / v22) << 8) | BaseLibCopyMem(v20, 0, 7u); /*0x137f2*/
  buf_1[6] = (((v21 >> 12) / v23) << 12) | BaseLibCopyMem(v21, 0, 0xBu); /*0x1381c*/
  return 0; /*0x13828*/
}


// Function: ThermalInit @ 0x13838 (0x43c bytes)
// Index: 112/150

unsigned __int64 __fastcall ThermalInit(char *buf, __int64 a2)
{
  __int16 v2; // ax
  unsigned __int8 v3; // r12
  unsigned __int64 v5; // rdi
  char v6; // r13
  char v7; // r15
  unsigned __int64 v8; // rsi
  unsigned __int8 n4; // bl
  char v10; // r13
  unsigned int v11; // eax
  __int64 v12; // rcx
  unsigned __int64 v13; // r15
  unsigned __int8 v14; // r14
  char v15; // al
  unsigned int v16; // esi
  unsigned __int64 v17; // rtt
  unsigned __int64 v18; // rdi
  unsigned __int64 v19; // r14
  __int64 v20; // rdx
  __int64 v21; // r8
  int v22; // eax
  unsigned __int64 v23; // rcx
  unsigned __int8 v24; // bl
  unsigned __int64 v25; // rax
  char v26; // di
  __int64 v27; // rdx
  unsigned int v28; // eax
  char v29; // r14
  unsigned __int64 v30; // r14
  char n9; // cl
  bool v32; // zf
  __int64 v34; // [rsp+20h] [rbp-58h]
  char n4_1; // [rsp+80h] [rbp+8h]
  char v36; // [rsp+88h] [rbp+10h]
  char v37; // [rsp+90h] [rbp+18h]
  char v38; // [rsp+98h] [rbp+20h]

  v2 = *((_WORD *)buf + 54); /*0x13849*/
  *((_QWORD *)buf + 8) = -1; /*0x13854*/
  v3 = 0; /*0x13859*/
  LOBYTE(a2) = buf[104]; /*0x1385c*/
  v5 = *((_QWORD *)buf + 5); /*0x13862*/
  v6 = 0; /*0x13866*/
  v7 = buf[56]; /*0x13869*/
  v8 = 0; /*0x1386d*/
  v38 = a2; /*0x13875*/
  v34 = v5; /*0x13880*/
  v37 = v7; /*0x13885*/
  buf[80] = -1; /*0x1388d*/
  buf[82] = -1; /*0x13891*/
  buf[84] = -1; /*0x13895*/
  v36 = 0; /*0x13899*/
  if ( (unsigned __int16)(v2 - 1) <= 1u )
  {
    if ( *((_WORD *)buf + 54) == 2 ) /*0x138b0*/
    {
      v5 = *((_QWORD *)buf + 6); /*0x138b2*/
      v7 = buf[57]; /*0x138b6*/
      v34 = v5; /*0x138ba*/
      v37 = v7; /*0x138bf*/
    }
    n4 = 0; /*0x138c7*/
    n4_1 = 0; /*0x138ca*/
    while ( v6 != 1 )
    {
      v10 = v7 + 3 * (a2 & 1); /*0x138ff*/
      LOBYTE(a2) = v10; /*0x13905*/
      v11 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(qword_C5470 + 8))( /*0x13908*/
              (unsigned __int8)buf[32],
              a2,
              (unsigned int)dword_17FB0[n4]);
      if ( v11 >= 0x80000000 )
      {
        a2 = 1; /*0x13919*/
        v13 = ((unsigned __int64)((v11 >> 1) & 0x7FF) << 29) + 0x1FFFFFFF; /*0x13937*/
        v14 = 1 << ((v11 >> 28) & 3); /*0x1393e*/
        if ( !v8 && !v5 || v8 < v5 && v5 <= v13 )
        {
          LOBYTE(v12) = buf[32]; /*0x1396a*/
          v36 = 1; /*0x1396d*/
          LOBYTE(a2) = buf[35]; /*0x13974*/
          v15 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v12, a2, 117459068); /*0x13977*/
          v16 = (v15 & 1) != 0 ? 0xFFFFFFF9 : 0;
          v17 = v5 >> ((v15 & 1) != 0 ? 6 : 13);
          v18 = v17 % v14; /*0x1399e*/
          v19 = ((v17 / v14) << ((unsigned __int8)v16 + 13)) | BaseLibCopyMem(v34, 0, v16 + 12); /*0x139cb*/
          v20 = (unsigned __int8)v18 + 8LL * n4; /*0x139ce*/
          v21 = (unsigned int)dword_17E30[v20]; /*0x139d5*/
          LOBYTE(v20) = v10; /*0x139dd*/
          v22 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64))(qword_C5470 + 8))( /*0x139e0*/
                  (unsigned __int8)buf[32],
                  v20,
                  v21);
          v23 = (unsigned __int64)((unsigned __int16)v22 & 0xFFFC) << 24; /*0x139f1*/
          v24 = BYTE2(v22) & 0xF; /*0x139f5*/
          v25 = v19 - v23; /*0x139fe*/
          v26 = v24 >> 2; /*0x13a01*/
          LOBYTE(v23) = buf[32]; /*0x13a05*/
          LOBYTE(v27) = v10; /*0x13a08*/
          *((_QWORD *)buf + 8) = v25; /*0x13a0b*/
          v28 = (*(__int64 (__fastcall **)(unsigned __int64, __int64, _QWORD))(qword_C5470 + 8))( /*0x13a22*/
                  v23,
                  v27,
                  (unsigned int)dword_18050[v24 >> 2]);
          if ( (v28 & 0x1800000) != 0 ) /*0x13a2a*/
          {
            a2 = 1; /*0x13a3b*/
            buf[80] = (v24 - 1) % 4; /*0x13a51*/
            v30 = v19 >> (((v28 >> 2) & 7) + 30); /*0x13a62*/
            if ( ((v28 >> 12) & 3) != 0 ) /*0x13a67*/
              LOBYTE(v30) = v24 + 2 * v30 - 1; /*0x13a6f*/
            v29 = 8 * v26 + v30; /*0x13a78*/
          }
          else
          {
            v29 = v24; /*0x13a2e*/
            buf[80] = v24 & 3; /*0x13a33*/
          }
          n9 = buf[80]; /*0x13a7b*/
          if ( (unsigned __int8)n9 > 9u ) /*0x13a81*/
            return 0x8000000000000002uLL; /*0x13a81*/
          v32 = *((_WORD *)buf + 54) == 2; /*0x13a87*/
          buf[82] = v26; /*0x13a8c*/
          buf[84] = v29; /*0x13a90*/
          buf[102] = v24; /*0x13a94*/
          if ( v32 ) /*0x13a97*/
          {
            *((_QWORD *)buf + 9) = *((_QWORD *)buf + 8); /*0x13a9d*/
            buf[81] = n9; /*0x13aa1*/
            buf[83] = v26; /*0x13aa4*/
            buf[103] = v24; /*0x13aa8*/
          }
          n4 = n4_1; /*0x13aab*/
          v5 = v34; /*0x13ab2*/
        }
        v8 = v13; /*0x13ab7*/
        v7 = v37; /*0x13aba*/
      }
      v6 = v36; /*0x13ac2*/
      LOBYTE(a2) = v38; /*0x13ad1*/
      n4_1 = ++n4; /*0x13ae1*/
      if ( n4 >= 4u ) /*0x13aeb*/
        break; /*0x13aeb*/
    }
  }
  if ( *((_WORD *)buf + 54) != 1 ) /*0x13af6*/
  {
    while ( v6 != 1 ) /*0x13aff*/
    {
      LOBYTE(a2) = v7 + 3 * (a2 & 1); /*0x13b34*/
      (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(qword_C5470 + 8))( /*0x13b37*/
        (unsigned __int8)buf[32],
        a2,
        (unsigned int)dword_18020[v3]);
      LOBYTE(a2) = v38; /*0x13c36*/
      if ( ++v3 >= 4u ) /*0x13c4a*/
        goto LABEL_25; /*0x13c4a*/
    }
    return 0; /*0x13aff*/
  }
LABEL_25:
  if ( v6 == 1 ) /*0x13c53*/
    return 0; /*0x13c57*/
  return 0x8000000000000002uLL; /*0x13c63*/
}


// Function: ThermalReadSensors @ 0x13c74 (0x345 bytes)
// Index: 113/150

unsigned __int64 __fastcall ThermalReadSensors(char *buf, __int64 a2)
{
  char v2; // r9
  char *buf_1; // r13
  char v4; // di
  char v5; // r14
  unsigned __int64 v6; // rbp
  char v7; // si
  char v8; // r12
  __int64 v9; // rdx
  __int64 v10; // rcx
  unsigned int v11; // eax
  __int64 v12; // rdx
  __int64 v13; // rcx
  __int64 v14; // r15
  int v15; // ebx
  __int64 v16; // rdx
  __int64 v17; // rcx
  __int64 v18; // rcx
  unsigned int v19; // edi
  unsigned __int64 v20; // rax
  __int64 v21; // rdx
  unsigned int v22; // ebx
  __int64 v23; // r14
  __int64 v24; // r14
  unsigned __int8 v25; // r12
  unsigned int v26; // edi
  unsigned __int8 v27; // di
  unsigned __int8 n12; // r15
  unsigned __int8 n8; // al
  unsigned __int64 v30; // rbp
  UINT64 v31; // rax
  unsigned __int64 v32; // r9
  __int64 v34; // rdx
  int n8_1; // [rsp+60h] [rbp+8h]
  char v36; // [rsp+68h] [rbp+10h]

  v2 = buf[33]; /*0x13c88*/
  buf_1 = buf; /*0x13c8d*/
  *((_QWORD *)buf + 5) = -1; /*0x13c90*/
  v4 = buf[35]; /*0x13c99*/
  v5 = buf[32]; /*0x13ca2*/
  v6 = *(_QWORD *)buf; /*0x13ca9*/
  LOBYTE(a2) = v4; /*0x13cac*/
  v7 = buf[104]; /*0x13caf*/
  v8 = buf[56]; /*0x13cb3*/
  buf[34] = -1; /*0x13cb7*/
  LOBYTE(buf) = v5; /*0x13cbb*/
  (*(void (__fastcall **)(char *, __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x13ccd*/
    buf,
    a2,
    100679848,
    (4 * (v2 & 0x1F)) | 2u);
  LOBYTE(v9) = v4; /*0x13cda*/
  LOBYTE(v10) = v5; /*0x13cdd*/
  v11 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v10, v9, 100679848); /*0x13ce0*/
  LOBYTE(v12) = v4; /*0x13cea*/
  LOBYTE(v13) = v5; /*0x13cf0*/
  LOBYTE(v11) = (v11 >> 14) & 0x1F; /*0x13cf3*/
  v14 = (unsigned __int8)v11; /*0x13cf5*/
  v36 = v11; /*0x13cf9*/
  v15 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 40))( /*0x13d10*/
          v13,
          v12,
          (unsigned int)dword_18030[(unsigned __int8)v11]);
  LOBYTE(v16) = v4; /*0x13d12*/
  LOBYTE(v17) = v5; /*0x13d1c*/
  v19 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 40))( /*0x13d31*/
          v17,
          v16,
          (unsigned int)dword_17F90[v14]);
  if ( (unsigned __int64)(v15 & 0xFFFFF000) << 14 > v6
    || (v20 = ((unsigned __int64)v19 >> 12 << 26) + 0x3FFFFFF, v6 > v20) )
  {
    DebugPrint(0x80000000, "\nTranslateTAD: SystemAddress doesn't fall into the obtained TADID \n");
    return 0x8000000000000002uLL; /*0x13f95*/
  }
  LOBYTE(v18) = v5; /*0x13d65*/
  LOBYTE(v20) = v7 & 1; /*0x13d68*/
  v21 = (unsigned int)(2 * v20); /*0x13d6b*/
  LOBYTE(v21) = v8 + 3 * (v7 & 1); /*0x13d80*/
  v22 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 8))( /*0x13da5*/
          v18,
          v21,
          (unsigned int)dword_17F10[v14]);
  v23 = (unsigned __int64)(v22 & 0xFFFFF0) << 22; /*0x13da7*/
  DebugPrint(0x80000000, "\nTranslateTAD: (chOffset shl SAD_UNIT): %lx", (v22 & 0xFFFFF0) << 22);
  if ( (v23 & 0x200000000000LL) != 0 )
  {
    v24 = v23 - 0x400000000000LL; /*0x13dd3*/
    DebugPrint(0x80000000, "\nTranslateTAD: (chOffset - 1 shl 46) %lx", v24);
    v23 = v24 & 0x3FFFFFFFFFFLL; /*0x13dea*/
  }
  if ( *((_WORD *)buf_1 + 54) == 2 ) /*0x13df7*/
  {
    v25 = 1 << (v22 & 3); /*0x13e08*/
    v26 = v22 >> 2; /*0x13e0b*/
  }
  else
  {
    v25 = 1 << ((v19 >> 10) & 3); /*0x13e1f*/
    v26 = v19 >> 8; /*0x13e22*/
  }
  v27 = (v26 & 3) + 1; /*0x13e2b*/
  n12 = 12; /*0x13e31*/
  if ( ((v22 >> 27) & 3) != 0 ) /*0x13e37*/
  {
    switch ( (v22 >> 27) & 3 ) /*0x13e3c*/
    {
      case 1u: /*0x13e3c*/
        n8 = 8; /*0x13e55*/
        break;
      case 2u: /*0x13e3c*/
        n8 = 12; /*0x13e50*/
        break;
      case 3u: /*0x13e3c*/
        n8 = 30; /*0x13e4c*/
        break;
      default:
        return 0x8000000000000002uLL; /*0x13e46*/
    }
  }
  else
  {
    n8 = 6; /*0x13e59*/
  }
  n8_1 = n8; /*0x13e68*/
  DebugPrint(0x80000000, "\nTranslateTAD: SktInterleaveBit: %d", n8);
  if ( ((v22 >> 29) & 3) != 0 ) /*0x13e7c*/
  {
    if ( ((v22 >> 29) & 3) == 1 ) /*0x13e81*/
    {
      n12 = 8; /*0x13e8d*/
    }
    else if ( ((v22 >> 29) & 3) != 2 ) /*0x13e86*/
    {
      return 0x8000000000000002uLL; /*0x13e86*/
    }
  }
  else
  {
    n12 = 6; /*0x13e92*/
  }
  DebugPrint(0x80000000, "\nTranslateTAD: chInterleaveBit: %d", n12);
  if ( v22 >= 0x80000000 ) /*0x13ead*/
    v30 = v23 + v6; /*0x13eb4*/
  else
    v30 = v6 - v23; /*0x13eaf*/
  DebugPrint(0x80000000, "\nTranslateTAD: CoreAddr %lx", v30);
  v31 = BaseLibCopyMem(v30, 0, n12 - 1); /*0x13ed5*/
  v32 = (((((((v30 >> n12) / v27) << n12) | v31) >> n8_1) / v25) << n8_1) /*0x13f2a*/
      | BaseLibCopyMem((((v30 >> n12) / v27) << n12) | v31, 0, n8_1 - 1);
  *((_QWORD *)buf_1 + 5) = v32; /*0x13f34*/
  buf_1[34] = v36; /*0x13f3c*/
  DebugPrint(0x80000000, "\nTranslateTAD: channelAddress: %x:%x", HIDWORD(v32), v32);
  if ( *((_WORD *)buf_1 + 54) != 2 ) /*0x13f52*/
  {
    DebugPrint(0x80000000, "\nTranslateTAD Successfully completed for PMEM/BMEM\n"); /*0x13f5b*/
    return 0; /*0x13f62*/
  }
  DebugPrint(0x80000000, "\nCalculate NM Channel Address now\n"); /*0x13f6b*/
  if ( !NvdimmCrcCalc((__int64 *)buf_1, v34) ) /*0x13f73*/
  {
    DebugPrint(0x80000000, "\nTranslateTAD Successfully completed for 2LM\n"); /*0x13f87*/
    return 0; /*0x13f87*/
  }
  return 0x8000000000000002uLL; /*0x13fa9*/
}


// Function: ThermalProcessData @ 0x13fbc (0x41e bytes)
// Index: 114/150

unsigned __int64 __fastcall ThermalProcessData(char *buf, __int64 a2)
{
  char v3; // al
  unsigned __int8 v4; // bp
  char v5; // r15
  char v6; // al
  unsigned __int64 v7; // rbx
  char v8; // r12
  unsigned __int8 n8_2; // si
  __int64 v10; // rdx
  __int64 n8_3; // rcx
  unsigned int v12; // eax
  __int64 v13; // rdx
  unsigned __int64 v14; // r13
  unsigned int v15; // edi
  char v16; // si
  unsigned int v17; // eax
  __int64 v18; // rdx
  unsigned int v19; // ebx
  __int64 v20; // rcx
  __int16 v21; // ax
  __int64 v22; // rdx
  __int64 v23; // rcx
  char v24; // si
  char v25; // al
  char v26; // al
  __int64 v27; // rdx
  __int64 v28; // rcx
  unsigned int v29; // eax
  char v30; // cl
  unsigned int v31; // r15d
  unsigned int v32; // eax
  unsigned __int64 v33; // rdx
  unsigned __int64 v34; // rcx
  unsigned __int64 v35; // rbx
  UINT64 v36; // rbp
  unsigned __int64 v37; // rdi
  bool v39; // cf
  char n8_5; // [rsp+20h] [rbp-68h]
  char v41; // [rsp+21h] [rbp-67h]
  unsigned __int8 v42; // [rsp+22h] [rbp-66h]
  int v43; // [rsp+28h] [rbp-60h]
  __int64 n8_4; // [rsp+30h] [rbp-58h]
  unsigned __int64 v45; // [rsp+38h] [rbp-50h]
  unsigned __int8 n8; // [rsp+90h] [rbp+8h]
  unsigned __int8 n8_1; // [rsp+98h] [rbp+10h]
  char v48; // [rsp+A0h] [rbp+18h]
  unsigned __int8 v49; // [rsp+A8h] [rbp+20h]

  n8 = 0; /*0x13fd0*/
  v45 = *(_QWORD *)buf; /*0x13fdb*/
  n8_1 = 0; /*0x13fe5*/
  v3 = buf[104]; /*0x13fed*/
  *((_QWORD *)buf + 5) = -1; /*0x13ff1*/
  v4 = buf[32]; /*0x13ff6*/
  v5 = buf[56]; /*0x13ffa*/
  v41 = v3; /*0x13ffe*/
  v6 = buf[35]; /*0x14002*/
  v48 = v6; /*0x14006*/
  v42 = v4; /*0x1400d*/
  buf[34] = -1; /*0x14012*/
  if ( *((_WORD *)buf + 54) != 1 ) /*0x1401c*/
  {
    v39 = ThermalReadSensors(buf, a2) != 0; /*0x143b6*/
    return -(__int64)v39 & 0x8000000000000002uLL; /*0x143b6*/
  }
  v7 = 0; /*0x14022*/
  v8 = 0; /*0x14024*/
  n8_2 = 0; /*0x14027*/
  v49 = 0; /*0x1402a*/
  n8_5 = 0; /*0x14031*/
  while ( 1 ) /*0x14036*/
  {
    v10 = 0; /*0x14036*/
    if ( v8 == 1 ) /*0x14040*/
      break; /*0x14040*/
    n8_3 = n8_2; /*0x14046*/
    n8_4 = n8_2; /*0x1404a*/
    LOBYTE(v10) = v6; /*0x14057*/
    LOBYTE(n8_3) = v4; /*0x14060*/
    v12 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 40))( /*0x14063*/
            n8_3,
            v10,
            (unsigned int)dword_17F90[n8_2]);
    v14 = ((unsigned __int64)v12 >> 12 << 26) + 0x3FFFFFF; /*0x14071*/
    v15 = v12; /*0x14078*/
    if ( n8_2 ) /*0x1407d*/
    {
      if ( v7 == v14 ) /*0x14082*/
        break; /*0x14082*/
    }
    if ( (v7 || v45) && (v7 >= v45 || v45 > v14) ) /*0x140a3*/
      goto LABEL_47; /*0x140a3*/
    v16 = v48; /*0x140b5*/
    v8 = 1; /*0x140bd*/
    LOBYTE(v13) = v48; /*0x140c0*/
    v17 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(qword_C5470 + 40))( /*0x140d5*/
            v4,
            v13,
            (unsigned int)dword_18030[n8_4]);
    LOBYTE(v18) = v48; /*0x140de*/
    v19 = v17; /*0x140e1*/
    LOBYTE(v20) = v4; /*0x140e3*/
    v21 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v20, v18, 100679808); /*0x140ed*/
    v23 = v19 & 8; /*0x140f2*/
    v43 = v19 & 8; /*0x140f5*/
    if ( (v19 & 8) != 0 || (v21 & 0x200) != 0 ) /*0x140ff*/
    {
      if ( (unsigned __int8)n3 < 3u ) /*0x1410c*/
      {
        v24 = 0; /*0x1410e*/
        while ( 1 ) /*0x1411d*/
        {
          LOBYTE(v22) = v48; /*0x1411d*/
          v25 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(qword_C5470 + 40))( /*0x14136*/
                  v4,
                  v22,
                  (unsigned int)dword_18030[n8_4]);
          if ( v24 ) /*0x1413c*/
          {
            if ( (v25 & 8) != 0 ) /*0x14140*/
              return 0x8000000000000003uLL; /*0x1439f*/
          }
          if ( (unsigned __int8)++v24 >= 8u ) /*0x1414d*/
          {
            v16 = v48; /*0x1414f*/
            break; /*0x1414f*/
          }
        }
      }
      LOBYTE(v22) = v16; /*0x14164*/
      LOBYTE(v23) = v4; /*0x14167*/
      v26 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v23, v22, 100679924); /*0x1416a*/
      v28 = (unsigned __int8)buf[56]; /*0x1416d*/
      if ( (((v26 & 7u) >> v28) & 1) != 0 ) /*0x14179*/
      {
        if ( ((v19 >> 10) & 3) != (_DWORD)v28 ) /*0x14183*/
          return 0x8000000000000003uLL; /*0x14183*/
        LOBYTE(v27) = v16; /*0x14196*/
        LOBYTE(v28) = v4; /*0x14199*/
        v29 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v28, v27, 100679920); /*0x1419c*/
        v30 = buf[56]; /*0x1419f*/
        switch ( v30 ) /*0x141a5*/
        {
          case 0: /*0x141a5*/
            LOBYTE(v31) = v29; /*0x141a7*/
            goto LABEL_24; /*0x141aa*/
          case 1: /*0x141a5*/
            v31 = v29 >> 2; /*0x141b4*/
LABEL_24:
            v5 = v31 & 3; /*0x141b8*/
            break;
          case 2: /*0x141a5*/
            v5 = (v29 >> 4) & 3; /*0x141c8*/
            break;
        }
        v49 = 1; /*0x141cb*/
      }
    }
    v32 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD))(qword_C5470 + 8))( /*0x141d3*/
            v4,
            (unsigned __int8)(v5 + 3 * (v41 & 1)),
            (unsigned int)dword_180E0[n8_4]);
    if ( ((v32 >> 27) & 3) != 0 ) /*0x14229*/
    {
      switch ( (v32 >> 27) & 3 ) /*0x1422e*/
      {
        case 1u: /*0x1422e*/
          n8 = 8; /*0x1424e*/
          break;
        case 2u: /*0x1422e*/
          n8 = 12; /*0x14244*/
          break;
        case 3u: /*0x1422e*/
          n8 = 30; /*0x1423a*/
          break;
      }
    }
    else
    {
      n8 = 6; /*0x14258*/
    }
    if ( ((v32 >> 29) & 3) != 0 ) /*0x14268*/
    {
      if ( ((v32 >> 29) & 3) == 1 ) /*0x1426d*/
      {
        n8_1 = 8; /*0x1427e*/
      }
      else if ( ((v32 >> 29) & 3) == 2 ) /*0x14272*/
      {
        n8_1 = 12; /*0x14274*/
      }
    }
    else
    {
      n8_1 = 6; /*0x14288*/
    }
    v33 = (unsigned __int64)(v32 & 0xFFFFF0) << 22; /*0x142a5*/
    v34 = v33 - 0x400000000000LL; /*0x142c0*/
    if ( (v33 & 0x200000000000LL) == 0 ) /*0x142c4*/
      v34 = (unsigned __int64)(v32 & 0xFFFFF0) << 22; /*0x142c4*/
    v35 = v45 - v34; /*0x142cb*/
    v36 = BaseLibCopyMem(v45 - v34, 0, n8_1 - 1); /*0x142db*/
    v37 = (((((((v35 >> n8_1) / (unsigned __int8)((BYTE1(v15) & 3) + 1)) << n8_1) | v36) >> n8) /*0x14326*/
          / (unsigned __int8)(1 << ((v15 >> 10) & 3))) << n8)
        | BaseLibCopyMem((((v35 >> n8_1) / (unsigned __int8)((BYTE1(v15) & 3) + 1)) << n8_1) | v36, 0, n8 - 1);
    if ( v43 ) /*0x1432e*/
      v37 = (2 * (v37 & 0xFFFFFFFFFFFC0000uLL | ((unsigned __int64)v49 << 17))) | BaseLibCopyMem(v37, 0, 0x11u); /*0x1435a*/
    n8_2 = n8_5; /*0x1435d*/
    v4 = v42; /*0x14362*/
    buf[34] = n8_5; /*0x14367*/
    *((_QWORD *)buf + 5) = v37; /*0x1436b*/
    buf[56] = v5; /*0x1436f*/
LABEL_47:
    v7 = v14; /*0x14373*/
    n8_5 = ++n8_2; /*0x1437e*/
    if ( n8_2 >= 8u ) /*0x14387*/
      break; /*0x14387*/
    v6 = v48; /*0x14389*/
  }
  v39 = v8 != 1; /*0x143a6*/
  return -(__int64)v39 & 0x8000000000000002uLL; /*0x143c9*/
}


// Function: PmicGetHealthStatus @ 0x143dc (0x87 bytes)
// Index: 115/150

unsigned __int64 __fastcall PmicGetHealthStatus(unsigned int a1, unsigned __int8 a2, unsigned __int8 n4, _BYTE *a4)
{
  unsigned __int64 v4; // r11
  char v5; // r10
  int v7; // edx
  int v8; // edx
  int v9; // edx
  int v10; // edx
  int v11; // edx
  int v12; // edx

  v4 = 0; /*0x143dc*/
  v5 = 0; /*0x143df*/
  if ( n4 >= 4u ) /*0x143e6*/
    return 0x8000000000000002uLL; /*0x143f2*/
  if ( a2 ) /*0x143f8*/
  {
    v7 = a2 - 1; /*0x143fa*/
    if ( v7 ) /*0x143fd*/
    {
      v8 = v7 - 1; /*0x143ff*/
      if ( v8 ) /*0x14402*/
      {
        v9 = v8 - 1; /*0x14404*/
        if ( v9 ) /*0x14407*/
        {
          v10 = v9 - 1; /*0x14409*/
          if ( v10 ) /*0x1440c*/
          {
            v11 = v10 - 1; /*0x1440e*/
            if ( v11 ) /*0x14411*/
            {
              v12 = v11 - 1; /*0x14413*/
              if ( v12 ) /*0x14416*/
              {
                if ( v12 == 1 ) /*0x1441b*/
                  v5 = (a1 >> 28) & 0xF; /*0x14424*/
                goto LABEL_19; /*0x14428*/
              }
              a1 >>= 24; /*0x1442a*/
            }
            else
            {
              a1 >>= 20; /*0x1442f*/
            }
          }
          else
          {
            a1 >>= 16; /*0x14434*/
          }
        }
        else
        {
          a1 >>= 12; /*0x14439*/
        }
      }
      else
      {
        a1 >>= 8; /*0x1443e*/
      }
    }
    else
    {
      a1 >>= 4; /*0x14443*/
    }
  }
  v5 = a1 & 0xF; /*0x14449*/
LABEL_19:
  if ( (v5 & 8) == 0 ) /*0x14450*/
    v4 = 0x800000000000000EuLL; /*0x14452*/
  *a4 = v5; /*0x1445c*/
  return v4; /*0x143f2*/
}


// Function: PmicReadRegister @ 0x14464 (0xf0 bytes)
// Index: 116/150

unsigned __int64 __fastcall PmicReadRegister(unsigned __int64 n4, char a2, unsigned int a3, _BYTE *a4)
{
  char v4; // r11
  char v6; // di
  unsigned __int64 v7; // rdx
  unsigned __int64 v9; // rbx
  char v10; // r11
  char v11; // dl

  v4 = 0; /*0x14471*/
  v6 = (a3 >> 5) & 3; /*0x14486*/
  LOBYTE(v7) = 0; /*0x1448a*/
  if ( !a4 ) /*0x14490*/
    return 0x8000000000000002uLL; /*0x1449c*/
  if ( (a3 & 0x8000000) == 0 ) /*0x144a9*/
  {
    v4 = a2 & 7; /*0x14541*/
    goto LABEL_22; /*0x14541*/
  }
  if ( ((a3 >> 30) & 3) != 0 ) /*0x144c0*/
  {
    if ( a3 >> 30 == 1 ) /*0x144c5*/
    {
      v9 = n4 >> 8; /*0x144d2*/
    }
    else
    {
      if ( a3 >> 30 != 2 ) /*0x144ca*/
        goto LABEL_11; /*0x144ca*/
      v9 = n4 >> 12; /*0x144cc*/
    }
  }
  else
  {
    v9 = n4 >> 6; /*0x144d8*/
  }
  v7 = v9 % (unsigned __int8)(3 - (v6 != 0)); /*0x144e5*/
LABEL_11:
  if ( v6 ) /*0x144ef*/
  {
    if ( ((a3 >> 5) & 3) != 1 ) /*0x144f4*/
    {
      if ( ((a3 >> 5) & 3) != 2 ) /*0x144f9*/
      {
        if ( ((a3 >> 5) & 3) == 3 ) /*0x144fe*/
          v4 = a2 & 1 | (4 * (v7 & 1)); /*0x1450b*/
        goto LABEL_22; /*0x1450e*/
      }
      v10 = (4 * (v7 & 1)) | ~(2 * v7) & 2; /*0x14523*/
      goto LABEL_20; /*0x14526*/
    }
    v11 = v7 & 1; /*0x14528*/
  }
  else
  {
    v11 = v7 & 3; /*0x1452d*/
  }
  v10 = 2 * v11; /*0x14530*/
LABEL_20:
  v4 = a2 & 1 | v10; /*0x14534*/
LABEL_22:
  *a4 = v4; /*0x14544*/
  return 0; /*0x14553*/
}


// Function: PmicWriteRegister @ 0x14554 (0xb2 bytes)
// Index: 117/150

unsigned __int64 __fastcall PmicWriteRegister(__int64 n4, __int64 a2, _BYTE *a3, _BYTE *a4)
{
  char v6; // si
  unsigned int v7; // eax
  unsigned int v8; // ecx

  v6 = a2; /*0x14569*/
  if ( a3 && (unsigned __int8)n4 <= 4u ) /*0x14574*/
  {
    v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 8))(n4, a2, 16793780); /*0x14583*/
    switch ( v6 ) /*0x1458d*/
    {
      case 0: /*0x1458d*/
        v8 = v7 >> 18; /*0x145dc*/
        goto LABEL_15; /*0x145dc*/
      case 1: /*0x1458d*/
        v8 = v7 >> 20; /*0x145d2*/
        v7 >>= 3; /*0x145d5*/
        goto LABEL_15; /*0x145d8*/
      case 2: /*0x1458d*/
        v8 = v7 >> 22; /*0x145c8*/
        v7 >>= 6; /*0x145cb*/
        goto LABEL_15; /*0x145ce*/
      case 3: /*0x1458d*/
        v8 = HIBYTE(v7); /*0x145be*/
        v7 >>= 9; /*0x145c1*/
        goto LABEL_15; /*0x145c4*/
      case 4: /*0x1458d*/
        v8 = v7 >> 26; /*0x145b4*/
        v7 >>= 12; /*0x145b7*/
        goto LABEL_15; /*0x145ba*/
      case 5: /*0x1458d*/
        v8 = v7 >> 28; /*0x145aa*/
        v7 >>= 15; /*0x145ad*/
LABEL_15:
        *a3 = v7 & 7; /*0x145df*/
        *a4 = v8 & 3; /*0x145e8*/
        return 0; /*0x145ea*/
    }
  }
  return 0x8000000000000002uLL; /*0x14600*/
}


// Function: PmicProcessEvents @ 0x14608 (0x41c bytes)
// Index: 118/150

unsigned __int64 __fastcall PmicProcessEvents(char *buf)
{
  char v1; // r15
  unsigned __int64 n4_1; // r12
  char v3; // di
  unsigned __int64 n4_9; // rdx
  unsigned __int8 n4; // r14
  int v7; // eax
  unsigned __int64 n4_5; // rcx
  unsigned __int8 v9; // r13
  unsigned int v10; // eax
  unsigned int v11; // ebx
  unsigned __int8 v12; // di
  unsigned __int64 v13; // rdi
  unsigned int v14; // eax
  unsigned int v15; // r8d
  char v16; // bl
  char v17; // di
  __int64 v18; // rdx
  __int64 n4_2; // rcx
  char v20; // cl
  char v21; // al
  char v22; // si
  unsigned __int8 n4_3; // di
  __int64 v24; // r13
  int v25; // eax
  __int64 n4_8; // rcx
  unsigned __int8 n6; // bl
  __int64 v28; // r14
  __int64 v30; // rdx
  __int64 v31; // rcx
  __int64 v32; // rdx
  __int64 v33; // rcx
  __int64 v34; // rdx
  __int64 v35; // rcx
  __int64 v36; // rax
  unsigned __int8 v37; // r14
  __int64 v38; // rdx
  unsigned int v39; // ebx
  __int64 v40; // rcx
  unsigned __int64 v41; // r14
  unsigned int v42; // eax
  __int64 v43; // rdx
  __int64 n4_4; // rcx
  _BYTE v45[4]; // [rsp+20h] [rbp-28h] BYREF
  int v46; // [rsp+24h] [rbp-24h]
  unsigned __int64 n4_7; // [rsp+28h] [rbp-20h]
  unsigned __int64 n4_6; // [rsp+30h] [rbp-18h]
  char v50; // [rsp+98h] [rbp+50h] BYREF
  char v51; // [rsp+A0h] [rbp+58h] BYREF
  char v52; // [rsp+A8h] [rbp+60h] BYREF

  *(_WORD *)(buf + 35) = -1; /*0x14620*/
  *((_WORD *)buf + 16) = -1; /*0x14628*/
  v1 = -1; /*0x1462e*/
  n4_1 = *(_QWORD *)buf; /*0x14631*/
  v3 = 0; /*0x14634*/
  n4_7 = 0; /*0x14637*/
  LOBYTE(v46) = 0; /*0x14642*/
  n4_9 = 0; /*0x14645*/
  v50 = -1; /*0x1464c*/
  v52 = -1; /*0x14650*/
  n4 = 0; /*0x14654*/
  v45[0] = -1; /*0x14657*/
  v51 = -1; /*0x1465b*/
  buf[104] = -1; /*0x1465f*/
  while ( 1 ) /*0x14663*/
  {
    v7 = dword_5B844; /*0x14663*/
    n4_5 = n4; /*0x14669*/
    if ( _bittest(&v7, n4) ) /*0x1466d*/
      break; /*0x1466d*/
LABEL_30:
    if ( ++n4 >= 4u ) /*0x1481f*/
      return 0x8000000000000002uLL; /*0x1481f*/
  }
  v9 = 0; /*0x14676*/
  while ( v3 != 1 ) /*0x1467c*/
  {
    LOBYTE(n4_5) = n4; /*0x14686*/
    v10 = (*(__int64 (__fastcall **)(unsigned __int64, _QWORD, _QWORD, __int64))(qword_C5470 + 8))( /*0x1469a*/
            n4_5,
            0,
            (unsigned int)dword_17EB0[v9],
            1);
    n4_5 = ((unsigned __int64)((v10 >> 7) & 0xFFFFF) << 26) + 0x3FFFFFF; /*0x146bd*/
    v11 = v10; /*0x146c4*/
    n4_6 = n4_5; /*0x146c6*/
    if ( (v10 & 1) != 0 && ((v10 >> 3) & 3) == 0 ) /*0x146d8*/
    {
      n4_9 = n4_7; /*0x146de*/
      if ( v9 && n4_7 == n4_5 ) /*0x146ea*/
        goto LABEL_28; /*0x146ea*/
      if ( (n4_7 || n4_1) && (n4_7 >= n4_1 || n4_1 > n4_5) ) /*0x14706*/
        goto LABEL_24; /*0x14706*/
      v12 = 0; /*0x1470c*/
      if ( ((v10 >> 1) & 3) != 0 ) /*0x14716*/
      {
        switch ( (v10 >> 1) & 3 ) /*0x1471b*/
        {
          case 1u: /*0x1471b*/
            v13 = n4_1 >> 8; /*0x1473c*/
            break;
          case 2u: /*0x1471b*/
            v13 = n4_1 >> 12; /*0x14733*/
            break;
          case 3u: /*0x1471b*/
            v13 = n4_1 >> 30; /*0x1472a*/
            break; /*0x1472e*/
          default:
LABEL_22:
            v14 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD))(qword_C5470 + 8))( /*0x1474d*/
                    n4,
                    0,
                    (unsigned int)dword_17FC0[v9]);
            if ( PmicGetHealthStatus(v14, v12, n4, &v50) ) /*0x1477b*/
            {
              v3 = 0; /*0x14803*/
LABEL_28:
              if ( v3 != 1 ) /*0x1480f*/
              {
                n4_9 = 0; /*0x14811*/
                goto LABEL_30; /*0x14811*/
              }
              goto LABEL_32; /*0x1480f*/
            }
            v15 = v11; /*0x14785*/
            v16 = v50; /*0x1478c*/
            PmicReadRegister(n4_1, v50, v15, &v51); /*0x14794*/
            v17 = v51; /*0x14799*/
            LOBYTE(v18) = v51; /*0x147a1*/
            LOBYTE(n4_2) = n4; /*0x147a8*/
            PmicWriteRegister(n4_2, v18, &v52, v45); /*0x147ab*/
            v1 = v52; /*0x147b0*/
            v20 = v52; /*0x147ba*/
            buf[37] = v17; /*0x147bd*/
            buf[33] = v9; /*0x147c4*/
            buf[32] = n4; /*0x147cb*/
            buf[36] = v16; /*0x147d1*/
            buf[35] = v1; /*0x147d6*/
            v21 = v45[0]; /*0x147da*/
            v3 = 1; /*0x147dd*/
            buf[104] = (2 * n4) | v20 & 1; /*0x147e0*/
            n4_5 = n4_6; /*0x147e3*/
            buf[56] = v21; /*0x147e7*/
LABEL_24:
            n4_7 = n4_5; /*0x147ea*/
            goto LABEL_25; /*0x147ea*/
        }
      }
      else
      {
        v13 = n4_1 >> 6; /*0x14745*/
      }
      v12 = v13 & 7; /*0x14749*/
      goto LABEL_22; /*0x14749*/
    }
LABEL_25:
    if ( ++v9 >= 0x18u ) /*0x147f5*/
      goto LABEL_28; /*0x147f5*/
    n4_9 = 0; /*0x147f7*/
  }
LABEL_32:
  v22 = v46; /*0x1482e*/
  n4_3 = 0; /*0x14831*/
  v24 = 0; /*0x14834*/
  do /*0x1489f*/
  {
    v25 = dword_5B844; /*0x14837*/
    n4_8 = n4_3; /*0x1483d*/
    if ( _bittest(&v25, n4_3) ) /*0x14841*/
    {
      n6 = 0; /*0x14846*/
      v28 = v24; /*0x14848*/
      do /*0x1488f*/
      {
        if ( *(_BYTE *)(v28 + dst + 5131) ) /*0x14852*/
        {
          LOBYTE(n4_9) = n6; /*0x1486a*/
          LOBYTE(n4_8) = n4_3; /*0x1486c*/
          if ( ((*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64, __int64))(qword_C5470 + 8))( /*0x1487e*/
                  n4_8,
                  n4_9,
                  117457920,
                  1)
              & 3) != 0 )
            v22 = 1; /*0x1487e*/
        }
        ++n6; /*0x14882*/
        v28 += 527; /*0x14885*/
      }
      while ( n6 < 6u ); /*0x1488f*/
    }
    ++n4_3; /*0x14891*/
    v24 += 5337; /*0x14894*/
  }
  while ( n4_3 < 4u ); /*0x1489f*/
  if ( !v22 ) /*0x148a8*/
  {
    *((_WORD *)buf + 54) = 1; /*0x148aa*/
    return 0; /*0x148aa*/
  }
  LOBYTE(n4_9) = v1; /*0x148db*/
  LOBYTE(n4_8) = n4_3; /*0x148de*/
  (*(void (__fastcall **)(__int64, unsigned __int64, __int64, _QWORD))(qword_C5470 + 48))( /*0x148e1*/
    n4_8,
    n4_9,
    100679848,
    (4 * (buf[33] & 0x1F)) | 2u);
  LOBYTE(v30) = v1; /*0x148ee*/
  LOBYTE(v31) = n4_3; /*0x148f1*/
  if ( ((*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v31, v30, 100679848) & 0x3000) != 0 ) /*0x148fc*/
  {
    *((_WORD *)buf + 54) = 20; /*0x14a00*/
    return 0; /*0x148b1*/
  }
  LOBYTE(v32) = v1; /*0x1490d*/
  LOBYTE(v33) = n4_3; /*0x14910*/
  if ( ((*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 40))(v33, v32, 100679808) & 0x100) == 0 ) /*0x1491a*/
    return 0x8000000000000002uLL; /*0x1491a*/
  buf[57] = buf[56]; /*0x1492a*/
  LOBYTE(v34) = v1; /*0x1492d*/
  v36 = (unsigned __int8)buf[33]; /*0x14930*/
  LOBYTE(v35) = n4_3; /*0x14934*/
  *((_WORD *)buf + 54) = 2; /*0x14937*/
  v37 = 0; /*0x14950*/
  v39 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 40))( /*0x14955*/
          v35,
          v34,
          (unsigned int)dword_17F30[v36]);
  v40 = (v39 >> 1) & 3; /*0x14957*/
  if ( ((v39 >> 1) & 3) == 0 ) /*0x1495a*/
  {
    v41 = n4_1 >> 6; /*0x14989*/
    goto LABEL_53; /*0x14989*/
  }
  v40 = (unsigned int)(v40 - 1); /*0x1495c*/
  if ( !(_DWORD)v40 ) /*0x1495f*/
  {
    v41 = n4_1 >> 8; /*0x14980*/
    goto LABEL_53; /*0x14984*/
  }
  v40 = (unsigned int)(v40 - 1); /*0x14961*/
  if ( !(_DWORD)v40 ) /*0x14964*/
  {
    v41 = n4_1 >> 12; /*0x14977*/
LABEL_53:
    v37 = v41 & 7; /*0x1498d*/
    goto LABEL_54; /*0x1498d*/
  }
  if ( (_DWORD)v40 == 1 ) /*0x14969*/
  {
    v41 = n4_1 >> 30; /*0x1496e*/
    goto LABEL_53; /*0x14972*/
  }
LABEL_54:
  LOBYTE(v38) = v1; /*0x14991*/
  LOBYTE(v40) = n4_3; /*0x14998*/
  v42 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(qword_C5470 + 40))( /*0x149aa*/
          v40,
          v38,
          (unsigned int)dword_18080[(unsigned __int8)buf[33]]);
  if ( !PmicGetHealthStatus(v42, v37, n4_3, &v50) ) /*0x149b9*/
  {
    PmicReadRegister(n4_1, v50, v39, &v51); /*0x149d0*/
    LOBYTE(v43) = v51; /*0x149d5*/
    LOBYTE(n4_4) = n4_3; /*0x149dc*/
    PmicWriteRegister(n4_4, v43, &v52, v45); /*0x149e3*/
    if ( v52 == buf[35] ) /*0x149ee*/
    {
      buf[56] = v45[0]; /*0x149f3*/
      return 0; /*0x149f6*/
    }
  }
  return 0x8000000000000002uLL; /*0x14a13*/
}


// Function: PmicReadTemperature @ 0x14a24 (0x3d2 bytes)
// Index: 119/150

unsigned __int64 __fastcall PmicReadTemperature(char *buf, __int64 a2)
{
  unsigned __int8 v2; // bl
  char *buf_1; // r14
  unsigned __int64 v4; // rbp
  unsigned int v5; // eax
  int *v6; // rcx
  unsigned int v7; // edi
  char v8; // si
  __int64 v9; // rdx
  unsigned int v10; // eax
  __int64 v11; // rcx
  unsigned int v12; // ebx
  __int64 v13; // rdx
  char v14; // si
  UINTN n6; // rdx
  char v17; // r15
  char v18; // r12
  char v19; // r12
  int v20; // edi
  int v21; // edi
  int v22; // esi
  int v23; // esi
  int v24; // esi
  unsigned int v25; // eax
  int v26; // esi
  char v27; // r15
  int v28; // edi
  int v29; // esi
  int v30; // esi
  UINTN n0x40; // rdi
  unsigned int v32; // esi
  unsigned int v33; // esi
  unsigned int v34; // ebx
  UINTN n0x40_1; // rdx
  char v36; // dl
  bool v37; // zf
  char v38; // cl
  int v39; // [rsp+50h] [rbp+8h]
  int v40; // [rsp+50h] [rbp+8h]

  v2 = buf[104]; /*0x14a4a*/
  buf_1 = buf; /*0x14a51*/
  if ( (unsigned __int16)(*((_WORD *)buf + 54) - 1) <= 1u ) /*0x14a58*/
  {
    if ( *((_WORD *)buf + 54) == 2 ) /*0x14a63*/
      v4 = *((_QWORD *)buf + 9); /*0x14a65*/
    else
      v4 = *((_QWORD *)buf + 8); /*0x14a6b*/
    LOBYTE(a2) = buf[35]; /*0x14a6f*/
    *((_DWORD *)buf + 22) = -1; /*0x14a75*/
    *((_DWORD *)buf + 23) = -1; /*0x14a7e*/
    buf[96] = -1; /*0x14a81*/
    LOBYTE(buf) = buf[32]; /*0x14a8c*/
    v5 = (*(__int64 (__fastcall **)(char *, __int64, __int64))(qword_C5470 + 40))(buf, a2, 117459068); /*0x14a8f*/
    v6 = dword_18050; /*0x14a92*/
    v7 = v5; /*0x14a9c*/
    v8 = 3 * (v2 & 1); /*0x14aa8*/
    LOBYTE(v9) = buf_1[56] + v8; /*0x14ab3*/
    LOBYTE(v6) = v2 >> 1; /*0x14abb*/
    v10 = (*(__int64 (__fastcall **)(int *, __int64, _QWORD))(qword_C5470 + 8))( /*0x14ac4*/
            v6,
            v9,
            (unsigned int)dword_18050[(unsigned __int8)buf_1[82]]);
    LOBYTE(v11) = buf_1[32]; /*0x14ad1*/
    v12 = v10; /*0x14ad5*/
    LOBYTE(v13) = buf_1[56] + v8; /*0x14ade*/
    v14 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(qword_C5470 + 8))(v11, v13, 117457036); /*0x14ae4*/
    if ( (v12 & 0x8000) == 0 || (((unsigned int)(HIWORD(v12) & 0xF) >> buf_1[80]) & 1) != 0 ) /*0x14b0c*/
      return 0x8000000000000002uLL; /*0x14b0c*/
    v39 = BaseLibCopyMem(v4, 3u, 5u); /*0x14b1f*/
    n6 = 6; /*0x14b24*/
    if ( (v7 & 1) != 0 ) /*0x14b2f*/
    {
      v17 = BaseLibCopyMem(v4, 6u, 7u); /*0x14b46*/
      v18 = BaseLibCopyMem(v4, 8u, 9u); /*0x14b57*/
      if ( (v7 & 0x200) != 0 ) /*0x14b62*/
      {
        v17 ^= BaseLibCopyMem(v4, 0x14u, 0x15u); /*0x14b7b*/
        v19 = BaseLibCopyMem(v4, 0x16u, 0x16u) ^ v18; /*0x14b8c*/
        v18 = (2 * BaseLibCopyMem(v4, 0x1Cu, 0x1Cu)) ^ v19; /*0x14b96*/
      }
      v20 = (8 * BaseLibCopyMem(v4, 0xEu, 0xEu)) | v39; /*0x14bb5*/
      v21 = (16 * BaseLibCopyMem(v4, 0x13u, 0x13u)) | v20; /*0x14bd2*/
      v40 = (32 * BaseLibCopyMem(v4, 0x17u, 0x1Bu)) | v21; /*0x14beb*/
      v22 = BaseLibCopyMem(v4, 0xFu, 0x12u); /*0x14c01*/
      v23 = (16 * BaseLibCopyMem(v4, 0x14u, 0x16u)) | v22; /*0x14c1a*/
      v24 = ((unsigned int)BaseLibCopyMem(v4, 0x1Cu, 0x1Cu) << 7) | v23; /*0x14c2d*/
      v25 = (unsigned int)BaseLibCopyMem(v4, 0xAu, 0xDu) << 8; /*0x14c38*/
    }
    else
    {
      v26 = v14 & 1; /*0x14c41*/
      if ( !v26 ) /*0x14c44*/
        n6 = 13; /*0x14c46*/
      v27 = BaseLibCopyMem(v4, n6, n6); /*0x14c5c*/
      v17 = (2 * BaseLibCopyMem(v4, 0x11u, 0x11u)) | v27; /*0x14c69*/
      v28 = (v7 >> 9) & 1; /*0x14c72*/
      if ( v28 ) /*0x14c75*/
        v17 ^= BaseLibCopyMem(v4, 0x14u, 0x15u); /*0x14c86*/
      v18 = BaseLibCopyMem(v4, 0x12u, 0x13u); /*0x14c9a*/
      if ( v28 ) /*0x14c9f*/
        v18 ^= BaseLibCopyMem(v4, 0x16u, 0x17u); /*0x14cb2*/
      v40 = (8 * BaseLibCopyMem(v4, (unsigned int)(v26 + 6), (unsigned int)(v26 + 12))) | v39; /*0x14ccd*/
      v29 = BaseLibCopyMem(v4, 0xEu, 0x10u); /*0x14ce6*/
      v30 = (8 * BaseLibCopyMem(v4, 0x14u, 0x14u)) | v29; /*0x14d00*/
      v24 = (16 * BaseLibCopyMem(v4, 0x1Cu, 0x1Cu)) | v30; /*0x14d16*/
      v25 = 32 * BaseLibCopyMem(v4, 0x15u, 0x1Bu); /*0x14d1d*/
    }
    LOBYTE(n0x40) = ((v12 >> 2) & 7) + 28; /*0x14d48*/
    v32 = ((unsigned int)BaseLibCopyMem(v4, 0x1Du, 0x1Du) << 12) | v25 | v24; /*0x14d4b*/
    v33 = ((unsigned int)BaseLibCopyMem(v4, 0x1Eu, (unsigned __int8)n0x40) << 13) | v32; /*0x14d5a*/
    v34 = v12 >> 23; /*0x14d5c*/
    if ( (v34 & 3) != 0 ) /*0x14d62*/
    {
      n0x40_1 = (unsigned __int8)(n0x40 + 1); /*0x14d72*/
      n0x40 = (unsigned __int8)(n0x40 + (v34 & 3)); /*0x14d74*/
      v36 = BaseLibCopyMem(v4, n0x40_1, n0x40); /*0x14d82*/
    }
    else
    {
      v36 = 0; /*0x14d87*/
    }
    if ( v4 >> ((unsigned __int8)n0x40 + 1) ) /*0x14d8f*/
      return 0x8000000000000002uLL; /*0x14af6*/
    v37 = *(_WORD *)(dst + 25) == 12; /*0x14dab*/
    *((_DWORD *)buf_1 + 23) = v40; /*0x14daf*/
    v38 = -1; /*0x14db3*/
    if ( v37 ) /*0x14dbc*/
      v38 = v17; /*0x14dbc*/
    *((_DWORD *)buf_1 + 22) = v33; /*0x14dbf*/
    buf_1[97] = v38; /*0x14dc3*/
    buf_1[96] = v18; /*0x14dc7*/
    buf_1[105] = v36; /*0x14dcb*/
    *((_DWORD *)buf_1 + 28) = 1; /*0x14dcf*/
  }
  return 0; /*0x14de8*/
}


// Function: PmicSetDimmPower @ 0x14df8 (0x74 bytes)
// Index: 120/150

unsigned __int64 __fastcall PmicSetDimmPower(unsigned __int64 ProcessResult, char *buf)
{
  unsigned __int64 result; // rax
  __int64 v4; // rdx
  __int64 v5; // rdx
  __int64 v6; // rdx

  *((_WORD *)buf + 48) = -1; /*0x14dfe*/
  *(_QWORD *)buf = ProcessResult; /*0x14e07*/
  *((_DWORD *)buf + 22) = -1; /*0x14e10*/
  *((_DWORD *)buf + 23) = -1; /*0x14e13*/
  buf[32] = -1; /*0x14e16*/
  buf[35] = -1; /*0x14e1a*/
  buf[56] = -1; /*0x14e1e*/
  buf[82] = -1; /*0x14e22*/
  buf[84] = -1; /*0x14e26*/
  buf[102] = -1; /*0x14e2a*/
  result = PmicProcessEvents(buf); /*0x14e2e*/
  if ( !result ) /*0x14e36*/
  {
    result = ThermalProcessData(buf, v4); /*0x14e3b*/
    if ( !result ) /*0x14e43*/
    {
      result = ThermalInit(buf, v5); /*0x14e48*/
      if ( !result ) /*0x14e50*/
      {
        result = PmicReadTemperature(buf, v6); /*0x14e55*/
        if ( !result ) /*0x14e5d*/
          *((_DWORD *)buf + 28) = 1; /*0x14e5f*/
      }
    }
  }
  return result; /*0x14e66*/
}


// Function: NvdimmFwGetInfo @ 0x14e6c (0x99 bytes)
// Index: 121/150

UINT32 __fastcall NvdimmFwGetInfo(UINTN dst, unsigned __int64 src, unsigned __int64 count)
{
  UINT32 dst_1; // eax
  unsigned __int64 v6; // rbp

  dst_1 = dst; /*0x14e89*/
  if ( count ) /*0x14e8f*/
  {
    v6 = count - 1; /*0x14e91*/
    if ( count - 1 > ~dst ) /*0x14e9b*/
      DebugAssert( /*0x14eb0*/
        "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        0x38u,
        "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
    if ( v6 > ~src ) /*0x14ebe*/
      DebugAssert( /*0x14ed3*/
        "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        0x39u,
        "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
    if ( dst == src ) /*0x14edb*/
      return dst; /*0x14edd*/
    else
      return IoWrite32(dst, src); /*0x14eeb*/
  }
  return dst_1; /*0x14eff*/
}


// Function: NvdimmFwUpdateSlot @ 0x14f08 (0x6e bytes)
// Index: 122/150

UINT32 __fastcall NvdimmFwUpdateSlot(UINTN buf, unsigned __int64 a2)
{
  if ( !a2 ) /*0x14f1b*/
    return buf; /*0x14f1d*/
  if ( !buf ) /*0x14f25*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c", 0x35u, "Buffer != ((void *) 0)"); /*0x14f38*/
  if ( a2 > -(__int64)buf ) /*0x14f46*/
    DebugAssert( /*0x14f5b*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      0x36u,
      "Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
  return IoRead32(buf); /*0x14f70*/
}


// Function: NvdimmFwWriteBlock @ 0x14f78 (0x83 bytes)
// Index: 123/150

__int64 *__fastcall NvdimmFwWriteBlock(__int64 *a1, int *p_n1727058809)
{
  __int64 v4; // rsi
  __int64 v5; // rsi

  v4 = HandleProtocol((__int64)p_n1727058809); /*0x14f95*/
  if ( !a1 ) /*0x14f9b*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0xDBu, "Buffer != ((void *) 0)"); /*0x14fb0*/
  *a1 = v4; /*0x14fb9*/
  v5 = HandleProtocol((__int64)(p_n1727058809 + 2)); /*0x14fc5*/
  if ( a1 == (__int64 *)-8LL ) /*0x14fcb*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0xDBu, "Buffer != ((void *) 0)"); /*0x14fe0*/
  a1[1] = v5; /*0x14fe5*/
  return a1; /*0x14ff5*/
}


// Function: NvdimmFwVerify @ 0x14ffc (0x67 bytes)
// Index: 124/150

bool __fastcall NvdimmFwVerify(__int64 a1, __int64 a2)
{
  __int64 v4; // rsi
  __int64 v5; // rbx
  __int64 v6; // rdi
  __int64 v7; // rax

  v4 = HandleProtocol(a1); /*0x1501e*/
  v5 = HandleProtocol(a2); /*0x1502a*/
  v6 = HandleProtocol(a1 + 8); /*0x15036*/
  v7 = HandleProtocol(a2 + 8); /*0x15039*/
  return v4 == v5 && v6 == v7; /*0x1505d*/
}


// Function: LocateProtocol @ 0x15064 (0x8c bytes)
// Index: 125/150

__int64 LocateProtocol()
{
  __int64 result; // rax
  __int64 v1; // rax

  result = qword_1A328; /*0x15068*/
  if ( !qword_1A328 ) /*0x15072*/
  {
    v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_19050, 0, &qword_1A328); /*0x1508b*/
    if ( v1 < 0 ) /*0x15094*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0x150a5*/
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 0x4Eu, "!EFI_ERROR (Status)"); /*0x150bd*/
    }
    result = qword_1A328; /*0x150c2*/
    if ( !qword_1A328 ) /*0x150cc*/
    {
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 0x4Fu, "mPcd != ((void *) 0)"); /*0x150df*/
      return qword_1A328; /*0x150e4*/
    }
  }
  return result; /*0x150eb*/
}


// Function: BaseLibSetMem16 @ 0x150f0 (0x1a bytes)
// Index: 126/150

__int64 __fastcall BaseLibSetMem16(__int64 n32)
{
  __int64 Protocol; // rax

  Protocol = LocateProtocol(); /*0x150f9*/
  return (*(__int64 (__fastcall **)(__int64))(Protocol + 32))(n32);
}


// Function: BaseLibSetMem32 @ 0x1510c (0x1a bytes)
// Index: 127/150

__int64 __fastcall BaseLibSetMem32(__int64 n31)
{
  __int64 Protocol; // rax

  Protocol = LocateProtocol(); /*0x15115*/
  return (*(__int64 (__fastcall **)(__int64))(Protocol + 40))(n31);
}


// Function: BaseLibCopyMem @ 0x15128 (0x7b bytes)
// Index: 128/150

UINT64 __fastcall BaseLibCopyMem(__int64 a1, UINTN n0x40, UINTN n0x40_1)
{
  __int64 v6; // rax

  if ( n0x40_1 >= 0x40 ) /*0x15144*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\BitField.c", 0x2DBu, "EndBit < 64"); /*0x15159*/
  if ( n0x40 > n0x40_1 ) /*0x15161*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\BitField.c", 0x2DCu, "StartBit <= EndBit"); /*0x15176*/
  v6 = RegisterProtocolNotify(a1, n0x40_1); /*0x1517e*/
  return RShiftU64(a1 & ~v6, n0x40); /*0x15199*/
}


// Function: HandleProtocol @ 0x151a4 (0x2f bytes)
// Index: 129/150

__int64 __fastcall HandleProtocol(__int64 a1)
{
  if ( !a1 ) /*0x151b0*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0xC0u, "Buffer != ((void *) 0)"); /*0x151c5*/
  return *(_QWORD *)a1; /*0x151cd*/
}


// Function: RegisterProtocolNotify @ 0x151d4 (0x3a bytes)
// Index: 130/150

__int64 __fastcall RegisterProtocolNotify(__int64 a1, unsigned __int64 n0x40)
{
  char n0x40_1; // bl

  n0x40_1 = n0x40; /*0x151da*/
  if ( n0x40 >= 0x40 ) /*0x151e1*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\LShiftU64.c", 0x27u, "Count < 64"); /*0x151f6*/
  return -2LL << n0x40_1; /*0x15208*/
}


// Function: RShiftU64 @ 0x15210 (0x42 bytes)
// Index: 131/150

UINT64 __cdecl RShiftU64(UINT64 Operand, UINTN Count)
{
  char Count_1; // di

  Count_1 = Count; /*0x1521a*/
  if ( Count >= 0x40 ) /*0x15224*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\RShiftU64.c", 0x27u, "Count < 64"); /*0x15239*/
  return Operand >> Count_1; /*0x1524c*/
}


// Function: LShiftU64 @ 0x15254 (0x2f bytes)
// Index: 132/150

UINT64 __cdecl LShiftU64(UINT64 Operand, UINTN Count)
{
  if ( (Operand & 1) != 0 ) /*0x15260*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 0x97u, "(Address & 1) == 0"); /*0x15275*/
  return *(unsigned __int16 *)Operand; /*0x1527d*/
}


// Function: IoWrite16 @ 0x15284 (0x34 bytes)
// Index: 133/150

UINT16 __cdecl IoWrite16(UINTN Port, UINT16 Value)
{
  if ( (Port & 1) != 0 ) /*0x15290*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 0xB7u, "(Address & 1) == 0"); /*0x152a5*/
  *(_WORD *)Port = 1280; /*0x152af*/
  return 1280; /*0x152b2*/
}


// Function: IoRead32Port @ 0x152b8 (0x30 bytes)
// Index: 134/150

unsigned __int32 __fastcall IoRead32Port(unsigned __int16 a1)
{
  if ( (a1 & 3) != 0 ) /*0x152c4*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 0xC1u, "(Port & 3) == 0"); /*0x152d9*/
  return __indword(a1); /*0x152e2*/
}


// Function: DebugLibGetDebugLib @ 0x152e8 (0x86 bytes)
// Index: 135/150

__int64 DebugLibGetDebugLib()
{
  __int64 result; // rax
  unsigned __int64 n0x10; // rbx
  __int64 v2; // rax
  __int64 v3; // rcx

  result = qword_1A350; /*0x152f2*/
  if ( !qword_1A350 ) /*0x152fe*/
  {
    if ( BootServices_0 /*0x1532c*/
      && (n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 24))(31),
          (*(void (__fastcall **)(unsigned __int64))(BootServices_0 + 32))(n0x10),
          n0x10 <= 0x10) )
    {
      v2 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_19000, 0, &qword_1A350); /*0x15345*/
      v3 = qword_1A350; /*0x1534b*/
      if ( v2 < 0 ) /*0x15355*/
        v3 = 0; /*0x15355*/
      qword_1A350 = v3; /*0x15359*/
      return v3; /*0x15360*/
    }
    else
    {
      return 0; /*0x1530c*/
    }
  }
  return result; /*0x15368*/
}


// Function: DebugPrint @ 0x15370 (0x80 bytes)
// Index: 136/150

void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
  __int64 DebugLib; // rax
  __int64 v4; // r8
  void (__fastcall **DebugLib_1)(UINTN, const CHAR8 *, __int64 *); // r9
  unsigned __int8 v6; // al
  char n3_1; // al
  char n3; // dl
  va_list va; // [rsp+40h] [rbp+18h] BYREF

  va_start(va, Format);
  DebugLib = DebugLibGetDebugLib(); /*0x15387*/
  v4 = 0; /*0x1538c*/
  DebugLib_1 = (void (__fastcall **)(UINTN, const CHAR8 *, __int64 *))DebugLib; /*0x1538f*/
  if ( DebugLib ) /*0x15395*/
  {
    v6 = __inbyte(0x70u); /*0x1539b*/
    __outbyte(0x70u, v6 & 0x80 | 0x4B); /*0x153a0*/
    n3_1 = __inbyte(0x71u); /*0x153a5*/
    n3 = n3_1; /*0x153a6*/
    if ( (unsigned __int8)n3_1 > 3u ) /*0x153aa*/
    {
      n3 = 3; /*0x153b3*/
      if ( n113 ) /*0x153b9*/
        n3 = n113; /*0x153b9*/
    }
    if ( (unsigned __int8)(n3 - 1) <= 0xFDu ) /*0x153c1*/
    {
      v4 = 2147483718LL; /*0x153cb*/
      if ( n3 == 1 ) /*0x153d1*/
        v4 = 2147483652LL; /*0x153d1*/
    }
    if ( (v4 & ErrorLevel) != 0 ) /*0x153d8*/
      (*DebugLib_1)(ErrorLevel, Format, (__int64 *)va); /*0x153e7*/
  }
}


// Function: DebugAssert @ 0x153f0 (0x3e bytes)
// Index: 137/150

void __cdecl DebugAssert(const CHAR8 *FileName, UINTN LineNumber, const CHAR8 *Description)
{
  __int64 DebugLib; // rax

  DebugLib = DebugLibGetDebugLib(); /*0x15408*/
  if ( DebugLib ) /*0x15410*/
    (*(void (__fastcall **)(const CHAR8 *, UINTN, const CHAR8 *))(DebugLib + 8))(FileName, LineNumber, Description); /*0x1541b*/
}


// Function: DebugLevelEnabled @ 0x15430 (0x3 bytes)
// Index: 138/150

// (too small: 0x3 bytes)


// Function: DebugLevelCheck @ 0x15434 (0x6 bytes)
// Index: 139/150

// (too small: 0x6 bytes)


// Function: BootSvcNullCallback @ 0x1543c (0x9 bytes)
// Index: 140/150

// (too small: 0x9 bytes)


// Function: BootSvcTimerCallback @ 0x15448 (0x26 bytes)
// Index: 141/150

__int64 BootSvcTimerCallback()
{
  __int64 result; // rax

  if ( qword_1A350 ) /*0x15454*/
    return (*(__int64 (__fastcall **)(_QWORD, __int64 *))(RuntimeServices_0 + 64))(0, &qword_1A350); /*0x15466*/
  return result; /*0x15469*/
}


// Function: DxeSvcTableLocate @ 0x15470 (0xc4 bytes)
// Index: 142/150

unsigned __int64 __fastcall DxeSvcTableLocate(__int64 a1, _QWORD *a2)
{
  __int64 SystemTable; // rdi
  __int64 v5; // rbx
  __int64 i; // r14

  if ( !a1 ) /*0x15492*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 0x61u, "TableGuid != ((void *) 0)"); /*0x154a5*/
  if ( !a2 ) /*0x154ad*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 0x62u, "Table != ((void *) 0)"); /*0x154c0*/
  SystemTable = SystemTable; /*0x154c5*/
  v5 = 0; /*0x154cc*/
  *a2 = 0; /*0x154ce*/
  if ( !*(_QWORD *)(SystemTable + 104) ) /*0x154d2*/
    return 0x800000000000000EuLL; /*0x154fb*/
  for ( i = 0; !NvdimmFwVerify(a1, i + *(_QWORD *)(SystemTable + 112)); i += 24 ) /*0x154d8*/
  {
    if ( (unsigned __int64)++v5 >= *(_QWORD *)(SystemTable + 104) ) /*0x154f9*/
      return 0x800000000000000EuLL; /*0x154f9*/
  }
  *a2 = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v5 + 16); /*0x1552f*/
  return 0; /*0x15519*/
}


// Function: MmPciBaseInit @ 0x15534 (0x82 bytes)
// Index: 143/150

__int64 MmPciBaseInit()
{
  __int64 result; // rax
  signed __int64 v1; // rax

  result = qword_1A368; /*0x15538*/
  if ( !qword_1A368 ) /*0x15542*/
  {
    v1 = DxeSvcTableLocate((__int64)&unk_190A0, &qword_1A368); /*0x15552*/
    if ( v1 < 0 ) /*0x1555a*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0x1556b*/
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x36u, "!EFI_ERROR (Status)"); /*0x15583*/
    }
    result = qword_1A368; /*0x15588*/
    if ( !qword_1A368 ) /*0x15592*/
    {
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x37u, "mHobList != ((void *) 0)"); /*0x155a5*/
      return qword_1A368; /*0x155aa*/
    }
  }
  return result; /*0x155b1*/
}


// Function: UnalignedRead32 @ 0x155b8 (0x4d bytes)
// Index: 144/150

_WORD *__fastcall UnalignedRead32(__int64 a1, _WORD *i)
{
  _WORD *i_1; // rbx

  i_1 = i; /*0x155be*/
  if ( !i ) /*0x155c4*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x6Cu, "HobStart != ((void *) 0)"); /*0x155d7*/
  while ( 1 ) /*0x155f0*/
  {
    if ( *i_1 == 0xFFFF ) /*0x155f6*/
      return 0; /*0x155ff*/
    if ( *i_1 == 4 ) /*0x155e7*/
      break; /*0x155e7*/
    i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0x155ed*/
  }
  return i_1; /*0x155fa*/
}


// Function: UnalignedRead16 @ 0x15608 (0x49 bytes)
// Index: 145/150

_WORD *__fastcall UnalignedRead16(__int64 a1)
{
  _WORD *i; // rdx
  __int64 v3; // rcx
  _WORD *v4; // rax
  _WORD *v5; // rbx

  for ( i = (_WORD *)MmPciBaseInit(); ; i = (_WORD *)((char *)v5 + (unsigned __int16)v5[1]) ) /*0x1561a*/
  {
    v4 = UnalignedRead32(v3, i); /*0x15636*/
    v5 = v4; /*0x1563b*/
    if ( !v4 || NvdimmFwVerify(a1, (__int64)(v4 + 4)) ) /*0x15626*/
      break; /*0x15626*/
  }
  return v5; /*0x1564b*/
}


// Function: RuntimeSvcNullCallback @ 0x15654 (0x23 bytes)
// Index: 146/150

__int64 RuntimeSvcNullCallback()
{
  __int64 result; // rax

  result = (*(__int64 (__fastcall **)(_QWORD, __int64 *))(RuntimeServices + 64))(0, &RuntimeServices_1); /*0x15668*/
  byte_1A370 = 1; /*0x1566b*/
  return result; /*0x15672*/
}


// Function: RuntimeSvcPciCallback @ 0x15678 (0x6d bytes)
// Index: 147/150

__int64 RuntimeSvcPciCallback()
{
  __int64 result; // rax
  unsigned __int64 v1; // rbx
  __int64 v2; // rdi

  result = qword_1A378; /*0x15682*/
  v1 = 0; /*0x15689*/
  if ( qword_1A378 ) /*0x1568e*/
  {
    if ( qword_1A380 ) /*0x15697*/
    {
      v2 = 0; /*0x15699*/
      while ( 1 ) /*0x156ab*/
      {
        (*(void (__fastcall **)(_QWORD, __int64))(RuntimeServices + 64))(0, v2 + result + 8); /*0x156ab*/
        ++v1; /*0x156ae*/
        v2 += 16; /*0x156b1*/
        if ( v1 >= qword_1A380 ) /*0x156bc*/
          break; /*0x156bc*/
        result = qword_1A378; /*0x156be*/
      }
    }
    return (*(__int64 (__fastcall **)(_QWORD, __int64 *))(RuntimeServices + 64))(0, &qword_1A378); /*0x156d7*/
  }
  return result; /*0x156df*/
}


// Function: PciExpressRead @ 0x156e8 (0xc2 bytes)
// Index: 148/150

__int64 __fastcall PciExpressRead(__int64 n1024064)
{
  __int64 v2; // rbx
  unsigned __int64 v3; // rax
  _QWORD *v4; // rcx

  if ( (n1024064 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x156f8*/
    DebugAssert( /*0x1570d*/
      "e:\\hs\\MdePkg\\Library\\DxeRuntimePciExpressLib\\PciExpressLib.c",
      0xCBu,
      "((Address) & ~0xfffffff) == 0");
  v2 = qword_1A388 + n1024064; /*0x15712*/
  v3 = 0; /*0x15719*/
  if ( byte_1A370 ) /*0x15721*/
  {
    if ( *(_QWORD *)(qword_1A378 + 16 * qword_1A390) == (v2 & 0xFFFFFFFFFFFFF000uLL) ) /*0x15742*/
    {
      return *(_QWORD *)(qword_1A378 + 16 * qword_1A390 + 8) + (v2 & 0xFFF); /*0x1574a*/
    }
    else
    {
      if ( !qword_1A380 ) /*0x1575b*/
      {
LABEL_10:
        DebugAssert("e:\\hs\\MdePkg\\Library\\DxeRuntimePciExpressLib\\PciExpressLib.c", 0xF6u, "((BOOLEAN)(0==1))"); /*0x15771*/
        __debugbreak(); /*0x15789*/
      }
      v4 = (_QWORD *)qword_1A378; /*0x1575d*/
      while ( *v4 != (v2 & 0xFFFFFFFFFFFFF000uLL) ) /*0x15763*/
      {
        ++v3; /*0x15765*/
        v4 += 2; /*0x15768*/
        if ( v3 >= qword_1A380 ) /*0x1576f*/
          goto LABEL_10; /*0x1576f*/
      }
      qword_1A390 = v3; /*0x15793*/
      return *(_QWORD *)(qword_1A378 + 16 * v3 + 8) + (v2 & 0xFFF); /*0x157a3*/
    }
  }
  return v2; /*0x1578d*/
}


// Function: PciExpressWrite @ 0x157ac (0x73 bytes)
// Index: 149/150

__int64 __fastcall PciExpressWrite(unsigned int n35795)
{
  unsigned int v1; // ebx
  unsigned int n0x400000; // edi
  unsigned __int32 v3; // esi
  __int64 result; // rax

  v1 = n35795 >> 22; /*0x157c4*/
  n0x400000 = n35795 & 0x3FFFFF; /*0x157cc*/
  do /*0x15808*/
  {
    v3 = n0x400000 + (IoRead32Port(0x508u) & 0xFFFFFF); /*0x157e2*/
    n0x400000 = 0x400000; /*0x157e4*/
    while ( ((v3 - IoRead32Port(0x508u)) & 0x800000) == 0 ) /*0x15800*/
      CpuPause(); /*0x157eb*/
    result = v1--; /*0x15802*/
  }
  while ( (_DWORD)result ); /*0x15808*/
  return result; /*0x15819*/
}


// Function: PciExpressNotifyUninit @ 0x15820 (0x4b bytes)
// Index: 150/150

void PciExpressNotifyUninit()
{
  __int64 v0; // rax

  v0 = (*(__int64 (__fastcall **)(__int64))(BootServices + 72))(qword_1A378); /*0x15832*/
  if ( v0 < 0 ) /*0x15838*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v0); /*0x15849*/
    DebugAssert( /*0x15861*/
      "e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
      0x333u,
      "!EFI_ERROR (Status)");
  }
}