Newer
Older
AMI-Aptio-BIOS-Reversed / PeiSelStatusCode / PeiSelStatusCode.c
@Ajax Dong Ajax Dong 2 days ago 20 KB Init
/*
 *PeiSelStatusCode - Decompiled PeiSelStatusCode
 *Source: Auto-generated from IDA Pro decompilation
 *
 *Decompiled from port 13400
 */

#include "PeiSelStatusCode.h"

/*
 *InternalMemCopy at 0xffe5de20
 */
char *InternalMemCopy(char *dst, char *src, unsigned int count)
{
 unsigned int count_1; // edx char *dst_1; // edi char *src_1; // esi count_1 = count; /*0xffe5de2a*/
 if ( src < dst && &src[count - 1] >= dst ) /*0xffe5de38*/
 {
 src_1 = &src[count - 1]; /*0xffe5de4c*/
 dst_1 = &dst[count - 1]; /*0xffe5de4e*/
 }
 else
 {
 count_1 = count & 3; /*0xffe5de3c*/
 qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe5de45*/
 src_1 = &src[4 * (count >> 2)]; /*0xffe5de45*/
 dst_1 = &dst[4 * (count >> 2)]; /*0xffe5de45*/
 }
 qmemcpy(dst_1, src_1, count_1); /*0xffe5de55*/
 return dst; /*0xffe5de5c*/
}

/*
 *InternalMemSet at 0xffe5de60
 */
void *InternalMemSet(void *buf, unsigned int count)
{
 memset(buf, 0, count); /*0xffe5de77*/
 return buf; /*0xffe5de7e*/
}

/*
 *SetMem at 0xffe5de80
 */
void *SetMem(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffe5de8d*/
 return buf; /*0xffe5de93*/
}

/*
 *SetMem32 at 0xffe5dea0
 */
int SetMem32(int a1, int a2, int a3, int a4)
{
 do /*0xffe5deb9*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe5deb1*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe5deb5*/
 }
 while ( a2 ); /*0xffe5deb9*/
 return a1; /*0xffe5debd*/
}

/*
 *SetMem16 at 0xffe5dec0
 */
void *SetMem16(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffe5decd*/
 return buf; /*0xffe5ded3*/
}

/*
 *PeiSelStatusCodeEntryPoint at 0xffe5ded5
 */
EFI_STATUS PeiSelStatusCodeEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 int v2; // ecx int ReportStatusCodePpi; // eax if ( *(_DWORD *)(LODWORD(SystemTable->Hdr.Signature) + 8) < 0x1000Au ) /*0xffe5dee3*/
 {
 ReportStatusCodePpi = PeiGetReportStatusCodePpi(); /*0xffe5dee5*/
 if ( ReportStatusCodePpi ) /*0xffe5deec*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe5defa*/
 "e:\\hs\\MdePkg\\Library\\PeimEntryPoint\\PeimEntryPoint.c",
 46,
 "(*PeiServices)->Hdr.Revision >= _gPeimRevision");
 }
 return PeiSelStatusCodeEntry(v2, (int)SystemTable); /*0xffe5df02*/
}

/*
 *PeiSelStatusCodeInitEndpoint at 0xffe5df08
 */
int PeiSelStatusCodeInitEndpoint(_DWORD *a1)
{
 _DWORD *v1; // esi int result; // eax int Result; // [esp+4h] [ebp-8h] BYREF int Result; // [esp+8h] [ebp-4h] BYREF v1 = a1; /*0xffe5df0e*/
 result = (*(int ( **)(_DWORD *, void *, _DWORD, _DWORD **, int *))(*a1 + 32))(a1, &unk_FFE5EBA0, 0, &a1, &Result); /*0xffe5df23*/
 if ( result >= 0 ) /*0xffe5df2b*/
 {
 result = (*(int ( **)(_DWORD *, void *, _DWORD, _DWORD, int *))(*v1 + 32))(v1, &unk_FFE5EB70, 0, 0, &Result); /*0xffe5df3d*/
 if ( result >= 0 ) /*0xffe5df45*/
 {
 *(_DWORD *)(Result + 4) = Result; /*0xffe5df4d*/
 a1[2] = Result; /*0xffe5df56*/
 return (*(int ( **)(_DWORD *, _DWORD *, _DWORD *))(*v1 + 28))(v1, a1, a1); /*0xffe5df62*/
 }
 }
 return result; /*0xffe5df68*/
}

