Newer
Older
AMI-Aptio-BIOS-Reversed / TxtPei / BiosAcmInvoke.c
@Ajax Dong Ajax Dong 2 days ago 4 KB Init
// 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*/
}