HalpTimerUnmapInterrupt

void __fastcall HalpTimerUnmapInterrupt(__int64 a1, int a2, int a3, char a4){
  int v5; 
  unsigned int v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  unsigned int v13; 
  int v14; 
  int v15; 
  UINT64 v16; 
  __int64 v17[2]; 
  int result[3]; 
  int v19; 
  int v20[6]; 
  unsigned int v21; 
  int v22; 
  int v23; 
  __int16 v24; 
  int v25[10]; 
  v17[0] = 0i64;
  v5 = *(_DWORD *)(a1 + 184);
  if( (v5 & 0x40) != 0 )
  {
    v9 = v5 & 0xFFFFFFBF;
    *(_DWORD *)(a1 + 184) = v9;
    memset((INT64)result, 0i64);
    result[1] = a2;
    v21 = v21 & 0xC0000000 | a3 & 0x3FFFFFFF | 0x40000000;
    if( a4 || (v9 & 0x10) != 0 )
    {
      v15 = *(_DWORD *)(a1 + 236);
      v19 = 0;
      v22 = v15;
      v23 = *(_DWORD *)(a1 + 232);
      v24 = *(_WORD *)(a1 + 240);
      result[0] = 3;
      v20[0] = 1;
LABEL_15:
      LODWORD(v16) = 1;
      HalpInterruptUnmap(v11, v10, *(_QWORD *)(a1 + 288) + 8i64, 0i64, result, v16);
      return;
    }
    v12 = *(_DWORD *)(a1 + 224);
    if( (v12 & 0x200) != 0 )
    {
      if( (int)HalpInterruptGsiToLine(*(_DWORD *)(a1 + 88), v17) < 0 )
        return;
    }
    else if( (v12 & 0x100) != 0 )
    {
      v13 = *(_DWORD *)(a1 + 84);
      if( v13 >= 8 )
      {
        LODWORD(v17[0]) = 45057;
        v13 -= 8;
      }
      else
      {
        LODWORD(v17[0]) = 45056;
      }
      HIDWORD(v17[0]) = v13;
    }
    v14 = *(_DWORD *)(a1 + 96);
    result[0] = 0;
    v20[0] = v14;
    v19 = *(_DWORD *)(a1 + 92);
    HalpInterruptApplyOverrides(v17, &v19, v20);
    if( (int)HalpInterruptLineToGsi((int *)v17, v25) >= 0 )
      goto LABEL_15;
  }
}

Referenced by:

HalpTimerConfigureInterrupt
HalpTimerInitializeClock
HalpTimerTestHypervisorTimer