/*
 *PeiSelLookupDataType at 0xffe5df6d
 */
int *PeiSelLookupDataType(int a1, int n2)
{
 int Index; // esi unsigned int Index; // eax Index = 0; /*0xffe5df6e*/
 Index = 0; /*0xffe5df70*/
 while ( a1 != dword_FFE5EBD0[Index] || n2 != dword_FFE5EBD4[Index] ) /*0xffe5df80*/
 {
 Index += 3; /*0xffe5df82*/
 ++Index; /*0xffe5df85*/
 if ( Index >= 183 ) /*0xffe5df8b*/
 return 0; /*0xffe5df90*/
 }
 return &dword_FFE5EBD0[3 *Index]; /*0xffe5df8f*/
}

/*
 *PeiSelStatusCodeNotify at 0xffe5df9b
 */
int PeiSelStatusCodeNotify(int a1, int n2, int a3, int a4, int a5, int a6)
{
 int n2_1; // ebx int Result; // esi n2_1 = n2; /*0xffe5df9f*/
 Result = 0; /*0xffe5dfa6*/
 if ( (unsigned __int8)n2 == 1 || (unsigned __int8)n2 == 2 ) /*0xffe5dfb0*/
 {
 if ( !PeiSelLookupDataType(a3, (unsigned __int8)n2) ) /*0xffe5dfb5*/
 return -2147483634; /*0xffe5dfc3*/
 Result = (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)a1 + 32))(a1, &unk_FFE5EBA0, 0, 0, &n2); /*0xffe5dfda*/
 if ( Result >= 0 ) /*0xffe5dfe1*/
 return (*(int ( **)(int, int, int, int, int, int, int))(n2 + 8))(a1, n2, n2_1, a3, a4, a5, a6); /*0xffe5dffb*/
 }
 return Result; /*0xffe5e000*/
}

/*
 *PeiSelFindEventRecord at 0xffe5e004
 */
int PeiSelFindEventRecord(int a1, _BYTE *a2)
{
 int n512; // esi int result; // eax int Result; // eax int v6; // [esp-20h] [ebp-3Ch]
 _BYTE v7[2]; // [esp+Ch] [ebp-10h] BYREF int n5393475; // [esp+Eh] [ebp-Eh]
 _BYTE *v9; // [esp+14h] [ebp-8h] BYREF char n2; // [esp+19h] [ebp-3h] BYREF char v11; // [esp+1Ah] [ebp-2h] BYREF char v12; // [esp+1Bh] [ebp-1h] BYREF v9 = a2; /*0xffe5e00d*/
 n512 = 512; /*0xffe5e012*/
 n2 = 2; /*0xffe5e017*/
 while ( 1 ) /*0xffe5e026*/
 {
 v7[0] = *a2; /*0xffe5e026*/
 v7[1] = a2[1]; /*0xffe5e032*/
 v6 = *(_DWORD *)(a1 + 4); /*0xffe5e03e*/
 n5393475 = 5393475; /*0xffe5e03f*/
 v12 = 1; /*0xffe5e046*/
 if ( (*(int ( **)(int, int, _DWORD, int, _BYTE *, int, char *, char *))(v6 + 12))( /*0xffe5e052*/
 v6,
 10,
 0,
 71,
 v7,
 6,
 &v11,
 &v12) < 0 )
 {
 Result = *(_DWORD *)(a1 + 4); /*0xffe5e061*/
 if ( *(_BYTE *)(Result + 8) == 0xC5 ) /*0xffe5e068*/
 {
 result = (*(int ( **)(int, int, _DWORD, int, _DWORD, _DWORD, _BYTE **, char *))(Result + 12))( /*0xffe5e07a*/
 Result,
 10,
 0,
 66,
 0,
 0,
 &v9,
 &n2);
 if ( result < 0 ) /*0xffe5e082*/
 return result; /*0xffe5e082*/
 }
 }
 else if ( (v11 & 0xF) == 1 ) /*0xffe5e05b*/
 {
 return 0; /*0xffe5e05f*/
 }
 if ( !--n512 ) /*0xffe5e087*/
 break; /*0xffe5e087*/
 a2 = v9; /*0xffe5e089*/
 }
 return -2147483632; /*0xffe5e093*/
}

