//
// AmiTcgPlatformPeiBeforeMem.efi - Full Decompilation
// Source: IDA Pro MCP port 13378
// Functions: 15
//
#include <Uefi.h>
#include <PiPei.h>
{"addr":"0xffe18704","code":"void *SetMem(void *buf, unsigned int count, char value)\n{\n memset(buf, value, count); /*0xffe18711*/\n return buf; /*0xffe18717*/\n}"}
{"addr":"0xffe18724","code":"int SetMem32(int Buffer, int Count, int ValueLow, int ValueHigh)\n{\n do /*0xffe1873d*/\n {\n *(_DWORD *)(Buffer + 8 *Count - 8) = ValueLow; /*0xffe18735*/\n *(_DWORD *)(Buffer + 8 *Count-- - 4) = ValueHigh; /*0xffe18739*/\n }\n while ( Count ); /*0xffe1873d*/\n return Buffer; /*0xffe18741*/\n}"}
{"addr":"0xffe18744","code":"void *SetMem64(void *buf, unsigned int count, int value)\n{\n memset32(buf, value, count); /*0xffe18751*/\n return buf; /*0xffe18757*/\n}"}
{"addr":"0xffe18764","code":"char *CopyMem(char *dst, char *src, unsigned int count)\n{\n unsigned int count_1; // edx\n char *dst_1; // edi\n char *src_1; // esi\n\n count_1 = count; /*0xffe1876e*/\n if ( src < dst && &src[count - 1] >= dst ) /*0xffe1877c*/\n {\n src_1 = &src[count - 1]; /*0xffe18790*/\n dst_1 = &dst[count - 1]; /*0xffe18792*/\n }\n else\n {\n count_1 = count & 3; /*0xffe18780*/\n qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe18789*/\n src_1 = &src[4 * (count >> 2)]; /*0xffe18789*/\n dst_1 = &dst[4 * (count >> 2)]; /*0xffe18789*/\n }\n qmemcpy(dst_1, src_1, count_1); /*0xffe18799*/\n return dst; /*0xffe187a0*/\n}"}
{"addr":"0xffe187c4","code":"EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)\n{\n void *PeiServices; // ecx\n void *PeiServices2; // ecx\n void *v4; // ecx\n int PcdPointer; // eax\n\n if ( *(char *)(GetPcdPointer(PeiServices) + 1024068) >= 0 ) /*0xffe187d4*/\n {\n WriteCmosTpmStatus(PeiServices2); /*0xffe187d6*/\n PcdPointer = GetPcdPointer(v4); /*0xffe187db*/\n *(_BYTE *)(PcdPointer + 1024068) |= 0x80u; /*0xffe187e6*/\n }\n return (*(int ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 24))( /*0xffe187fa*/\n SystemTable,\n &unk_FFE18E14);\n}","refs":[{"addr":"0xffe18a07","name":"WriteCmosTpmStatus"},{"addr":"0xffe189fb","name":"GetPcdPointer"},{"addr":"0xffe18e14","name":"unk_FFE18E14"}]}
{"addr":"0xffe187fc","code":"int PlatformTcgPolicyInstallOrLocate(int PeiServices)\n{\n int PeiServices_1; // esi\n int Status; // eax\n int Status_1; // esi\n int ReportPpi; // eax\n int TpmSpecDetected; // [esp+8h] [ebp-4h] BYREF\n\n PeiServices_1 = PeiServices; /*0xffe18801*/\n (*(void ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)PeiServices + 32))( /*0xffe18815*/\n PeiServices,\n &unk_FFE18DF4,\n 0,\n 0,\n &PeiServices);\n if ( (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)PeiServices_1 + 32))( /*0xffe1882e*/\n PeiServices_1,\n &unk_FFE18DD4,\n 0,\n 0,\n &PeiServices) >= 0 )\n return (*(int ( **)(int))PeiServices)(PeiServices_1); /*0xffe18834*/\n Status = (*(int ( **)(int, int *))(*(_DWORD *)PeiServices_1 + 40))(PeiServices_1, &TpmSpecDetected); /*0xffe18840*/\n Status_1 = Status; /*0xffe18843*/\n if ( Status < 0 ) /*0xffe18849*/\n {\n DebugAssert(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status); /*0xffe18856*/\n ReportPpi = LocateReportStatusCodePpi(); /*0xffe1885e*/\n if ( ReportPpi ) /*0xffe18865*/\n (*(void ( **)(const char *, int, const char *))(ReportPpi + 4))( /*0xffe18873*/\n \"e:\\\\hs\\\\AmiModulePkg\\\\TCG2\\\\Common\\\\AmiTcgPlatformPei\\\\AmiTcgPlatformPeiBeforeMem.c\",\n 119,\n \"!EFI_ERROR (Status)\");\n }\n if ( TpmSpecDetected == 17 || TpmSpecDetected == 32 ) /*0xffe18883*/\n return Status_1; /*0xffe18889*/\n else\n return 0; /*0xffe18885*/\n}","refs":[{"addr":"0xffe18df4","name":"unk_FFE18DF4"},{"addr":"0xffe18dd4","name":"unk_FFE18DD4"},{"addr":"0xffe188c2","name":"DebugAssert"},{"addr":"0xffe18891","name":"LocateReportStatusCodePpi"}]}
{"addr":"0xffe18891","code":"int LocateReportStatusCodePpi()\n{\n int PeiServices; // eax\n _BYTE Status[4]; // [esp+0h] [ebp-8h] BYREF\n int ReportPpi; // [esp+4h] [ebp-4h] BYREF\n\n PeiServices = GetPeiServicesTablePointer(); /*0xffe18896*/\n if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServices + 32))( /*0xffe188b5*/\n PeiServices,\n &unk_FFE18DC4,\n 0,\n Status,\n &ReportPpi) >= 0 )\n return ReportPpi; /*0xffe188bb*/\n else\n return 0; /*0xffe188b7*/\n}","refs":[{"addr":"0xffe189a6","name":"GetPeiServicesTablePointer"},{"addr":"0xffe18dc4","name":"unk_FFE18DC4"}]}
{"addr":"0xffe188c2","code":"int DebugAssert(int Expression, const char *_nASSERT_EFI_ERROR_(Status___%r)_n, ...)\n{\n int Status; // eax\n int ( **Status_1)(int, const char *, char *); // esi\n va_list va; // [esp+10h] [ebp+Ch] BYREF\n\n va_start(va, _nASSERT_EFI_ERROR_(Status___%r)_n);\n Status = LocateReportStatusCodePpi(); /*0xffe188c3*/\n Status_1 = (int ( **)(int, const char *, char *))Status; /*0xffe188c8*/\n if ( Status ) /*0xffe188cc*/\n {\n Status = CheckTpmPresenceViaCmos(); /*0xffe188ce*/\n if ( (Status & Expression) != 0 ) /*0xffe188d9*/\n return (*Status_1)(Expression, _nASSERT_EFI_ERROR_(Status___%r)_n, (char *)va); /*0xffe188e5*/\n }\n return Status; /*0xffe188ea*/\n}","refs":[{"addr":"0xffe18891","name":"LocateReportStatusCodePpi"},{"addr":"0xffe1890a","name":"CheckTpmPresenceViaCmos"}]}
{"addr":"0xffe188ec","code":"int ReportStatusCodeWithProtocol(\n int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n int n48,\n int PeiServices____((void__)_0))\n{\n int ReportPpi; // eax\n\n ReportPpi = LocateReportStatusCodePpi(); /*0xffe188f2*/\n if ( ReportPpi ) /*0xffe188f9*/\n return (*(int ( **)(int, int, int))(ReportPpi + 4))( /*0xffe18901*/\n e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,\n n48,\n PeiServices____((void__)_0));\n return ReportPpi; /*0xffe18907*/\n}","refs":[{"addr":"0xffe18891","name":"LocateReportStatusCodePpi"}]}
{"addr":"0xffe1890a","code":"int CheckTpmPresenceViaCmos()\n{\n unsigned __int8 CmosReg; // al\n char TpmStatus; // al\n char TpmStatus_1; // cl\n\n CmosReg = __inbyte(0x70u); /*0xffe18910*/\n __outbyte(0x70u, CmosReg & 0x80 | 0x4A); /*0xffe18915*/\n TpmStatus = __inbyte(0x71u); /*0xffe1891c*/\n TpmStatus_1 = TpmStatus; /*0xffe1891d*/\n if ( (unsigned __int8)TpmStatus <= 3u ) /*0xffe18922*/\n {\nLABEL_4:\n if ( !TpmStatus_1 ) /*0xffe1893d*/\n return 0; /*0xffe1893d*/\n goto LABEL_5; /*0xffe1893d*/\n }\n TpmStatus_1 = n3; /*0xffe18924*/\n if ( !n3 ) /*0xffe1892c*/\n {\n TpmStatus_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe18938*/\n goto LABEL_4; /*0xffe18938*/\n }\nLABEL_5:\n if ( TpmStatus_1 != -1 )\n return TpmStatus_1 != 1 ? -2147483578 : -2147483644;\n return 0; /*0xffe18955*/\n}","refs":[{"addr":"0xffe18e24","name":"TpmDetectResult"}]}
{"addr":"0xffe189a6","code":"int GetPeiServicesTablePointer()\n{\n int PeiServices; // esi\n _BYTE Idtr[2]; // [esp+4h] [ebp-8h] BYREF\n int IdtrBase; // [esp+6h] [ebp-6h]\n\n ReadIdtr(Idtr); /*0xffe189af*/\n PeiServices = *(_DWORD *)(IdtrBase - 4); /*0xffe189b7*/\n if ( !PeiServices ) /*0xffe189bc*/\n ReportStatusCodeWithProtocol( /*0xffe189cb*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiServicesTablePointerLibIdt\\\\PeiServicesTablePointer.c\",\n 48,\n (int)\"PeiServices != ((void *) 0)\");\n return PeiServices; /*0xffe189d3*/\n}","refs":[{"addr":"0xffe189d8","name":"ReadIdtr"},{"addr":"0xffe188ec","name":"ReportStatusCodeWithProtocol"}]}
{"addr":"0xffe189d8","code":"void *__thiscall ReadIdtr(void *this)\n{\n void *this_1; // eax\n\n if ( !this ) /*0xffe189de*/\n ReportStatusCodeWithProtocol( /*0xffe189ed*/\n (int)\"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseLib\\\\X86ReadIdtr.c\",\n 37,\n (int)\"Idtr != ((void *) 0)\");\n this_1 = this; /*0xffe189f3*/\n __sidt(this); /*0xffe189f6*/\n return this_1; /*0xffe189fa*/\n}","refs":[{"addr":"0xffe188ec","name":"ReportStatusCodeWithProtocol"}]}
{"addr":"0xffe189fb","code":"int __thiscall GetPcdPointer(void *this)\n{\n int ( **Bool)(int); // eax\n\n Bool = (int ( **)(int))PeiPcdGetBool(this); /*0xffe189fb*/\n return Bool[4](5); /*0xffe18a06*/\n}","refs":[{"addr":"0xffe18a18","name":"PeiPcdGetBool"}]}
{"addr":"0xffe18a07","code":"int __thiscall WriteCmosTpmStatus(void *this)\n{\n int v1; // ebx\n int ReportStatusCodePpi; // eax\n\n v1 = GetPcdPointer(this) + 1024064; /*0xffe18977*/\n if ( (v1 & 1) != 0 ) /*0xffe1897c*/\n {\n ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe1897e*/\n if ( ReportStatusCodePpi ) /*0xffe18985*/\n (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe18996*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\BaseIoLibIntrinsic\\\\IoLib.c\",\n 183,\n \"(Address & 1) == 0\");\n }\n *(_WORD *)v1 = 1280; /*0xffe189a1*/\n return 1280; /*0xffe189a5*/\n}","refs":[{"addr":"0xffe189fb","name":"GetPcdPointer"},{"addr":"0xffe18891","name":"LocateReportStatusCodePpi"}]}
{"addr":"0xffe18a18","code":"void *__thiscall PeiPcdGetBool(void *PcdToken)\n{\n int PeiServices; // eax\n int Status; // eax\n int ReportPpi; // eax\n void *PcdToken_1; // [esp+0h] [ebp-4h]\n\n PcdToken_1 = PcdToken; /*0xffe18a1b*/\n PeiServices = GetPeiServicesTablePointer(); /*0xffe18a1c*/\n Status = (*(int (__stdcall **)(int))(*(_DWORD *)PeiServices + 32))(PeiServices); /*0xffe18a31*/\n if ( Status < 0 ) /*0xffe18a39*/\n {\n DebugAssert(0x80000000, \"\\nASSERT_EFI_ERROR (Status = %r)\\n\", Status); /*0xffe18a46*/\n ReportPpi = LocateReportStatusCodePpi(); /*0xffe18a4e*/\n if ( ReportPpi ) /*0xffe18a55*/\n (*(void ( **)(const char *, int, const char *))(ReportPpi + 4))( /*0xffe18a63*/\n \"e:\\\\hs\\\\MdePkg\\\\Library\\\\PeiPcdLib\\\\PeiPcdLib.c\",\n 49,\n \"!EFI_ERROR (Status)\");\n }\n return PcdToken_1; /*0xffe18a6e*/\n}","refs":[{"addr":"0xffe189a6","name":"GetPeiServicesTablePointer"},{"addr":"0xffe188c2","name":"DebugAssert"},{"addr":"0xffe18891","name":"LocateReportStatusCodePpi"}]}