Newer
Older
AMI-Aptio-BIOS-Reversed / PlatformEarlyInit / PlatformEarlyInit.c
@Ajax Dong Ajax Dong 2 days ago 9 KB Init
/*
 *PlatformEarlyInit.c
 *PlatformEarlyInit PEI module decompiled from IDA
 */

#include "PlatformEarlyInit.h"

// EarlyInit_Prolog @ 0xffdcffe4 char *EarlyInit_Prolog(char *dst, char *src, unsigned int count)
{
 unsigned int count_1; // edx char *dst_1; // edi char *src_1; // esi count_1 = count; /*0xffdcffee*/
 if ( src < dst && &src[count - 1] >= dst ) /*0xffdcfffc*/
 {
 src_1 = &src[count - 1]; /*0xffdd0010*/
 dst_1 = &dst[count - 1]; /*0xffdd0012*/
 }
 else
 {
 count_1 = count & 3; /*0xffdd0000*/
 qmemcpy(dst, src, 4 * (count >> 2)); /*0xffdd0009*/
 src_1 = &src[4 * (count >> 2)]; /*0xffdd0009*/
 dst_1 = &dst[4 * (count >> 2)]; /*0xffdd0009*/
 }
 qmemcpy(dst_1, src_1, count_1); /*0xffdd0019*/
 return dst; /*0xffdd0020*/
}

// EarlyInit_Sub1 @ 0xffdd0024 int EarlyInit_Sub1(_BYTE *a1, _BYTE *a2, int n4096)
{
 bool v6; // zf do /*0xffdd0032*/
 {
 if ( !n4096 ) /*0xffdd0032*/
 break; /*0xffdd0032*/
 v6 = *a1++ == *a2++; /*0xffdd0032*/
 --n4096; /*0xffdd0032*/
 }
 while ( v6 ); /*0xffdd0032*/
 return (unsigned __int8)*(a1 - 1) - (unsigned __int8)*(a2 - 1); /*0xffdd003e*/
}

// EarlyInit_Sub2 @ 0xffdd0044 void *EarlyInit_Sub2(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffdd0051*/
 return buf; /*0xffdd0057*/
}

// EarlyInit_Sub3 @ 0xffdd0064 void *EarlyInit_Sub3(void *buf, unsigned int count)
{
 memset(buf, 0, count); /*0xffdd007b*/
 return buf; /*0xffdd0082*/
}

// EarlyInit_PpiInstall @ 0xffdd0084 int EarlyInit_PpiInstall(int a1, int a2, int a3, int a4)
{
 do /*0xffdd009d*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffdd0095*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffdd0099*/
 }
 while ( a2 ); /*0xffdd009d*/
 return a1; /*0xffdd00a1*/
}

// EarlyInit_PpiNotify @ 0xffdd00a4 void *EarlyInit_PpiNotify(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffdd00b1*/
 return buf; /*0xffdd00b7*/
}