/*
 *PeiSelWriteEventRecord at 0xffe5e09a
 */
int __usercall PeiSelWriteEventRecord@<eax>(int a1@<edx>, int n2)
{
 int result; // eax char v4; // al char v5; // cl char v6; // dl int v7; // eax int v8; // eax int v9; // ecx char n0x80; // al bool v11; // zf _BYTE v12[13]; // [esp+8h] [ebp-28h] BYREF char v13; // [esp+15h] [ebp-1Bh]
 _BYTE v14[2]; // [esp+18h] [ebp-18h] BYREF int v15; // [esp+1Ah] [ebp-16h]
 _BYTE v16[2]; // [esp+20h] [ebp-10h] BYREF __int16 v17; // [esp+22h] [ebp-Eh]
 _BYTE v18[4]; // [esp+24h] [ebp-Ch] BYREF __int16 v19; // [esp+28h] [ebp-8h] BYREF char n2_2; // [esp+2Ch] [ebp-4h] BYREF char v21; // [esp+2Dh] [ebp-3h] BYREF char n2_1; // [esp+2Eh] [ebp-2h] BYREF char n14; // [esp+2Fh] [ebp-1h] BYREF n14 = 14; /*0xffe5e0a7*/
 n2_1 = 2; /*0xffe5e0ad*/
 v19 = 0; /*0xffe5e0b1*/
 v21 = 1; /*0xffe5e0b5*/
 n2_2 = 2; /*0xffe5e0b9*/
 if ( (_BYTE)n2 != 1 && (_BYTE)n2 != 2 ) /*0xffe5e0c5*/
 return -2147483646; /*0xffe5e0cc*/
 result = (*(int ( **)(_DWORD, int, _DWORD, int, _DWORD, _DWORD, _BYTE *, char *))(*(_DWORD *)(a1 + 4) + 12))( /*0xffe5e0e4*/
 *(_DWORD *)(a1 + 4),
 10,
 0,
 64,
 0,
 0,
 v12,
 &n14);
 if ( result >= 0 )
 {
 v4 = v13; /*0xffe5e0f2*/
 if ( (v13 & 2) != 0 ) /*0xffe5e0f7*/
 {
 result = (*(int ( **)(_DWORD, int, _DWORD, int, _DWORD, _DWORD, __int16 *, char *))(*(_DWORD *)(a1 + 4) + 12))( /*0xffe5e10e*/
 *(_DWORD *)(a1 + 4),
 10,
 0,
 66,
 0,
 0,
 &v19,
 &n2_1);
 if ( result < 0 ) /*0xffe5e116*/
 return result; /*0xffe5e116*/
 v5 = HIBYTE(v19); /*0xffe5e11c*/
 v6 = v19; /*0xffe5e11f*/
 v4 = v13; /*0xffe5e122*/
 }
 else
 {
 v6 = 0; /*0xffe5e127*/
 v19 = 0; /*0xffe5e129*/
 v5 = 0; /*0xffe5e12f*/
 }
 if ( (_BYTE)n2 == 1 ) /*0xffe5e134*/
 {
 v7 = *(_DWORD *)(a1 + 4); /*0xffe5e136*/
 v14[1] = v5; /*0xffe5e139*/
 v14[0] = v6; /*0xffe5e143*/
 v15 = -1437447101; /*0xffe5e14c*/
 if ( (*(int ( **)(int, int, _DWORD, int, _BYTE *, int, char *, char *))(v7 + 12))( /*0xffe5e16c*/
 v7,
 10,
 0,
 71,
 v14,
 6,
 (char *)&n2 + 3,
 &v21) >= 0
 && (HIBYTE(n2) & 0xF) == 1 )
 {
 return 0; /*0xffe5e16e*/
 }
 else
 {
 return PeiSelFindEventRecord(a1, &v19); /*0xffe5e177*/
 }
 }
 if ( (v4 & 8) == 0 )
 {
 PeiReportStatusWithAssert(0x80000000, " Deleting Single record is not supported. Status: EFI_UNSUPPORTED\n");
 return -2147483645; /*0xffe5e198*/
 }
 v8 = *(_DWORD *)(a1 + 4); /*0xffe5e19a*/
 v16[1] = v5; /*0xffe5e19d*/
 v16[0] = v6; /*0xffe5e1a7*/
 v17 = 0; /*0xffe5e1b9*/
 v9 = (*(int ( **)(int, int, _DWORD, int, _BYTE *, int, _BYTE *, char *))(v8 + 12))( /*0xffe5e1c0*/
 v8,
 10,
 0,
 70,
 v16,
 4,
 v18,
 &n2_2);
 if ( v9 >= 0 ) /*0xffe5e1c7*/
 {
 n0x80 = *(_BYTE *)(*(_DWORD *)(a1 + 4) + 8); /*0xffe5e1cc*/
 if ( n0x80 == (char)0x80 ) /*0xffe5e1cf*/
 return -2147483645; /*0xffe5e1d1*/
 v11 = n0x80 == -127; /*0xffe5e1d3*/
 result = -2147483642; /*0xffe5e1d5*/
 if ( v11 ) /*0xffe5e1da*/
 return result; /*0xffe5e1da*/
 }
 return v9; /*0xffe5e1dc*/
 }
 return result; /*0xffe5e1de*/
}

