/*
*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*/
}