/** @file
Page and Pool Memory Services for DxeCore
Source: DxeCore.efi (HR650X BIOS)
Decompiled from MdeModulePkg\Core\Dxe\Mem\Page.c
*/
#include "../uefi_headers/Uefi.h"
//
// Function: CoreAllocatePages @ 0x2698
//
__int64 __fastcall CoreAllocatePages(
__int64 n36,
__int64 n3,
__int64 a3,
unsigned __int64 __ImageBase,
__int64 a5,
__int64 a6,
__int64 a7)
{
double v7; // xmm2_8
double v8; // xmm3_8
__int64 v11; // rbx
__int64 *p_ia; // rbx
__int64 v13; // r8
_QWORD *i_1; // r12
_QWORD *i_2; // r15
_QWORD *j; // rbx
_QWORD *j_1; // rcx
bool v18; // zf
bool v19; // zf
bool v20; // zf
__int64 v21; // rdx
__int64 v22; // r8
char *dst_1; // rbp
char *i_3; // rsi
__int64 v25; // r9
__int64 v26; // rdx
__int64 v27; // r8
__int64 *i_4; // rdi
__int64 *i_5; // rbx
__int64 v30; // rax
unsigned __int64 v31; // rcx
__int64 v32; // rdx
__int64 v33; // r8
__int64 v34; // rdx
__int64 v35; // rdx
__int64 *p_ia_1; // [rsp+30h] [rbp-68h]
unsigned int p_i[2]; // [rsp+38h] [rbp-60h] BYREF
_QWORD *i; // [rsp+40h] [rbp-58h] BYREF
char *dst; // [rsp+48h] [rbp-50h] BYREF
__int64 v41; // [rsp+50h] [rbp-48h]
int n3_1; // [rsp+A8h] [rbp+10h]
int v43; // [rsp+B0h] [rbp+18h]
v43 = a3;
n3_1 = n3;
if ( !a5 )
{
v11 = 0x8000000000000002uLL;
Assert_3(0x100000, " Status = %r\n", 0x8000000000000002uLL);
return v11;
}
p_ia = 0;
p_ia_1 = 0;
v41 = n36 & 0x20;
if ( (n36 & 0x20) != 0 )
{
DxeGetInfo_8((__int64)&unk_22B60, n3, a3, v8);
p_ia = &i_3;
}
else
{
if ( (n36 & 0x40) == 0 )
{
Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 749, (__int64)"((BOOLEAN)(0==1))", v8);
goto LABEL_9;
}
DxeGetInfo_8((__int64)&unk_22BD0, n3, a3, v8);
p_ia = &::p_ia;
}
p_ia_1 = p_ia;
LABEL_9:
if ( DxeConfig_49(__ImageBase, a5, (__int64 **)p_i, &i, p_ia) < 0 )
{
LABEL_10:
v11 = 0x8000000000000003uLL;
goto LABEL_94;
}
i_1 = *(_QWORD **)p_i;
i_2 = i;
if ( !*(_QWORD *)p_i || !i )
Assert_7(
(__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c",
761,
(__int64)"StartLink != ((void *) 0) && EndLink != ((void *) 0)",
v8);
for ( j = i_1; j != (_QWORD *)*i_2; j = (_QWORD *)*j )
{
j_1 = j - 1;
if ( *(j - 1) != 1835295591 )
{
Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 768, (__int64)"CR has Bad Signature", v8);
j_1 = j;
}
switch ( n36 )
{
case ' ':
v19 = *((_DWORD *)j_1 + 14) == 0;
LABEL_41:
if ( !v19 )
goto LABEL_47;
goto LABEL_42;
case '"':
goto LABEL_38;
case '#':
v18 = *((_DWORD *)j_1 + 14) == 0;
goto LABEL_26;
case '$':
if ( a7 < 0 && ((a5 | __ImageBase) & 0xFFF) != 0 )
{
LABEL_46:
v11 = 0x8000000000000002uLL;
goto LABEL_94;
}
v20 = (a7 & j_1[5]) == a7;
goto LABEL_32;
case '%':
if ( (__ImageBase & 0xFFF) != 0 || (a5 & 0xFFF) != 0 )
goto LABEL_46;
v20 = (a6 & j_1[6]) == j_1[6];
LABEL_32:
if ( !v20 )
goto LABEL_10;
continue;
case '@':
v19 = *((_DWORD *)j_1 + 15) == 0;
goto LABEL_41;
case 'B':
LABEL_38:
if ( !j_1[8] )
{
LABEL_27:
v11 = 0x800000000000000EuLL;
goto LABEL_94;
}
break;
case 'C':
v18 = *((_DWORD *)j_1 + 15) == 0;
LABEL_26:
if ( v18 )
goto LABEL_27;
LABEL_42:
if ( j_1[8] )
{
LABEL_47:
v11 = 0x800000000000000FuLL;
goto LABEL_94;
}
break;
}
}
if ( (Assert_106((unsigned __int64 *)&dst, (char **)&i, v13, v8) & 0x8000000000000000uLL) != 0LL )
{
v11 = 0x8000000000000009uLL;
goto LABEL_94;
}
dst_1 = dst;
i_3 = (char *)i;
if ( !dst || !i )
Assert_7(
(__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c",
864,
(__int64)"TopEntry != ((void *) 0) && BottomEntry != ((void *) 0)",
v8);
if ( n36 == 36 && (a7 & 0xFFFFFFFFFFFD8FE0uLL) == 0 )
{
v25 = (unsigned int)&unk_26000 & (unsigned int)a7;
if ( (a7 & 1) != 0 )
{
v25 |= 1uLL;
}
else if ( (a7 & 2) != 0 )
{
v25 |= 2uLL;
}
else if ( (a7 & 4) != 0 )
{
v25 |= 4uLL;
}
else if ( (a7 & 8) != 0 )
{
v25 |= 8uLL;
}
else if ( (a7 & 0x10) != 0 )
{
v25 |= 0x10uLL;
}
else if ( (a7 & 0x1000) != 0 )
{
v25 |= 0x1000uLL;
}
if ( v25 != 0xFFFFFFFFLL )
{
if ( !qword_26400 )
{
v11 = 0xA000000000000002uLL;
LABEL_69:
Assert_55((unsigned __int64)dst_1, v21, v22, v8);
Assert_55((unsigned __int64)i_3, v26, v27, v8);
goto LABEL_94;
}
v11 = (*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64))(qword_26400 + 56))(
qword_26400,
__ImageBase,
a5);
if ( v11 < 0 )
goto LABEL_69;
}
}
i_4 = i_1;
if ( i_1 == (_QWORD *)*i_2 )
goto LABEL_93;
do
{
i_5 = i_4 - 1;
if ( *(i_4 - 1) != 1835295591 )
{
Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 895, (__int64)"CR has Bad Signature", v8);
i_5 = i_4;
}
DxeDriverEntry_3(i_4, (char *)i_5, __ImageBase, a5, dst_1, i_3);
switch ( n36 )
{
case ' ':
v31 = 0xC000000000000000uLL;
*((_DWORD *)i_5 + 14) = n3_1;
if ( n3_1 != 3 )
v31 = 0x8000000000000000uLL;
v30 = v31 | a6;
goto LABEL_90;
case '"':
goto LABEL_86;
case '#':
*((_DWORD *)i_5 + 14) = 0;
i_5[5] = 0;
break;
case '$':
i_5[6] = a7;
break;
case '%':
v30 = a6;
LABEL_90:
i_5[5] = v30;
break;
case '@':
*((_DWORD *)i_5 + 15) = v43;
break;
case 'B':
LABEL_86:
i_5[8] = 0;
i_5[9] = 0;
break;
case 'C':
*((_DWORD *)i_5 + 15) = 0;
break;
}
i_4 = (__int64 *)*i_4;
}
while ( i_4 != (__int64 *)*i_2 );
i_1 = *(_QWORD **)p_i;
LABEL_93:
v11 = Assert_104(dst_1, i_3, i_1, i_2, p_ia_1);
LABEL_94:
Assert_3(0x100000, " Status = %r\n", v11);
if ( v41 )
{
DxeGetInfo_10((__int64)&unk_22B60, v32, v33, v8);
DxeInit_0(0, v34, v7, v8);
}
if ( (n36 & 0x40) != 0 )
{
DxeGetInfo_10((__int64)&unk_22BD0, v32, v33, v8);
DxeInit_1(0, v35, v7, v8);
}
return v11;
}
//
// Function: CoreFreePages @ 0x2b60
//
__int64 __fastcall CoreFreePages(
__int64 n65,
__int64 n5,
__int64 n6,
unsigned int n3,
unsigned __int64 n0x40,
unsigned __int64 a6,
unsigned __int64 *p___ImageBase,
__int64 a8,
__int64 a9)
{
double v9; // xmm2_8
double v10; // xmm3_8
int n5_1; // edi
__int64 n65_1; // r14
__int64 v14; // rbx
unsigned __int64 *p___ImageBase_1; // r12
__int64 *p_ia; // rsi
__int64 v17; // r8
__int64 v18; // r15
__int64 v19; // r8
__int64 *i_1; // r12
__int64 **i_2; // r14
__int64 *i_3; // rbx
__int64 *i_7; // rax
bool v24; // zf
__int64 *ia; // rbx
__int64 *ia_3; // rax
unsigned __int64 *p___ImageBase_2; // rax
unsigned __int64 __ImageBase; // r13
__int64 *ia_1; // rdx
bool v30; // zf
__int64 v31; // rcx
unsigned __int64 v32; // rcx
__int64 v33; // rdx
__int64 v34; // r8
__int64 v35; // rdx
__int64 v36; // rdx
unsigned __int64 __ImageBase_1; // rcx
bool v39; // zf
__int64 *... [8450 chars total]
//
// Function: CoreAllocatePool @ 0x7b64
//
unsigned __int64 __fastcall CoreAllocatePool(unsigned __int64 n0xFFF, __int64 n232, int n7, __int64 n4096)
{
double v4; // xmm3_8
__int64 n7_1; // rbp
unsigned __int64 n0xFFF_1; // rcx
unsigned __int64 result; // rax
unsigned __int64 __ImageBase_1; // rcx
__int64 v12; // rdx
__int64 v13; // rcx
__int64 v14; // r8
__int64 __ImageBase; // rax
n7_1 = n7;
while ( 1 )
{
if ( (unsigned int)n7_1 < 0xF )
{
n0xFFF_1 = qword_25B90[6 * n7_1 + 1];
if ( n0xFFF >= n0xFFF_1 )
{
result = DxeConfig_23(n0xFFF_1, qword_25B90[6 * n7_1], n232, v4, n4096);
if ( result )
break;
}
}
if ( n0xFFF >= _ImageBase_1 )
{
__ImageBase_1 = DxeConfig_23(_ImageBase_1, 0, n232, v4, n4096);
if ( __ImageBase_1 )
{
__ImageBase = _ImageBase_0;
if ( __ImageBase_1 < _ImageBase_0 )
__ImageBase = __ImageBase_1;
_ImageBase_0 = __ImageBase;
return __ImageBase_1;
}
}
result = DxeConfig_23(n0xFFF, 0, n232, v4, n4096);
if ( result )
return result;
if ( !DxeConfig_32(v13, v12, v14, v4) )
return 0;
}
return result;
}
//
// Function: CoreFreePool @ 0xbf3c
//
__int64 __fastcall CoreFreePool(_BYTE *n, __int64 a2, __int64 a3, double a4)
{
_BYTE **v4; // rdi
__int64 v6; // rsi
_BYTE *v7; // rdx
__int64 v9; // [rsp+50h] [rbp+8h] BYREF
v4 = (_BYTE **)(n + 80);
LOBYTE(a3) = 19;
v6 = (*(__int64 (__fastcall **)(_QWORD, _BYTE *, __int64, _QWORD, _BYTE *, _BYTE *, __int64 *))(*((_QWORD *)n + 9)
+ 24LL))(
*((_QWORD *)n + 9),
n + 48,
a3,
0,
n + 80,
n + 88,
&v9);
if ( v6 >= 0 )
{
v7 = *v4;
if ( **v4 == 9 )
n[117] = 1;
else
n[116] = 1;
if ( *v7 )
{
if ( *v7 == 1 )
n[97] = 1;
}
else
{
n[96] = 1;
}
if ( n[96] || n[97] )
CopyMemWrapper(n + 100, v7 + 1, 0x10u, a4);
goto LABEL_15;
}
if ( v6 != 0x8000000000000018uLL )
{
*v4 = 0;
n[116] = 1;
LABEL_15:
n[121] = 0;
return v6;
}
n[121] = 1;
return v6;
}