/*
 *PeiSelIsBootProgress at 0xffe5e1e4
 */
char __thiscall PeiSelIsBootProgress(_DWORD *this)
{
 int v1; // eax void *v2; // ecx int PcdPpi; // eax _BYTE v5[13]; // [esp+0h] [ebp-18h] BYREF unsigned __int8 Result; // [esp+Dh] [ebp-Bh]
 int v7; // [esp+10h] [ebp-8h]
 char n14; // [esp+17h] [ebp-1h] BYREF v1 = *(this + 1); /*0xffe5e1ea*/
 n14 = 14; /*0xffe5e1f4*/
 if ( (*(int ( **)(int, int, _DWORD, int, _DWORD, _DWORD, _BYTE *, char *))(v1 + 12))( /*0xffe5e20b*/
 v1,
 10,
 0,
 64,
 0,
 0,
 v5,
 &n14) < 0 )
 return 0; /*0xffe5e20d*/
 LOBYTE(v7) = Result & 8; /*0xffe5e216*/
 PcdPpi = PeiGetPcdPpi(v2); /*0xffe5e219*/
 (*(void ( **)(int, int))(PcdPpi + 60))(17, v7); /*0xffe5e223*/
 return Result >> 7; /*0xffe5e22e*/
}

/*
 *PeiSelBuildSmbiosRecord at 0xffe5e232
 */
