// Decompiled: 0xffe07d30
// Function: BiosAcmInvoke
// Module: TxtPei.efi (TXTPEI)
void __usercall BiosAcmInvoke(__m64 a1@<mm3>, unsigned int n5)
{
unsigned int v2; // kr00_4
unsigned __int64 v3; // rax
int v4; // ecx
unsigned int v5; // ecx
__m64 v6; // mm0
__m64 v7; // mm2
unsigned __int32 v8; // eax
unsigned __int32 v9; // eax
unsigned __int64 v10; // rax
int v11; // ecx
unsigned int v12; // ecx
unsigned int v13; // ebx
int n4096; // eax
__m128i v15; // xmm2
__m128i v16; // xmm0
__m128i i; // xmm1
unsigned int v18; // eax
unsigned int v19; // ecx
unsigned int v20; // edx
unsigned int v21; // ecx
__m128i v22; // xmm3
unsigned __int64 v23; // rax
int v24; // ebx
unsigned __int64 v25; // rax
unsigned __int32 v26; // eax
unsigned __int64 v27; // rax
int v28; // ebx
unsigned int j; // ecx
int n5_1; // ebx
char *v31; // ebx
_BYTE v32[8]; // [esp+0h] [ebp-10h] BYREF
_BYTE v33[8]; // [esp+8h] [ebp-8h] BYREF
_BYTE retaddr[8]; // [esp+14h] [ebp+4h]
v2 = __readeflags(); /*0xffe07d36*/
if ( *(_DWORD *)&retaddr[4] ) /*0xffe07d3c*/
{
if ( n5 && n5 != 5 ) /*0xffe07d4c*/
{
__sgdt(v33); /*0xffe07d4e*/
__sidt(v32); /*0xffe07d52*/
a1 = _mm_cvtsi32_si64((unsigned int)v33); /*0xffe07d59*/
__readcr4(); /*0xffe07d69*/
__readcr0(); /*0xffe07d6d*/
__readmsr(0x1A0u); /*0xffe07d76*/
v3 = __readmsr(0xFEu); /*0xffe07d7f*/
v4 = 2 * (unsigned __int8)v3; /*0xffe07d88*/
do /*0xffe07d9a*/
{
v5 = v4 + 511; /*0xffe07d8a*/
__readmsr(v5); /*0xffe07d90*/
v4 = v5 - 512; /*0xffe07d9a*/
}
while ( v4 ); /*0xffe07d9a*/
__readmsr(0x2FFu); /*0xffe07da1*/
}
v6 = _mm_cvtsi32_si64(*(unsigned int *)&retaddr[4]); /*0xffe07dc9*/
v7 = _mm_cvtsi32_si64(n5); /*0xffe07dcf*/
v8 = __readcr4(); /*0xffe07dd2*/
__writecr4(v8 | 0x4208); /*0xffe07dda*/
v9 = __readcr0(); /*0xffe07ddd*/
__writecr0(v9 & 0x9FFFFFDF | 0x40000020); /*0xffe07dea*/
if ( _mm_cvtsi64_si32(v7) != 6 ) /*0xffe07df3*/
__asm { invd } /*0xffe07e00*/
__writemsr(0x2FFu, 0); /*0xffe07e0b*/
v10 = __readmsr(0xFEu); /*0xffe07e12*/
v11 = 2 * (unsigned __int8)v10; /*0xffe07e1b*/
do /*0xffe07e2f*/
{
v12 = v11 + 511; /*0xffe07e21*/
__writemsr(v12, 0); /*0xffe07e27*/
v11 = v12 - 512; /*0xffe07e2f*/
}
while ( v11 ); /*0xffe07e2f*/
v13 = _mm_cvtsi64_si32(v6); /*0xffe07e31*/
n4096 = (4 * *(_DWORD *)(v13 + 24)) & 0xFFF; /*0xffe07e44*/
if ( n4096 ) /*0xffe07e49*/
n4096 = 4096; /*0xffe07e4b*/
v15 = _mm_cvtsi32_si128(0); /*0xffe07e54*/
v16 = _mm_cvtsi32_si128(((4 * *(_DWORD *)(v13 + 24)) & 0xFFFFF000) + n4096); /*0xffe07e58*/
for ( i = _mm_cvtsi32_si128(v13); ; i = _mm_cvtsi32_si128(_mm_cvtsi128_si32(v22) + _mm_cvtsi128_si32(i)) ) /*0xffe07e5c*/
{
v18 = _mm_cvtsi128_si32(v16); /*0xffe07e60*/
if ( !v18 ) /*0xffe07e66*/
break; /*0xffe07e66*/
_BitScanForward(&v19, _mm_cvtsi128_si32(i)); /*0xffe07e6c*/
v20 = 1 << v19; /*0xffe07e74*/
if ( 1 << v19 > v18 ) /*0xffe07e78*/
{
_BitScanReverse(&v21, v18); /*0xffe07e7a*/
v20 = 1 << v21; /*0xffe07e82*/
}
v22 = _mm_cvtsi32_si128(v20); /*0xffe07e86*/
LODWORD(v23) = ~(v20 - 1) | 0x800; /*0xffe07e8d*/
v24 = _mm_cvtsi128_si32(v15); /*0xffe07e97*/
HIDWORD(v23) = 15; /*0xffe07e9d*/
__writemsr(v24 + 513, v23); /*0xffe07ea2*/
v25 = (unsigned int)_mm_cvtsi128_si32(i); /*0xffe07ead*/
LODWORD(v25) = v25 | 6; /*0xffe07eb1*/
__writemsr(v24 + 512, v25); /*0xffe07eb4*/
v16 = _mm_cvtsi32_si128(_mm_cvtsi128_si32(v16) - _mm_cvtsi128_si32(v22)); /*0xffe07ec0*/
v15 = _mm_cvtsi32_si128(v24 + 2); /*0xffe07ecb*/
}
__writemsr(0x2FFu, 0x800u); /*0xffe07eeb*/
v26 = __readcr0(); /*0xffe07eed*/
__writecr0(v26 & 0xBFFFFFFF); /*0xffe07ef5*/
v27 = __readmsr(0x179u); /*0xffe07efd*/
v28 = (unsigned __int8)v27; /*0xffe07eff*/
for ( j = 1025; ; j += 4 ) /*0xffe07f06*/
{
__writemsr(j, 0); /*0xffe07f0b*/
if ( !--v28 ) /*0xffe07f0e*/
break; /*0xffe07f0e*/
}
__asm { getsec } /*0xffe07f2c*/
n5_1 = _mm_cvtsi64_si32(v7); /*0xffe07f2e*/
if ( n5_1 && n5_1 != 5 ) /*0xffe07f3c*/
{
v31 = (char *)_mm_cvtsi64_si32(a1); /*0xffe07f42*/
__lgdt(v31); /*0xffe07f45*/
__lidt(v31 - 8); /*0xffe07f48*/
__asm { retf } /*0xffe07f5c*/
}
__outbyte(0xCF9u, 0xAu); /*0xffe07fd9*/
__outbyte(0xCF9u, 6u); /*0xffe07fe0*/
while ( 1 ) /*0xffe07fe1*/
; /*0xffe07fe1*/
}
__writeeflags(v2); /*0xffe07fce*/
_m_empty(); /*0xffe07fcf*/
}