/** @file
GCD (Global Coherency Domain) Services for DxeCore
Source: DxeCore.efi (HR650X BIOS)
Decompiled from MdeModulePkg\Core\Dxe\Gcd\Gcd.c
*/
#include "../uefi_headers/Uefi.h"
//
// Function: CoreConvertSpaceInner @ 0x3cbc
//
unsigned __int64 __fastcall CoreConvertSpaceInner(unsigned __int64 *a1, _QWORD *a2, unsigned __int64 a3, _WORD *i)
{
unsigned __int64 v5; // r8
__int16 n2; // cx
unsigned __int64 v8; // r10
_WORD *j; // rax
unsigned __int64 v10; // rbx
unsigned __int64 v11; // rdx
_QWORD *v12; // rcx
unsigned __int64 v14; // rax
_QWORD v15[2]; // [rsp+20h] [rbp-10h] BYREF
unsigned __int64 v16; // [rsp+50h] [rbp+20h] BYREF
_QWORD *v17; // [rsp+58h] [rbp+28h]
_WORD *ia; // [rsp+68h] [rbp+38h]
ia = i;
v17 = a2;
v5 = *a1;
v15[0] = *a2;
v16 = v5;
n2 = *i;
v8 = v15[0] + v5;
for ( j = i; ; n2 = *j )
{
if ( n2 == -1 )
return 0;
if ( n2 == 2 )
{
v10 = *((_QWORD *)j + 3);
v11 = v10 + *((_QWORD *)j + 4);
if ( v11 > v5 && v10 < v8 )
break;
}
j = (_WORD *)((char *)j + (unsigned __int16)j[1]);
}
if ( v11 < v8 )
{
v16 = v10 + *((_QWORD *)j + 4);
v15[0] = v8 - v11;
if ( v8 - v11 >= a3 )
{
if ( (CoreConvertSpaceInner(&v16, v15, a3, i) & 0x8000000000000000uLL) == 0LL )
{
LABEL_10:
v12 = v17;
*a1 = v16;
*v12 = v15[0];
return 0;
}
i = ia;
}
}
v14 = *a1;
v16 = v14;
if ( v10 > v14 )
{
v15[0] = v10 - v14;
if ( v10 - v14 >= a3 && (CoreConvertSpaceInner(&v16, v15, a3, i) & 0x8000000000000000uLL) == 0LL )
goto LABEL_10;
}
return 0x800000000000000EuLL;
}
//
// Function: CoreAddMemorySpace @ 0x62b4
//
unsigned __int64 __fastcall CoreAddMemorySpace(_QWORD *_, __int64 *a2, char *__ImageBase, double a4)
{
double v4; // xmm2_8
unsigned int v5; // r12d
_QWORD *__1; // r13
__int64 v8; // rdx
__int64 v9; // r8
unsigned __int64 i; // rbx
__int64 v11; // rdx
char *__ImageBase_1; // rdi
__int64 v13; // r8
char *p___1; // r14
_QWORD *__2; // rax
__int64 v17; // r15
__int64 (__fastcall **Unknown_4)(_QWORD, _QWORD *, _QWORD **); // rsi
unsigned __int64 i_2; // rsi
unsigned __int64 i_1; // r15
unsigned int v21; // eax
__int64 v22; // rdx
__int64 v23; // r8
__int64 (__fastcall **Unknown_5)(_QWORD, _QWORD **); // rsi
unsigned __int64 p_i_2; // r15
unsigned __int64 i_3; // r12
unsigned __int64 p_i_3; // rsi
__int64 v28; // rdx
__int64 v29; // r8
__int64 p_i_4; // rdx
unsigned __int64 p_i_6; // r8
__int64 v32; // r10
unsigned __int64 p_i_5; // rcx
unsigned int v34; // r9d
__int64 v35; // rax
char p_i_7; // al
__int64 v37; // r14
__int64 v38; // r13
__int64 v39; // rbx
_QWORD *__4; // r9
unsigned __int64 Unknown_1; // rsi
__int64 v42; // rdx
__int64 v43; // rcx
__int64 (__fastcall **v44)(_QWORD, const char *, __int64 *); // r8
__int64 v45; // rax
unsigned __int64 Unknown_3; // rbx
__int64 (__fastcall **v47)(char *, __int64, _QWORD); // rax
const char *Unknown_2; // r12
char *__5; // rax
__int64 v50; // rdx
__int64 v51; // r8
__int64 v52; // rbx
__int64 v53; // rdx
__int64 __ImageBase_2; // r8
char *p__; // [rsp+40h] [rbp-30h] BYREF
_QWORD *_a; // [rsp+48h] [rbp-28h] BYREF
unsigned int p_i_1[2]; // [rsp+50h] [rbp-20h] BYREF
__int64 Unknown; // [rsp+58h] [rbp-18h] BYREF
char *__3; // [rsp+60h] [rbp-10h] BYREF
unsigned __int64 p_i; // [rsp+C8h] [rbp+58h] BYREF
v5 = 0;
*(_QWORD *)p_i_1 = 0;
__1 = _;
p__ = 0;
p_i = 0;
Unknown = 0;
__3 = 0;
if ( sub_D7D0(2, dst_3, 0, (unsigned __int64 *)p_i_1, (const char **)&p__) < 0 )
return 0x800000000000000EuLL;
i = *(_QWORD *)p_i_1;
if ( !*(_QWORD *)p_i_1 )
return 0x800000000000000EuLL;
__ImageBase_1 = Assert_112(8LL * *(_QWORD *)p_i_1, v8, v9, a4);
if ( !__ImageBase_1 )
{
Assert_55((unsigned __int64)p__, v11, v13, a4);
return 0x8000000000000009uLL;
}
p___1 = p__;
if ( a2 )
{
__2 = (_QWORD *)*a2;
v17 = 0;
if ( *a2 )
{
do
{
sub_6118(__2, (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
__2 = (_QWORD *)a2[++v17];
}
while ( __2 );
__1 = _;
}
}
if ( GetInfo_9((__int64)&unk_22730, 0, &Unknown, a4) >= 0 )
{
Unknown_4 = (__int64 (__fastcall **)(_QWORD, _QWORD *, _QWORD **))Unknown;
if ( Unknown )
{
for ( _a = 0;
(*Unknown_4)(Unknown_4, __1, &_a) >= 0;
sub_6118(_a, (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 1) )
{
;
}
}
}
while ( 1 )
{
i_2 = 0;
i_1 = i;
if ( !i )
break;
do
{
if ( DxeConfig_5(*(_QWORD **)&p___1[8 * i_2], (__int64)&qword_22560, &Unknown, ::_, 0, 1u) >= 0 )
{
if ( Unknown )
{
v21 = (*(__int64 (__fastcall **)(__int64))Unknown)(Unknown);
if ( i_1 == i || v21 > v5 )
{
v5 = v21;
i_1 = i_2;
}
}
}
++i_2;
}
while ( i_2 < i );
if ( i_1 == i )
break;
v5 = 0;
sub_6118(*(_QWORD **)&p___1[8 * i_1], (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
}
if ( DxeConfig_5(_, (__int64)&qword_225B0, &Unknown, ::_, 0, 1u) >= 0 )
{
Unknown_5 = (__int64 (__fastcall **)(_QWORD, _QWORD **))Unknown;
if ( Unknown )
{
for ( _a = 0; (*Unknown_5)(Unknown_5, &_a) >= 0; sub_6118(
_a,
(__int64 *)&p_i,
(__int64)__ImageBase_1,
i,
p___1,
1) )
;
}
}
p_i_2 = p_i;
i_3 = 0;
p_i_3 = p_i;
if ( i )
{
do
sub_6118(*(_QWORD **)&p___1[8 * i_3++], (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
while ( i_3 < i );
p_i_2 = p_i;
}
Assert_55((unsigned __int64)p___1, v22, v23, a4);
sub_D7D0(2, dst_3, 0, &p_i, (const char **)&__3);
Assert_55((unsigned __int64)__3, v28, v29, a4);
if ( p_i > i )
{
Assert_55((unsigned __int64)__ImageBase_1, p_i_4, p_i_6, a4);
return 0x8000000000000006uLL;
}
if ( p_i_3 < p_i_2 )
{
do
{
v32 = *(_QWORD *)&__ImageBase_1[8 * p_i_3];
p_i_6 = p_i_3 + 1;
p_i_4 = p_i_3;
p_i_5 = p_i_3 + 1;
v34 = *(_DWORD *)(v32 + 24);
if ( p_i_3 + 1 < p_i_2 )
{
do
{
v35 = *(_QWORD *)&__ImageBase_1[8 * p_i_5];
if ( *(_DWORD *)(v35 + 24) > v34 )
{
v34 = *(_DWORD *)(v35 + 24);
p_i_4 = p_i_5;
}
++p_i_5;
}
while ( p_i_5 < p_i_2 );
if ( p_i_3 != p_i_4 )
{
*(_QWORD *)&__ImageBase_1[8 * p_i_3] = *(_QWORD *)&__ImageBase_1[8 * p_i_4];
*(_QWORD *)&__ImageBase_1[8 * p_i_4] = v32;
}
}
++p_i_3;
}
while ( p_i_6 < p_i_2 );
}
LOBYTE(p_i_3) = 0;
LODWORD(p__) = p_i_3;
LABEL_42:
while ( 1 )
{
p_i_7 = 0;
v37 = 0;
LOBYTE(p_i) = 0;
if ( !p_i_2 )
break;
while ( !p_i_7 )
{
v38 = *(_QWORD *)&__ImageBase_1[8 * v37];
if ( v38 )
{
Assert_14(*(_QWORD *)(v38 + 40), "DB:Support:", 0, 0, 0);
v39 = (*(__int64 (__fastcall **)(__int64, _QWORD *, char *))v38)(v38, _, __ImageBase);
Assert_95(*(_QWORD *)(v38 + 40), "DB:Support:", 0, 0);
if ( v39 < 0 )
{
p_i_7 = p_i;
}
else
{
__4 = ::_;
*(_QWORD *)&__ImageBase_1[8 * v37] = 0;
Unknown_1 = 0;
LOBYTE(p_i) = 1;
if ( DxeConfig_5(_, (__int64)&qword_22550, (__int64 *)p_i_1, __4, 0, 1u) < 0
|| (v45 = sub_626C(v43, v42, (__int64)v44, a4)) == 0
|| (LOBYTE(v44) = 1,
LOBYTE(v42) = 1,
Unknown = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(v45 + 8))(*(_QWORD *)p_i_1, v42, v44),
(Unknown_1 = Unknown) == 0) )
{
Unknown = (__int64)L"Unknown";
}
Unknown_3 = 0;
if ( __ImageBase )
{
v47 = (__int64 (__fastcall **)(char *, __int64, _QWORD))sub_626C(v43, v42, (__int64)v44, a4);
if ( !v47
|| (LOBYTE(v44) = 1,
LOBYTE(v42) = 1,
Unknown_3 = (*v47)(__ImageBase, v42, v44),
(Unknown_2 = (const char *)Unknown_3) == 0) )
{
Unknown_2 = (const char *)L"Unknown";
}
__5 = (char *)L";";
}
else
{
__5 = (char *)&unk_1DE1C;
Unknown_2 = (const char *)&unk_1DE1C;
}
__3 = __5;
Assert_46(v38, v42, v44, a4);
Assert_3(4, "%a.Start(%p)[%s%s%s]=", v4, *(const void **)(v38 + 8), (const char *)Unknown, __3, Unknown_2);
if ( Unknown_1 )
Assert_55(Unknown_1, v50, v51, a4);
if ( Unknown_3 )
Assert_55(Unknown_3, v50, v51, a4);
Assert_14(*(_QWORD *)(v38 + 40), "DB:Start:", 0, 0, 0);
v52 = (*(__int64 (__fastcall **)(__int64, _QWORD *, char *))(v38 + 8))(v38, _, __ImageBase);
Assert_95(*(_QWORD *)(v38 + 40), "DB:Start:", 0, 0);
Assert_3(4, "%r\n", v52);
p_i_7 = 1;
LODWORD(p_i_3) = (unsigned __int8)p__;
if ( v52 >= 0 )
LODWORD(p_i_3) = 1;
LODWORD(p__) = p_i_3;
}
}
if ( ++v37 >= p_i_2 )
{
if ( p_i_7 )
goto LABEL_42;
goto LABEL_66;
}
}
}
LABEL_66:
Assert_55((unsigned __int64)__ImageBase_1, p_i_4, p_i_6, a4);
if ( (_BYTE)p_i_3 || __ImageBase && Assert_51((__int64)__ImageBase, v53, __ImageBase_2, a4) )
return 0;
else
return 0x800000000000000EuLL;
}
//
// Function: CoreSetMemorySpace @ 0x72c0
//
void __fastcall CoreSetMemorySpace(unsigned int n7, unsigned __int64 __ImageBase, __int64 a3, __int64 a4)
{
double v4; // xmm3_8
__int64 v9; // rdx
__int64 v10; // rcx
__int64 v11; // r8
__int64 v12; // rdx
__int64 v13; // r8
__int64 v14; // r8
int n15; // edx
unsigned __int64 i_1; // rsi
char *DXE_SERV___2; // rax
__int64 v18; // rbx
__int64 n7_1; // rdx
unsigned int n232_2; // ecx
__int64 v21; // rdi
__int64 *v22; // r14
__int64 v23; // rdx
bool v24; // cf
__int64 v25; // rsi
char *DXE_SERV__; // rax
__int64 v27; // rdi
bool v28; // cc
unsigned int n232; // ecx
__int64 v30; // rax
__int64 v31; // rbx
int v32; // r9d
__int64 *v33; // rcx
__int64 v34; // rax
char *DXE_SERV___1; // r8
bool v36; // zf
unsigned __int64 i; // rdi
unsigned int n232_1; // ecx
__int64 v39; // rax
__int64 v40; // rbx
char v41; // [rsp+10h] [rbp+10h] BYREF
if ( (__ImageBase & 0xFFF) == 0 && n7 - 15 > 0x6FFFFFF0 )
{
DxeGetInfo_8((__int64)&unk_26340, __ImageBase, a3, v4);
DxeConfig_14(n7, __ImageBase, (a3 << 12) + __ImageBase - 1, a4);
DxeDriverEntry_2(v10, v9, v11, v4);
DxeGetInfo_10((__int64)&unk_26340, v12, v13, v4);
v41 = 0;
if ( qword_263D0 )
(*(void (__fastcall **)(__int64, char *))qword_263D0)(qword_263D0, &v41);
if ( !byte_26439 )
{
n15 = *(_DWORD *)DXE_SERV__;
i_1 = 0;
if ( *(_DWORD *)DXE_SERV__ == 15 )
{
LABEL_15:
v25 = 0;
if ( n15 != 15 )
{
DXE_SERV__ = DXE_SERV__;
v27 = 0;
v28 = *(_DWORD *)DXE_SERV__ <= 0xFu;
do
{
if ( v28 )
{
n232 = *(_DWORD *)&DXE_SERV__[v27 + 4];
if ( n232 )
{
v30 = *(int *)DXE_SERV__;
v31 = 6 * v30;
DxeConfig_35(qword_25B90[6 * v30], n232, v14, v4);
qword_25B90[v31 + 3] = *(unsigned int *)&DXE_SERV__[v27 + 4];
*(_DWORD *)&DXE_SERV__[v27 + 4] = 0;
}
}
++v25;
v27 = 8 * v25;
DXE_SERV__ = &DXE_SERV__[8 * v25];
v28 = *(_DWORD *)DXE_SERV__ <= 0xFu;
}
while ( *(_DWORD *)DXE_SERV__ != 15 );
n15 = *(_DWORD *)DXE_SERV__;
}
v32 = 0;
v33 = qword_25B98;
do
{
v34 = 0;
if ( n15 != 15 )
{
DXE_SERV___1 = DXE_SERV__;
do
{
if ( v32 == *(_DWORD *)DXE_SERV___1 )
v33[3] = v34;
++v34;
DXE_SERV___1 = &DXE_SERV__[8 * v34];
}
while ( *(_DWORD *)DXE_SERV___1 != 15 );
}
v36 = *v33 == -1;
v33[1] = 0;
if ( v36 )
*v33 = _ImageBase_1;
++v32;
v33 += 6;
}
while ( (__int64)v33 < (__int64)&unk_25E68 );
byte_26439 = 1;
return;
}
DXE_SERV___2 = DXE_SERV__;
v18 = 0;
while ( 1 )
{
n7_1 = *(int *)DXE_SERV___2;
if ( (unsigned int)n7_1 <= 0xF )
{
n232_2 = *(_DWORD *)&DXE_SERV__[v18 + 4];
if ( n232_2 )
{
v21 = 6 * n7_1;
v22 = &qword_25B90[6 * n7_1];
if ( GetInfo_2(0, n7_1, n232_2, v22) < 0 )
{
for ( i = 0; i < i_1; ++i )
{
if ( *(_DWORD *)&DXE_SERV__[8 * i] <= 0xFu )
{
n232_1 = *(_DWORD *)&DXE_SERV__[8 * i + 4];
if ( n232_1 )
{
v39 = *(int *)&DXE_SERV__[8 * i];
v40 = 6 * v39;
DxeConfig_35(qword_25B90[6 * v39], n232_1, v14, v4);
qword_25B90[v40 + 1] = -1;
qword_25B90[v40] = 0;
}
}
}
return;
}
v23 = *v22;
v24 = *v22 < _ImageBase_1;
qword_25B90[v21 + 1] = ((unsigned __int64)*(unsigned int *)&DXE_SERV__[v18 + 4] << 12) + *v22 - 1;
if ( v24 )
_ImageBase_1 = v23 - 1;
}
}
++i_1;
v18 = 8 * i_1;
DXE_SERV___2 = &DXE_SERV__[8 * i_1];
if ( *(_DWORD *)DXE_SERV___2 == 15 )
{
n15 = *(_DWORD *)DXE_SERV__;
goto LABEL_15;
}
}
}
}
}
//
// Function: SetMemWrapper @ 0x127bc
//
void *__fastcall SetMemWrapper(unsigned __int64 buf, unsigned __int64 count, char value, double a4)
{
void *buf_1; // rax
buf_1 = (void *)buf;
if ( count )
{
if ( count - 1 > ~buf )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
54,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)",
a4);
return sub_3E0((void *)buf, count, value);
}
return buf_1;
}
//
// Function: CopyMemWrapper @ 0x12820
//
char *__fastcall CopyMemWrapper(char *dst, char *src, unsigned __int64 count, double a4)
{
char *dst_1; // rax
unsigned __int64 v8; // rbp
dst_1 = dst;
if ( count )
{
v8 = count - 1;
if ( count - 1 > ~(unsigned __int64)dst )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
56,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)",
a4);
if ( v8 > ~(unsigned __int64)src )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
57,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)",
a4);
if ( dst == src )
return dst;
else
return sub_400(dst, src, count);
}
return dst_1;
}
//
// Function: ZeroMemWrapper @ 0x128bc
//
char *__fastcall ZeroMemWrapper(char *buf, unsigned __int64 a2, __int64 a3, double a4)
{
if ( !buf )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
53,
(__int64)"Buffer != ((void *) 0)",
a4);
if ( a2 > -(__int64)buf )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
54,
(__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)",
a4);
return sub_450(buf, a2);
}
//
// Function: CompareMemWrapper @ 0x129d0
//
unsigned __int64 __fastcall CompareMemWrapper(__int64 i, __int64 i_1, __int64 a3, double a4)
{
if ( !a3 || i == i_1 )
return 0;
if ( !i )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
60,
(__int64)"DestinationBuffer != ((void *) 0)",
a4);
if ( !i_1 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
61,
(__int64)"SourceBuffer != ((void *) 0)",
a4);
if ( a3 - 1 > (unsigned __int64)~i )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
62,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)",
a4);
if ( a3 - 1 > (unsigned __int64)~i_1 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
63,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)",
a4);
return sub_470((_BYTE *)i, (_BYTE *)i_1, a3);
}
//
// Function: GetHobListWrapper @ 0x12aa8
//
__int64 __fastcall GetHobListWrapper(__int64 a1, __int64 a2, __int64 a3, double a4)
{
__int64 ImageHandle; // rax
ImageHandle = ImageHandle;
if ( !ImageHandle )
{
Assert_7((__int64)"e:\\hs\\MdePkg\\Library\\DxeCoreHobLib\\HobLib.c", 44, (__int64)"gHobList != ((void *) 0)", a4);
return ImageHandle;
}
return ImageHandle;
}
//
// Function: GetNextHobWrapper @ 0x12adc
//
_WORD *__fastcall GetNextHobWrapper(__int16 a1, _WORD *a2, __int64 a3, double a4)
{
_WORD *v4; // rbx
v4 = a2;
if ( !a2 )
Assert_7((__int64)"e:\\hs\\MdePkg\\Library\\DxeCoreHobLib\\HobLib.c", 74, (__int64)"HobStart != ((void *) 0)", a4);
while ( 1 )
{
if ( *v4 == 0xFFFF )
return 0;
if ( *v4 == a1 )
break;
v4 = (_WORD *)((char *)v4 + (unsigned __int16)v4[1]);
}
return v4;
}
//
// Function: SetMem16Wrapper @ 0x153f8
//
__int64 __fastcall SetMem16Wrapper(
__int64 buf,
unsigned __int16 n0x3FB,
__int64 a3,
unsigned __int16 n0x10,
__int64 a5)
{
double v5; // xmm3_8
_WORD *v6; // rdi
unsigned __int16 n0x10_1; // r15
__int64 v8; // r11
unsigned __int16 n0x3FB_1; // r10
__int64 i; // rcx
unsigned __int16 n0x3FB_2; // di
__int64 v12; // rax
unsigned __int16 n0x10_2; // r8
__int64 v14; // r9
int v15; // edi
__int16 v16; // dx
char v17; // si
unsigned __int16 n0x10_3; // di
__int64 n0x10_7; // rdx
char v20; // al
__int64 n0x10_4; // rax
__int16 v23; // dx
char n0x10_5; // r14
unsigned __int16 v25; // dx
_WORD *v26; // rbx
unsigned __int64 v27; // rdi
unsigned __int16 n0x3FB_3; // bx
unsigned __int16 v29; // r12
unsigned __int16 v30; // r9
__int64 n0x10_6; // r8
unsigned __int16 v32; // di
__int64 v33; // r11
unsigned __int16 v34; // r10
__int64 v35; // rax
unsigned __int16 *v36; // rcx
__int16 v37; // r8
unsigned __int16 v38; // ax
__int64 v39; // rcx
unsigned __int16 v40; // [rsp+20h] [rbp-51h]
char v41; // [rsp+28h] [rbp-49h]
_WORD v42[20]; // [rsp+30h] [rbp-41h] BYREF
_DWORD v43[8]; // [rsp+58h] [rbp-19h]
__int16 v44; // [rsp+7Ah] [rbp+9h]
v6 = v42;
n0x10_1 = n0x10;
v8 = a3;
n0x3FB_1 = n0x3FB;
for ( i = 17; i; --i )
*v6++ = 0;
n0x3FB_2 = 0;
if ( n0x3FB )
{
while ( *(_BYTE *)(n0x3FB_2 + a3) <= 0x10u )
{
v12 = *(unsigned __int8 *)(n0x3FB_2++ + a3);
++v42[v12];
if ( n0x3FB_2 >= n0x3FB )
goto LABEL_7;
}
return 0xFFFF;
}
LABEL_7:
v43[0] = 0;
n0x10_2 = 1;
v14 = 0;
do
{
v15 = n0x10_2++;
v16 = *(_WORD *)((char *)v43 + v14 * 2 + 2) + (v42[v14 + 1] << (16 - v15));
++v14;
*((_WORD *)v43 + v15 + 1) = v16;
}
while ( n0x10_2 <= 0x10u );
if ( v44 )
return 0xFFFF;
v42[0] = 0;
v17 = 16 - n0x10_1;
n0x10_3 = 1;
if ( !n0x10_1 )
goto LABEL_14;
do
{
n0x10_7 = n0x10_3;
v20 = n0x10_3++;
*((_WORD *)v43 + n0x10_7) >>= v17;
v42[n0x10_7] = 1 << (n0x10_1 - v20);
}
while ( n0x10_3 <= n0x10_1 );
while ( n0x10_3 <= 0x10u )
{
LABEL_14:
n0x10_4 = n0x10_3;
v23 = 1 << (16 - n0x10_3++);
v42[n0x10_4] = v23;
}
n0x10_5 = n0x10_1;
v25 = *((_WORD *)v43 + n0x10_1 + 1) >> v17;
if ( v25 )
{
if ( v25 < (unsigned __int16)(1 << n0x10_1) )
{
v26 = (_WORD *)(a5 + 2LL * v25);
v27 = 2LL * ((unsigned __int16)(1 << n0x10_1) - v25);
if ( v27 )
{
if ( !v26 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
58,
(__int64)"Buffer != ((void *) 0)",
v5);
if ( v27 - 1 > -1 - (__int64)v26 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
59,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)",
v5);
if ( ((unsigned __int8)v26 & 1) != 0 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
60,
(__int64)"(((UINTN)Buffer) & (sizeof (Value) - 1)) == 0",
v5);
if ( (v27 & 1) != 0 )
Assert_7(
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
61,
(__int64)"(Length & (sizeof (Value) - 1)) == 0",
v5);
sub_9E0(v26, v27 >> 1, 0);
n0x3FB_1 = n0x3FB;
v8 = a3;
}
}
}
n0x3FB_3 = n0x3FB_1;
v29 = 1 << n0x10_1;
v40 = 1 << n0x10_1;
v30 = 0;
if ( !n0x3FB_1 )
return 0;
v41 = 16 - n0x10_1;
while ( 1 )
{
n0x10_6 = *(unsigned __int8 *)(v30 + v8);
if ( (unsigned __int16)(*(unsigned __int8 *)(v30 + v8) - 1) <= 0xFu )
break;
LABEL_48:
if ( ++v30 >= n0x3FB_1 )
return 0;
}
v32 = *((_WORD *)v43 + n0x10_6);
v33 = *(unsigned __int8 *)(v30 + v8);
v34 = v32 + v42[n0x10_6];
if ( (unsigned __int16)n0x10_6 > n0x10_1 )
{
v36 = (unsigned __int16 *)(a5 + 2 * ((unsigned __int64)v32 >> v17));
v37 = n0x10_6 - n0x10_1;
if ( v37 )
{
do
{
if ( !*v36 && n0x3FB_3 < 0x3FBu )
{
*(_WORD *)(buf + 2LL * n0x3FB_3 + 50) = 0;
*(_WORD *)(buf + 2LL * n0x3FB_3 + 2088) = 0;
*v36 = n0x3FB_3++;
}
v38 = *v36;
if ( *v36 < 0x3FBu )
{
v39 = buf + 2088;
if ( ((unsigned __int16)(1 << (15 - n0x10_5)) & v32) == 0 )
v39 = buf + 50;
v36 = (unsigned __int16 *)(v39 + 2LL * v38);
}
v32 *= 2;
--v37;
}
while ( v37 );
n0x10_1 = n0x10;
v29 = v40;
v17 = v41;
}
*v36 = v30;
goto LABEL_47;
}
if ( v32 >= v34 )
{
LABEL_47:
*((_WORD *)v43 + v33) = v34;
n0x3FB_1 = n0x3FB;
v8 = a3;
goto LABEL_48;
}
while ( v32 < v29 )
{
v35 = v32++;
*(_WORD *)(a5 + 2 * v35) = v30;
if ( v32 >= v34 )
goto LABEL_47;
}
return 0xFFFF;
}