int __usercall PeiSelBuildSmbiosRecord@<eax>(_DWORD *a1@<edx>, int a2, int n2, int a4)
{
 int *v5; // edi void *v6; // ecx int PcdPpi; // eax int v8; // eax int v9; // eax void *v11; // [esp-4h] [ebp-10h]
 void *v12; // [esp-4h] [ebp-10h]

 v5 = PeiSelLookupDataType(a2, n2); /*0xffe5e244*/
 if ( v5 ) /*0xffe5e248*/
 {
 if ( PeiSelIsBootProgress(a1) != 1 ) /*0xffe5e25a*/
 {
LABEL_8:
 *(_DWORD *)(a4 + 3) = 0; /*0xffe5e296*/
 *(_WORD *)a4 = 0; /*0xffe5e29f*/
 *(_BYTE *)(a4 + 2) = 2; /*0xffe5e2a2*/
 *(_WORD *)(a4 + 7) = 1; /*0xffe5e2a6*/
 *(_BYTE *)(a4 + 9) = 4; /*0xffe5e2aa*/
 *(_BYTE *)(a4 + 10) = *((_BYTE *)v5 + 8); /*0xffe5e2b1*/
 *(_WORD *)(a4 + 11) = 28416; /*0xffe5e2b4*/
 *(_BYTE *)(a4 + 13) = *((_BYTE *)v5 + 9); /*0xffe5e2bd*/
 *(_BYTE *)(a4 + 14) = *((_BYTE *)v5 + 10); /*0xffe5e2c3*/
 *(_BYTE *)(a4 + 15) = *((_BYTE *)v5 + 11); /*0xffe5e2c9*/
 return 0; /*0xffe5e2ce*/
 }
 PcdPpi = PeiGetPcdPpi(v6); /*0xffe5e25c*/
 if ( (*(unsigned __int8 ( **)(int))(PcdPpi + 4))(16) == 1 ) /*0xffe5e269*/
 {
 PeiSelWriteEventRecord((int)a1, 1); /*0xffe5e26c*/
 goto LABEL_8; /*0xffe5e26c*/
 }
 v8 = PeiGetPcdPpi(v11); /*0xffe5e26e*/
 if ( (*(unsigned __int8 ( **)(int))(v8 + 4))(17) ) /*0xffe5e275*/
 {
 v9 = PeiGetPcdPpi(v12); /*0xffe5e27d*/
 if ( (*(unsigned __int8 ( **)(int))(v9 + 4))(16) == 2 ) /*0xffe5e28a*/
 {
 PeiSelWriteEventRecord((int)a1, 2); /*0xffe5e290*/
 goto LABEL_8; /*0xffe5e290*/
 }
 }
 }
 return -2147483641; /*0xffe5e2d5*/
}

/*
 *PeiSelReportStatusCode at 0xffe5e2d9
 */
int PeiSelReportStatusCode(int a1, _BYTE *a2, unsigned __int8 n2, int a4)
{
 _BYTE *v5; // esi char v6; // cl char n3; // al bool v8; // dl bool v9; // zf int v10; // eax _BYTE Table[16]; // [esp+Ch] [ebp-18h] BYREF int v12; // [esp+1Ch] [ebp-8h] BYREF v12 = 0; /*0xffe5e2df*/
 if ( !a1 ) /*0xffe5e2e9*/
 return 0; /*0xffe5e2e9*/
 v5 = a2; /*0xffe5e2ef*/
 v6 = 1; /*0xffe5e2f4*/
 n3 = *a2; /*0xffe5e2f5*/
 v8 = *a2 == 1 || n3 == 3; /*0xffe5e303*/
 if ( n3 != 1 && n3 != 2 ) /*0xffe5e30b*/
 v6 = 0; /*0xffe5e30d*/
 if ( n2 == 1 ) /*0xffe5e318*/
 {
 v9 = !v8; /*0xffe5e323*/
 }
 else
 {
 if ( n2 != 2 ) /*0xffe5e31d*/
 goto LABEL_15; /*0xffe5e31d*/
 v9 = v6 == 0; /*0xffe5e31f*/
 }
 if ( v9 ) /*0xffe5e325*/
 return 0; /*0xffe5e2ed*/
LABEL_15:
 if ( PeiSelBuildSmbiosRecord(a2, a4, n2, (int)Table) < 0 ) /*0xffe5e33b*/
 return 0; /*0xffe5e33b*/
 v10 = *((_DWORD *)v5 + 1); /*0xffe5e33d*/
 HIBYTE(a1) = 2; /*0xffe5e347*/
 return (*(int ( **)(int, int, _DWORD, int, _BYTE *, int, int *, char *))(v10 + 12))( /*0xffe5e35f*/
 v10,
 10,
 0,
 68,
 Table,
 16,
 &v12,
 (char *)&a1 + 3);
}

/*
 *PeiSelStatusCodeEntry at 0xffe5e365
 */