// _ModuleEntryPoint @ 0xffdd0140 EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 int Status; // ebp void *v3; // ecx void *v4; // ecx int Msr; // eax int Signature; // eax int GuidHob; // eax int ErrorLevel; // eax char v9; // al _WORD *v10; // eax unsigned __int8 *Ppi; // eax int ErrorLevel; // eax int Status; // eax void *v15; // ecx int ErrorLevel; // eax int n2_1; // esi int v18; // eax int Status; // eax EFI_STATUS Status; // esi int ErrorLevel; // eax int Size; // eax unsigned __int8 ErrorLevel; // al int v24; // ecx char v25; // bl int v26; // eax char v27; // cl char v28; // cl unsigned __int16 n1284_1; // si unsigned __int32 CpuReg; // eax int v31; // eax int Status; // eax int ErrorLevel; // eax int inited; // eax void *v35; // ecx int ErrorLevel; // eax int v37; // eax void *count; // [esp+0h] [ebp-54F0h]
 unsigned __int16 Device; // [esp+18h] [ebp-54D8h] BYREF int v40[2]; // [esp+1Ch] [ebp-54D4h] BYREF int v41[2]; // [esp+24h] [ebp-54CCh] BYREF char dst_2[104]; // [esp+84h] [ebp-546Ch] BYREF char dst_3[199]; // [esp+ECh] [ebp-5404h] BYREF unsigned __int8 v44; // [esp+1B3h] [ebp-533Dh]
 char dst_1[1496]; // [esp+394h] [ebp-515Ch] BYREF char dst[8512]; // [esp+96Ch] [ebp-4B84h] BYREF char src[8510]; // [esp+2AACh] [ebp-2A44h] BYREF char src_3[446]; // [esp+4BEAh] [ebp-906h] BYREF unsigned __int8 n2; // [esp+4DA8h] [ebp-748h]
 char src_1[1495]; // [esp+4E8Eh] [ebp-662h] BYREF char src_2[135]; // [esp+5465h] [ebp-8Bh] BYREF int v52; // [esp+54ECh] [ebp-4h]

 if ( Util_ReadPciConfig(0xFA044u) >= 0 ) /*0xffdd014f*/
 {
 Util_WriteMsr(v3); /*0xffdd0151*/
 Msr = Util_ReadMsr(v4); /*0xffdd0156*/
 *(_BYTE *)(Msr + 1024068) |= 0x80u; /*0xffdd0162*/
 }
 v52 = Status; /*0xffdd04f7*/
 Signature = SystemTable->Hdr.Signature; /*0xffdd0509*/
 v40[0] = 2; /*0xffdd0512*/
 v41[1] = 0; /*0xffdd0523*/
 v40[1] = 0; /*0xffdd0529*/
 (*(void ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int *))(Signature + 32))( /*0xffdd052d*/
 SystemTable,
 &unk_FFDDE954,
 0,
 0,
 v41);
 GuidHob = HobLib_CreateGuidHob(src); /*0xffdd053a*/
 if ( GuidHob < 0 ) /*0xffdd054b*/
 {
 Debug_AssertPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", GuidHob); /*0xffdd0554*/
 ErrorLevel = Debug_AssertBreak(); /*0xffdd055c*/
 if ( ErrorLevel ) /*0xffdd0563*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd0570*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 694,
 "!EFI_ERROR (Status)");
 }
 MemoryInit_ZeroBuffer(dst, src, 0x213Eu); /*0xffdd0589*/
 MemoryInit_ZeroBuffer(dst_1, src_1, 0x5D7u); /*0xffdd05a3*/
 MemoryInit_ZeroBuffer(dst_2, src_2, 0x67u); /*0xffdd05b9*/
 MemoryInit_ZeroBuffer(dst_3, src_3, 0x2A4u); /*0xffdd05d3*/
 if ( dst_1[21] ) /*0xffdd05e8*/
 v9 = MEMORY[0xFDEF274D] | 8; /*0xffdd05ee*/
 else v9 = MEMORY[0xFDEF274D] & 0xF7; /*0xffdd05ea*/
 MEMORY[0xFDEF274D] = v9; /*0xffdd05f0*/
 v10 = (_WORD *)HobLib_GetGuidHob(); /*0xffdd05f5*/
 Ppi = (unsigned __int8 *)EarlyInit_FindPpi((int)&unk_FFDDE894, v10); /*0xffdd0601*/
 if ( Ppi )
 {
 Status = Debug_ReportStatus(Ppi + 24); /*0xffdd0631*/
 if ( Status < 0 ) /*0xffdd0638*/
 {
 Debug_AssertPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffdd0641*/
 ErrorLevel = Debug_AssertBreak(); /*0xffdd0649*/
 if ( ErrorLevel ) /*0xffdd0650*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd065d*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 735,
 "!EFI_ERROR (Status)");
 }
 if ( n2 == 2 ) /*0xffdd066c*/
 {
 PchCycleDecode_Helper((int)v15, v40); /*0xffdd0672*/
 n2_1 = v40[0]; /*0xffdd0677*/
 }
 else
 {
 n2_1 = n2; /*0xffdd067d*/
 v40[0] = n2; /*0xffdd0680*/
 }
 v18 = Util_CheckCapability(v15); /*0xffdd0684*/
 Status = (*(int ( **)(int, int))(v18 + 80))(21, n2_1); /*0xffdd068c*/
 Status = Status; /*0xffdd068f*/
 if ( Status >= 0 )
 {
 Size = Util_CheckCapability(count); /*0xffdd06c7*/
 ErrorLevel = (*(int ( **)(int))(Size + 24))(21); /*0xffdd06ce*/
 Debug_AssertPrint(64, "PcdDfxAdvDebugJumper: %d\n", ErrorLevel);
 PchInitPeim_Sub1(v24, v41[0]); /*0xffdd06ec*/
 HobLib_BuildResource((int)dst_1); /*0xffdd0700*/
 v25 = dst_1[1251]; /*0xffdd0705*/
 v26 = Util_CheckBiosLock(2); /*0xffdd0711*/
 v27 = *(_BYTE *)(v26 + 164); /*0xffdd0717*/
 if ( v25 == 1 ) /*0xffdd0720*/
 v28 = v27 | 1; /*0xffdd0722*/
 else v28 = v27 & 0xFE; /*0xffdd0726*/
 *(_BYTE *)(v26 + 164) = v28; /*0xffdd0729*/
 PchCycleDecode_Sub1(&Device); /*0xffdd0733*/
 n1284_1 = Device; /*0xffdd0738*/
 if ( (Util_GetPciReg(Device) & 0x8000u) == 0 ) /*0xffdd074c*/
 {
 CpuReg = Util_GetCpuReg(n1284_1 + 4); /*0xffdd0751*/
 Util_SetCpuReg(n1284_1 + 4, CpuReg | 0x1C00); /*0xffdd0760*/
 }
 v31 = Util_LockPamReg(); /*0xffdd0765*/
 Status = (*(int ( **)(int, void *))(*(_DWORD *)v31 + 24))(v31, &unk_FFDDEA8C); /*0xffdd0772*/
 if ( Status < 0 ) /*0xffdd077e*/
 {
 Debug_AssertPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffdd0787*/
 ErrorLevel = Debug_AssertBreak(); /*0xffdd078f*/
 if ( ErrorLevel ) /*0xffdd079b*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd07a8*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 780,
 "!EFI_ERROR (Status)");
 }
 inited = PchInitPeim_Sub2(); /*0xffdd07b5*/
 if ( inited >= 0 ) /*0xffdd07bc*/
 {
 if ( v44 ) /*0xffdd07f4*/
 {
 if ( v44 != 1 && (unsigned int)v44 - 2 >= 2 ) /*0xffdd07fe*/
 {
 v37 = Util_CheckCapability(v35); /*0xffdd0805*/
 if ( (*(unsigned __int8 ( **)(int))(v37 + 24))(21) ) /*0xffdd080c*/
 Debug_AssertPrint(64, "Advanced Debug Jumper set - Set Debug Msg Level to Normal\n"); /*0xffdd081b*/
 }
 }
 }
 else
 {
 Debug_AssertPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", inited); /*0xffdd07c5*/
 ErrorLevel = Debug_AssertBreak(); /*0xffdd07cd*/
 if ( ErrorLevel ) /*0xffdd07d4*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd07e1*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 803,
 "!EFI_ERROR (Status)");
 }
 JUMPOUT(0xFFDD02CD); /*0xffdd02cd*/
 }
 Debug_AssertPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffdd06a2*/
 ErrorLevel = Debug_AssertBreak(); /*0xffdd06aa*/
 if ( ErrorLevel ) /*0xffdd06b1*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd09c6*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 746,
 "!EFI_ERROR (Status)");
 return Status; /*0xffdd09cc*/
 }
 else
 {
 ErrorLevel = Debug_AssertBreak(); /*0xffdd060a*/
 if ( ErrorLevel ) /*0xffdd0611*/
 (*(void ( **)(const char *, int, const char *))(ErrorLevel + 4))( /*0xffdd061e*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\PlatformInit\\PlatformEarlyInit.c",
 729,
 "GuidHob != ((void *) 0)");
 return -2147483634; /*0xffdd0624*/
 }
}

// MemoryInit_BeforePpm @ 0xffdd09d6 int __usercall MemoryInit_BeforePpm@<eax>(char n5@<dl>, int n24, _DWORD *p_this)
{
 MEMORY[0xFE010008] = n24; /*0xffdd09de*/
 MEMORY[0xFE010006] &= 0x80C0u; /*0xffdd09ef*/
 MEMORY[0xFE010006] |= 0x300u; /*0xffdd0a01*/
 if ( n5 == 1 ) /*0xffdd0a10*/
 {
 MEMORY[0xFE010006] |= 1u; /*0xffdd0a1c*/
 while ( (MEMORY[0xFE010004] & 0x20) != 0 ) /*0xffdd0a27*/
 ; /*0xffdd0a22*/
 *p_this = MEMORY[0xFE010010]; /*0xffdd0a2e*/
 }
 if ( n5 == 5 ) /*0xffdd0a33*/
 {
 MEMORY[0xFE010010] = *p_this; /*0xffdd0a37*/
 MEMORY[0xFE010006] |= 5u; /*0xffdd0a46*/
 while ( (MEMORY[0xFE010004] & 0x20) != 0 ) /*0xffdd0a51*/
 ; /*0xffdd0a4c*/
 }
 return 0; /*0xffdd0a55*/
}

// MemoryInit_GetFreq @ 0xffdd0a57 unsigned int __thiscall MemoryInit_GetFreq(void *this)
{
 void *this_1; // [esp+0h] [ebp-4h] BYREF this_1 = this; /*0xffdd0a5a*/
 MemoryInit_BeforePpm(1, 16, &this_1); /*0xffdd0a63*/
 return this_1 != (void *)267429210 ? 0x80000003 : 0;
}

// MemoryInit_SetFreq @ 0xffdd0a7f int MemoryInit_SetFreq()
{
 if ( MEMORY[0xFE010000] == -1 ) /*0xffdd0a87*/
 return -2147483645; /*0xffdd0a87*/
 MEMORY[0xFE0100C4] = -10217; /*0xffdd0a8e*/
 MEMORY[0xFE0100C8] = -10217; /*0xffdd0a94*/
 if ( MEMORY[0xFE010004] < 0 ) /*0xffdd0aac*/
 return -2147483645; /*0xffdd0ab1*/
 else return 0; /*0xffdd0aae*/
}