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