KiUpdateSpecCtrlEnhancedIBRS
CHAR __fastcall KiUpdateSpecCtrlEnhancedIBRS(INT64 a1, INT64 a2){
__int64 v2;
char v4;
unsigned __int8 v5;
int v6;
__int64 v7;
int v9;
v2 = *(_QWORD *)(a1 + 240);
v9 = KiSpeculationFeatures;
if( !v2 || v2 == *(_QWORD *)(a2 + 2528) || (KiSpeculationFeatures & 0x400) != 0 )
{
*(_BYTE *)(a1 + 248) &= 0xDBu;
}
else
{
v4 = *(_BYTE *)(a1 + 248) | 4;
*(_BYTE *)(a1 + 248) = v4;
if( (v9 & 8) == 0 )
*(_BYTE *)(a1 + 248) = v4 | 0x20;
}
v5 = *(_BYTE *)(a1 + 250) | 1;
*(_BYTE *)(a1 + 251) = 1;
*(_BYTE *)(a1 + 1744) = 1;
*(_BYTE *)(a1 + 253) = 1;
v6 = *(_DWORD *)(a2 + 2172);
v7 = *(_QWORD *)(a2 + 2528);
if( (v6 & 0x400000) == 0 )
v7 = 1i64;
if( (v9 & 0x800000) != 0 )
{
if( v7 )
{
*(_BYTE *)(a1 + 251) |= 4u;
*(_BYTE *)(a1 + 1744) |= 4u;
v5 |= 4u;
}
if( (*(_DWORD *)(a2 + 2516) & 0x2000) != 0 )
*(_BYTE *)(a1 + 253) |= 4u;
}
if( !v7 && (v9 & 0x800) != 0 && ((*(_DWORD *)(a2 + 2172) & 0x1000) == 0 || (*(_BYTE *)(a1 + 250) & 1) == 0) )
{
LOBYTE(v6) = -2;
*(_BYTE *)(a1 + 251) &= ~1u;
v5 &= ~1u;
*(_BYTE *)(a1 + 1744) &= ~1u;
*(_BYTE *)(a1 + 253) &= ~1u;
}
if( (v9 & 0x2000) != 0 )
{
*(_BYTE *)(a1 + 251) |= 0x80u;
*(_BYTE *)(a1 + 1744) |= 0x80u;
}
if( v5 != *(_BYTE *)(a1 + 250) )
{
*(_BYTE *)(a1 + 250) = v5;
LOBYTE(v6) = v5;
__writemsr(0x48u, v5);
}
return v6;
}Referenced by:
KiUpdateSpeculationControl