HvlEnlightenProcessor
VOID __stdcall HvlEnlightenProcessor(CHAR a1, INT64 a2, INT64 a3, INT64 *a4){
struct _KPRCB *CurrentPrcb;
int v5;
char v6;
__int64 v7;
INT64 v8;
INT64 v9;
UINT64 v10;
UINT64 v11;
VOID *v12;
UINT64 v13;
UINT64 v14;
INT64 v15;
char v16;
_HVLP_LPCB *LpcbByLpIndex;
unsigned int v18;
unsigned int LpIndexFromProcessorIndex;
INT64 v20;
INT64 v21;
UINT64 v22;
unsigned __int64 v23;
VOID *v24;
unsigned __int64 v25;
INT64 v26;
INT64 v27;
INT64 v28;
INT64 v29;
INT64 v30;
INT64 v31;
INT64 v32;
INT64 v33;
INT64 v34;
INT64 v35;
UINT64 RegisterValue;
UINT64 v37;
UINT64 v38;
RegisterValue = 0i64;
v38 = 0i64;
if( (_BYTE)HvlHypervisorConnected && (!a1 || (HvlpFlags & 2) == 0) )
{
CurrentPrcb = KeGetCurrentPrcb();
if( !a1 )
{
HvlpGetRegister64(HvRegisterVpIndex, &RegisterValue, a3);
v5 = RegisterValue;
a3 = (unsigned int)RegisterValue >> 6;
v6 = RegisterValue & 0x3F;
HvlpVirtualProcessorMapping[2 * CurrentPrcb->Number] = a3;
HvlpVirtualProcessorMapping[2 * CurrentPrcb->Number + 1] = v6;
if( v5 != CurrentPrcb->Number )
HvlpVirtualProcessorsIdentityMapped = 0;
if( (unsigned int)a3 < 0x10 )
{
if( (unsigned int)a3 > (((unsigned int)HvlpFlags >> 8) & 0xF) )
{
a3 = ((unsigned __int16)HvlpFlags ^ (unsigned __int16)((_WORD)a3 << 8)) & 0xF00;
LODWORD(HvlpFlags) = a3 ^ HvlpFlags;
}
}
else
{
HvlEnlightenments &= ~0x80u;
HvlpEnlightenments &= ~0x80u;
}
}
if( (HvlpFlags & 0x80000) != 0 )
{
v37 = 0i64;
if( (HvlpFlags & 2) != 0 )
{
HvlpGetRegister64(HvRegisterVpAssistPage, &v37, a3);
v10 = v37;
v11 = v37 & 0xFFFFFFFFFFFFF000ui64;
if( CurrentPrcb->Number )
v12 = MmMapIoSpaceEx((_LARGE_INTEGER)v11, 0x1000ui64, 4ui64);
else
v12 = (VOID *)((__int64(__fastcall *)(UINT64, __int64, __int64))qword_140C00720)(v11, 1i64, 4i64);
CurrentPrcb->VirtualApicAssist = v12;
}
else
{
LODWORD(v7) = MmGetPhysicalAddress((UINT64)CurrentPrcb->VirtualApicAssist);
v10 = v7 & 0xFFFFFFFFFFFFF000ui64;
}
HvlpSetRegister64(HvRegisterVpAssistPage, v10 | 1, v8, v9, v28, v30, v32, v34);
}
HvlpSetupSchedulerAssist((INT64)CurrentPrcb);
v16 = HvlpFlags;
LpcbByLpIndex = 0i64;
v18 = ((unsigned int)HvlpFlags >> 1) & 1;
if( v18 )
{
LpIndexFromProcessorIndex = HvlGetLpIndexFromProcessorIndex(CurrentPrcb->Number);
LpcbByLpIndex = HvlpGetLpcbByLpIndex(LpIndexFromProcessorIndex);
}
if( v18 && (v16 & 0x20) != 0 )
{
HvlpGetRegister64(HvRegisterSipp, &v38, v14);
v22 = v38;
if( (v38 & 1) == 0 )
{
v22 = v38 | 1;
HvlpSetRegister64(HvRegisterSipp, v38 | 1, v20, v21, v28, v30, v32, v34);
}
v23 = v22 & 0xFFFFFFFFFFFFF000ui64;
if( CurrentPrcb->Number )
v24 = MmMapIoSpaceEx((_LARGE_INTEGER)v23, 0x1000ui64, 4ui64);
else
v24 = (VOID *)((__int64(__fastcall *)(unsigned __int64, __int64))qword_140C00720)(v23, 1i64);
*((_QWORD *)LpcbByLpIndex + 5) = v24;
}
if( (HvlpFlags & 2) != 0 && (HvlpFlags & 0x20) != 0 )
{
v25 = ((unsigned __int64)((HvlpFlags & 0x10) == 0) << 17) | 0x30;
HvlpSetRegister64(HvRegisterSint0, v25, v14, v15, v28, v30, v32, v34);
HvlpSetRegister64(HvRegisterSint4, v25, v26, v27, v29, v31, v33, v35);
HvlSharedIsr();
}
if( (HvlpFlags & 2) != 0 )
{
if( CurrentPrcb->Number )
HvlpDiscoverTopologyLocal(
v13,
(unsigned int)LpcbByLpIndex[2],
(UINT64 *)LpcbByLpIndex + 2,
(UINT64 *)(LpcbByLpIndex + 5));
}
}
}Referenced by:
HvlpInitializeBootProcessor
KiInitializeKernel
PopHandleNextState