int PeiSelStatusCodeEntry(int a1, int SystemTable)
{
 int result; // eax int Status; // eax int ReportStatusCodePpi; // eax void *v6; // ecx char v7; // al int PcdPpi; // eax int v9; // eax void *v10; // ecx int v11; // edi _DWORD *v12; // eax int Status; // eax int v14; // eax void *v15; // [esp-4h] [ebp-45Ch]
 int n1072; // [esp+14h] [ebp-444h] BYREF int ( **v17)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *); // [esp+18h] [ebp-440h] BYREF int v18; // [esp+1Ch] [ebp-43Ch]
 int v19; // [esp+20h] [ebp-438h] BYREF void ( **v20)(int ( *)(int, int, int, int, int, int)); // [esp+24h] [ebp-434h] BYREF _BYTE v21[2]; // [esp+28h] [ebp-430h] BYREF __int16 v22; // [esp+2Ah] [ebp-42Eh]
 char v23; // [esp+2Ch] [ebp-42Ch]
 char n2; // [esp+2Dh] [ebp-42Bh]

 result = (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)SystemTable + 32))( /*0xffe5e388*/
 SystemTable,
 &unk_FFE5EB70,
 0,
 0,
 &v19);
 if ( result < 0 ) /*0xffe5e390*/
 return result; /*0xffe5e390*/
 Status = (*(int ( **)(int, void *, _DWORD, _DWORD, int ( ***)(_DWORD, const __int16 *, void *, _DWORD, int *, _BYTE *)))(*(_DWORD *)SystemTable + 32))( /*0xffe5e3a5*/
 SystemTable,
 &unk_FFE5EB50,
 0,
 0,
 &v17);
 if ( Status >= 0 ) /*0xffe5e3b2*/
 {
 n1072 = 1072; /*0xffe5e3e7*/
 if ( (*v17)(v17, L"ServerSetup", &unk_FFE5EB90, 0, &n1072, v21) >= 0 ) /*0xffe5e40c*/
 {
 v7 = v23; /*0xffe5e422*/
 goto LABEL_8; /*0xffe5e422*/
 }
 }
 else
 {
 PeiReportStatusWithAssert(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe5e3bf*/
 ReportStatusCodePpi = PeiGetReportStatusCodePpi(); /*0xffe5e3c7*/
 if ( ReportStatusCodePpi ) /*0xffe5e3ce*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe5e3db*/
 "e:\\hs\\AmiIpmiPkg\\Ipmi\\PeiSelStatusCode\\PeiSelStatusCode.c",
 746,
 "!EFI_ERROR (Status)");
 }
 v7 = 0; /*0xffe5e40e*/
 v22 = 1; /*0xffe5e410*/
 v23 = 0; /*0xffe5e417*/
 n2 = 2; /*0xffe5e41b*/
LABEL_8:
 LOBYTE(v18) = v7; /*0xffe5e426*/
 PcdPpi = PeiGetPcdPpi(v6); /*0xffe5e42a*/
 (*(void ( **)(int, int))(PcdPpi + 60))(16, v18); /*0xffe5e435*/
 if ( !(_BYTE)v22 || !n2 ) /*0xffe5e448*/
 return -2147483645; /*0xffe5e506*/
 v9 = PeiPcdAllocZeroBufChecked(v15); /*0xffe5e44e*/
 v11 = v9; /*0xffe5e453*/
 if ( !v9 ) /*0xffe5e457*/
 return -2147483639; /*0xffe5e457*/
 *(_BYTE *)v9 = n2; /*0xffe5e467*/
 *(_DWORD *)(v9 + 4) = v19; /*0xffe5e46d*/
 *(_DWORD *)(v9 + 8) = PeiSelReportStatusCode; /*0xffe5e470*/
 v12 = (_DWORD *)PeiPcdAllocZeroBufChecked(v10); /*0xffe5e477*/
 if ( !v12 ) /*0xffe5e480*/
 return -2147483639; /*0xffe5e459*/
 *v12 = -2147483632; /*0xffe5e482*/
 v12[1] = &unk_FFE5EBA0; /*0xffe5e488*/
 v12[2] = v11; /*0xffe5e48f*/
 result = (*(int ( **)(int, _DWORD *))(*(_DWORD *)SystemTable + 24))(SystemTable, v12); /*0xffe5e496*/
 if ( result >= 0 ) /*0xffe5e49d*/
 {
 Status = (*(int ( **)(int, void *))(*(_DWORD *)SystemTable + 36))(SystemTable, &unk_FFE5EBC0); /*0xffe5e4a7*/
 if ( Status < 0 ) /*0xffe5e4ae*/
 {
 PeiReportStatusWithAssert(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe5e4bb*/
 v14 = PeiGetReportStatusCodePpi(); /*0xffe5e4c3*/
 if ( v14 ) /*0xffe5e4ca*/
 (*(void ( **)(const char *, int, const char *))(v14 + 4))( /*0xffe5e4d7*/
 "e:\\hs\\AmiIpmiPkg\\Ipmi\\PeiSelStatusCode\\PeiSelStatusCode.c",
 826,
 "!EFI_ERROR (Status)");
 }
 if ( (*(int ( **)(int, void *, _DWORD, _DWORD, void ( ***)(int ( *)(int, int, int, int, int, int))))(*(_DWORD *)SystemTable + 32))( /*0xffe5e4f4*/
 SystemTable,
 &unk_FFE5EB40,
 0,
 0,
 &v20) >= 0 )
 (*v20)(PeiSelStatusCodeNotify); /*0xffe5e4ff*/
 return 0; /*0xffe5e502*/
 }
 return result; /*0xffe5e50b*/
}

