HalpInterruptStartProcessor

__int64 __fastcall HalpInterruptStartProcessor(unsigned int a1, unsigned int a2, unsigned int a3, const void *a4){
  char v5; 
  unsigned int v7; 
  UINT64 *v8; 
  NTSTATUS NextProcessorLocalId; 
  __int64 v10; 
  CHAR started; 
  INT64 v12; 
  bool v13; 
  INT64 v14; 
  int v15; 
  int v17; 
  UINT64 SourceLine; 
  __int64 v19; 
  PHYSICAL_ADDRESS v20; 
  INT64 v21; 
  int v22; 
  UINT64 LocalId; 
  LODWORD(LocalId) = a2;
  v5 = a3;
  v20.QuadPart = 0i64;
  v7 = 0;
  v19 = 0i64;
  v8 = 0i64;
  if( HalpInterruptProcessorCap && *(_DWORD *)HalpInterruptProcessorsStarted >= (unsigned int)HalpInterruptProcessorCap )
    return 2i64;
  NextProcessorLocalId = HalpInterruptGetNextProcessorLocalId(a3, &LocalId);
  if( HalpHiberInProgress || (v5 & 2) != 0 )
  {
    HalpInterruptProcessorRestarting = 1;
    if( NextProcessorLocalId == -1073740024 )
      NextProcessorLocalId = 0;
  }
  else
  {
    HalpInterruptProcessorRestarting = 0;
  }
  if( NextProcessorLocalId < 0 )
    return 2i64;
  HalpInterruptProcessorHidden = (v5 & 4) != 0;
  started = HalpHvVpStartEnabled();
  v12 = HalpLowStub;
  v21 = HalpLowStub;
  if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
  {
    if( (int)HalpMmBuildTiledMemoryMap((unsigned int *)&v19, v10, a1) >= 0 )
    {
      v8 = (UINT64 *)&v19;
      goto LABEL_10;
    }
    return 2i64;
  }
LABEL_10:
  HalpInterruptBuildStartupStub((PVOID *)&v21, &v20, a4, (__int64)v8);
  v13 = 0;
  if( !started )
  {
    _disable();
    v13 = (v22 & 0x200) != 0;
  }
  *(_BYTE *)(v12 + 4) = 0;
  if( (int)HalSystemVectorDispatchEntry() < 0 )
    goto LABEL_22;
  if( started )
  {
    v15 = HalpHvStartProcessor((unsigned int)LocalId, v14, v12);
  }
  else
  {
    v15 = -1073741823;
    if( !*(_QWORD *)(HalpInterruptController + 128) )
      goto LABEL_33;
    v15 = (*(__int64(__fastcall **)(_QWORD, _QWORD, INT64, _QWORD))(HalpInterruptController + 128))(
            *(_QWORD *)(HalpInterruptController + 16),
            (unsigned int)LocalId,
            v12,
            v20.LowPart);
  }
  if( v15 >= 0 )
  {
    v7 = HalpInterruptWaitForProcessorStartUp((BYTE *)(v12 + 4), started);
    if( v7 != 4 )
    {
      LODWORD(SourceLine) = 1191;
      HalpInterruptSetProblemEx(
        (_REGISTERED_INTERRUPT_CONTROLLER *)HalpInterruptController,
        InterruptProblemProcessorNotAlive,
        0i64,
        "minkernel\\hals\\lib\\interrupts\\common\\start.c",
        SourceLine);
    }
    goto LABEL_19;
  }
LABEL_33:
  LODWORD(SourceLine) = 1197;
  HalpInterruptSetProblemEx(
    (_REGISTERED_INTERRUPT_CONTROLLER *)HalpInterruptController,
    InterruptProblemStartProcessorFailed,
    (unsigned int)v15,
    "minkernel\\hals\\lib\\interrupts\\common\\start.c",
    SourceLine);
  v7 = v17 - 11;
LABEL_19:
  if( !started && v13 )
    _enable();
LABEL_22:
  if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
  {
    if( v8 )
      HalpMmFreeTiledMemoryMap(v8);
  }
  HalpInterruptProcessorHidden = 0;
  return v7;
}

Referenced by:

HalStartDynamicProcessor
HalStartNextProcessor
HalpBlkStartBlockedProcessor
HalpDpStartProcessor