Newer
Older
AMI-Aptio-BIOS-Reversed / EarlyVideoPei / MmioCfgRead.c
@Ajax Dong Ajax Dong 2 days ago 3 KB Init
int __cdecl MmioCfgRead(int a1, int a2, unsigned int a3, unsigned __int32 a4, int a5, int a6)
{
  unsigned __int32 v6; // esi
  unsigned __int32 v8; // ebx
  unsigned __int32 v9; // edi
  int v10; // ecx
  char i_1; // dl
  char v12; // bp
  unsigned __int32 v13; // ecx
  bool v14; // zf
  int v15; // ecx
  int v16; // ecx
  char i_3; // dl
  char v18; // al
  unsigned __int8 v19; // cl
  char i_2; // [esp+5h] [ebp-13h]
  char i; // [esp+6h] [ebp-12h]
  unsigned __int8 v22; // [esp+6h] [ebp-12h]
  unsigned __int8 v23; // [esp+7h] [ebp-11h]
  char n16; // [esp+8h] [ebp-10h]
  char v25; // [esp+10h] [ebp-8h]
  unsigned __int32 v26; // [esp+14h] [ebp-4h] BYREF

  v6 = a4;
  if ( (a4 & 0xFFFFF) != 0 || (a5 & 0xFFFFF) != 0 || (a6 & 0xFFF) != 0 || (a6 & 0xFFF0000) != 0 )
    return -2147483641;
  n16 = 16;
  v8 = a3 >> 8;
  v9 = (unsigned __int16)a6;
  v10 = 3 * (unsigned __int8)a3;
  i_1 = *(_BYTE *)(v10 + a2 - 2);
  v12 = *(_BYTE *)(v10 + a2 - 1);
  for ( i = i_1; ; i_1 = i )
  {
    PciCfgRead16(v8, i_1, v12, n16, 0xFFFFFFFF);
    PciCfgReadModifyWrite(v8, i, v12, n16, &v26);
    if ( !v26 )
      goto LABEL_20;
    v13 = ~(v26 & 0xFFFFFFF0);
    if ( (v26 & 1) != 0 )
    {
      if ( (v13 & v9) != 0 )
        v9 = v26 & 0xFFFFFFF0 & (~(v26 & 0xFFFFFFF0) + v9 + 1);
      v8 = v9 | v26 & 0xF;
      v9 += v13 + 1;
    }
    else
    {
      if ( (v13 & v6) != 0 )
        v6 = v26 & 0xFFFFFFF0 & (~(v26 & 0xFFFFFFF0) + v6 + 1);
      v8 = v6 | v26 & 0xF;
      v6 += v13 + 1;
    }
    v26 = v8;
    if ( v6 > a4 + a5 || v9 > (unsigned __int16)a6 + (unsigned int)HIWORD(a6) )
      return -2147483641;
    PciCfgRead16(BYTE1(a3), i, v12, n16, v8);
    if ( (v8 & 1) != 0 )
    {
LABEL_20:
      LOBYTE(v8) = BYTE1(a3);
    }
    else
    {
      v14 = (v8 & 6) == 4;
      LOBYTE(v8) = BYTE1(a3);
      if ( v14 )
      {
        n16 += 4;
        PciCfgRead16(BYTE1(a3), i, v12, n16, 0);
      }
    }
    n16 += 4;
    if ( (unsigned __int8)n16 >= 0x28u )
      break;
  }
  v23 = 0;
  if ( (unsigned __int8)a3 - 1 > 0 )
  {
    v15 = 0;
    do
    {
      v16 = 3 * v15;
      i_3 = *(_BYTE *)(v16 + a2 + 1);
      v18 = *(_BYTE *)(v16 + a2 + 2);
      v19 = *(_BYTE *)(v16 + a2);
      v25 = v18;
      v22 = v19;
      i_2 = i_3;
      if ( v6 <= a4 )
      {
        PciCfgWrite(v19, i_3, v18, 0x20u, 0xFFF0u);
        PciCfgWrite(v22, i_2, v25, 0x22u, 0);
      }
      else
      {
        PciCfgWrite(v19, i_3, v18, 0x20u, HIWORD(a4) & 0xFFF0);
        PciCfgWrite(v22, i_2, v25, 0x22u, HIWORD(v6) & 0xFFF0);
      }
      if ( v9 <= (unsigned __int16)a6 )
      {
        VgaCrtcRegReadModifyWrite(v22, i_2, v25, 28, 0xF0u);
        VgaCrtcRegReadModifyWrite(v22, i_2, v25, 29, 0);
        PciCfgWrite(v22, i_2, v25, 0x30u, 0xFFu);
      }
      else
      {
        VgaCrtcRegReadModifyWrite(v22, i_2, v25, 28, BYTE1(a6) & 0xF0);
        VgaCrtcRegReadModifyWrite(v22, i_2, v25, 29, BYTE1(v9) & 0xF0);
        PciCfgWrite(v22, i_2, v25, 0x30u, 0);
      }
      PciCfgWrite(v22, i_2, v25, 0x32u, 0);
      PciCfgWrite(v22, i_2, v25, 0x24u, 0xFFF0u);
      PciCfgWrite(v22, i_2, v25, 0x26u, 0);
      PciCfgRead16(v22, i_2, v25, 40, 0xFFFFFFFF);
      PciCfgRead16(v22, i_2, v25, 44, 0);
      v15 = ++v23;
    }
    while ( v23 < (unsigned __int8)a3 - 1 );
  }
  return 0;
}