/*
 *PeiGetPcdPpi at 0xffe5e513
 */
void *__thiscall PeiGetPcdPpi(void *this)
{
 int ServicesTable; // eax int Status; // eax int ReportStatusCodePpi; // eax void *this_1; // [esp+0h] [ebp-4h]

 this_1 = this; /*0xffe5e516*/
 ServicesTable = PeiGetServicesTable(); /*0xffe5e517*/
 Status = (*(int (__stdcall **)(int))(*(_DWORD *)ServicesTable + 32))(ServicesTable); /*0xffe5e52c*/
 if ( Status < 0 ) /*0xffe5e534*/
 {
 PeiReportStatusWithAssert(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe5e541*/
 ReportStatusCodePpi = PeiGetReportStatusCodePpi(); /*0xffe5e549*/
 if ( ReportStatusCodePpi ) /*0xffe5e550*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe5e55e*/
 "e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c",
 49,
 "!EFI_ERROR (Status)");
 }
 return this_1; /*0xffe5e569*/
}

/*
 *PeiPcdAllocZeroBuffer at 0xffe5e56b
 */
void *__thiscall PeiPcdAllocZeroBuffer(void *this)
{
 int ServicesTable; // eax ServicesTable = PeiGetServicesTable(); /*0xffe5e56f*/
 if ( (*(int (__stdcall **)(int))(*(_DWORD *)ServicesTable + 76))(ServicesTable) >= 0 ) /*0xffe5e585*/
 return this; /*0xffe5e58b*/
 else return 0; /*0xffe5e587*/
}

/*
 *PeiPcdAllocZeroBufChecked at 0xffe5e592
 */
int __thiscall PeiPcdAllocZeroBufChecked(void *this)
{
 int buf_1; // eax void *buf; // esi int ReportStatusCodePpi; // eax buf_1 = (int)PeiPcdAllocZeroBuffer(this); /*0xffe5e592*/
 if ( buf_1 ) /*0xffe5e599*/
 {
 buf = (void *)buf_1; /*0xffe5e66c*/
 if ( (unsigned int)-buf_1 < 0xC ) /*0xffe5e696*/
 {
 ReportStatusCodePpi = PeiGetReportStatusCodePpi(); /*0xffe5e698*/
 if ( ReportStatusCodePpi ) /*0xffe5e69f*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe5e6a9*/
 "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
 54,
 "Length <= (0xFFFFFFFF - (UINTN)Buffer + 1)");
 }
 return (int)InternalMemSet(buf, 0xCu); /*0xffe5e6b2*/
 }
 return buf_1; /*0xffe5e5a2*/
}

/*
 *PeiGetReportStatusCodePpi at 0xffe5e5a3
 */
int PeiGetReportStatusCodePpi()
{
 int ServicesTable; // eax int v2; // [esp+0h] [ebp-8h] BYREF int Result; // [esp+4h] [ebp-4h] BYREF ServicesTable = PeiGetServicesTable(); /*0xffe5e5a8*/
 if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)ServicesTable + 32))( /*0xffe5e5c7*/
 ServicesTable,
 &unk_FFE5EB60,
 0,
 &v2,
 &Result) >= 0 )
 return Result; /*0xffe5e5cd*/
 else return 0; /*0xffe5e5c9*/
}

/*
 *PeiReportStatusWithAssert at 0xffe5e5d4
 */
int PeiReportStatusWithAssert(int a1, const char *_nASSERT_EFI_ERROR_(Status___%r)_n, ...)
{
 int result; // eax int ( **v3)(int, const char *, char *); // esi va_list va; // [esp+10h] [ebp+Ch] BYREF va_start(va, _nASSERT_EFI_ERROR_(Status___%r)_n);
 result = PeiGetReportStatusCodePpi(); /*0xffe5e5d5*/
 v3 = (int ( **)(int, const char *, char *))result; /*0xffe5e5da*/
 if ( result ) /*0xffe5e5de*/
 {
 result = PeiCheckManufacturingMode(); /*0xffe5e5e0*/
 if ( (result & a1) != 0 ) /*0xffe5e5eb*/
 return (*v3)(a1, _nASSERT_EFI_ERROR_(Status___%r)_n, (char *)va); /*0xffe5e5f7*/
 }
 return result; /*0xffe5e5fc*/
}

/*
 *PeiAssertWithReport at 0xffe5e5fe
 */
int PeiAssertWithReport(
 int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 int n48,
 int PeiServices____((void__)_0))
{
 int result; // eax result = PeiGetReportStatusCodePpi(); /*0xffe5e604*/
 if ( result ) /*0xffe5e60b*/
 return (*(int ( **)(int, int, int))(result + 4))( /*0xffe5e613*/
 e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 n48,
 PeiServices____((void__)_0));
 return result; /*0xffe5e619*/
}

/*
 *PeiCheckManufacturingMode at 0xffe5e61c
 */
int PeiCheckManufacturingMode()
{
 unsigned __int8 v0; // al char Result; // al char n3_1; // cl v0 = __inbyte(0x70u); /*0xffe5e622*/
 __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe5e627*/
 Result = __inbyte(0x71u); /*0xffe5e62e*/
 n3_1 = Result; /*0xffe5e62f*/
 if ( (unsigned __int8)Result <= 3u ) /*0xffe5e634*/
 {
LABEL_4:
 if ( !n3_1 ) /*0xffe5e64f*/
 return 0; /*0xffe5e64f*/
 goto LABEL_5; /*0xffe5e64f*/
 }
 n3_1 = Result; /*0xffe5e636*/
 if ( !Result ) /*0xffe5e63e*/
 {
 n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe5e64a*/
 goto LABEL_4; /*0xffe5e64a*/
 }
LABEL_5:
 if ( n3_1 != -1 )
 return n3_1 != 1 ? -2147483578 : -2147483644;
 return 0; /*0xffe5e667*/
}

/*
 *PeiGetServicesTable at 0xffe5e6bc
 */
int PeiGetServicesTable()
{
 int Result; // esi _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF int v3; // [esp+6h] [ebp-6h]

 PeiReadIdtForServices(v2); /*0xffe5e6c5*/
 Result = *(_DWORD *)(v3 - 4); /*0xffe5e6cd*/
 if ( !Result ) /*0xffe5e6d2*/
 PeiAssertWithReport( /*0xffe5e6e1*/
 (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c",
 48,
 (int)"PeiServices != ((void *) 0)");
 return Result; /*0xffe5e6e9*/
}

/*
 *PeiReadIdtForServices at 0xffe5e6ee
 */
void *__thiscall PeiReadIdtForServices(void *this)
{
 void *this_1; // eax if ( !this ) /*0xffe5e6f4*/
 PeiAssertWithReport((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); /*0xffe5e703*/
 this_1 = this; /*0xffe5e709*/
 __sidt(this); /*0xffe5e70c*/
 return this_1; /*0xffe5e710*/
}