HalpInterruptStartProcessor

BOOL __stdcall HalpInterruptStartProcessor(
        UINT64 NtNumber,
        UINT64 ProcessorId,
        UINT64 Flags,
        _KPROCESSOR_STATE *ProcessorState){
  char v5; 
  NTSTATUS v6; 
  UINT64 *p_MemoryMap; 
  NTSTATUS NextProcessorLocalId; 
  _KPROCESSOR_STATE *v9; 
  CHAR started; 
  INT64 v11; 
  PKINTERRUPT_ROUTINE **v12; 
  UINT32 v13; 
  PKINTERRUPT_ROUTINE *v14; 
  bool v15; 
  INT64 v16; 
  NTSTATUS v17; 
  char v19; 
  UINT64 SourceLine; 
  _TILED_MEMORY_MAP MemoryMap; 
  int v22; 
  UINT64 LocalId; 

  LODWORD(LocalId) = ProcessorId;
  v5 = Flags;
  MemoryMap.PageDirectoryPhysical.QuadPart = 0i64;
  LOBYTE(v6) = 0;
  MemoryMap.PageDirectory = 0i64;
  p_MemoryMap = 0i64;
  if( *(&stru_140CF2E80 + 1859) && (unsigned int)HalpInterruptProcessorsStarted >= *(&stru_140CF2E80 + 1859) )
    return 2;
  NextProcessorLocalId = HalpInterruptGetNextProcessorLocalId((unsigned int)Flags, &LocalId);
  if( byte_140C4A108 || (v5 & 2) != 0 )
  {
    HalpInterruptProcessorRestarting = 1;
    if( NextProcessorLocalId == -1073740024 )
      NextProcessorLocalId = 0;
  }
  else
  {
    HalpInterruptProcessorRestarting = 0;
  }
  if( NextProcessorLocalId < 0 )
    return 2;
  HalpInterruptProcessorHidden = (v5 & 4) != 0;
  started = HalpHvVpStartEnabled();
  v11 = qword_140C49E98;
  MemoryMap.PageTable = (void *)qword_140C49E98;
  if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
  {
    if( HalpMmBuildTiledMemoryMap(&MemoryMap, v9) >= 0 )
    {
      p_MemoryMap = (UINT64 *)&MemoryMap;
      goto LABEL_10;
    }
    return 2;
  }
LABEL_10:
  HalpInterruptBuildStartupStub(
    &MemoryMap.PageTable,
    (PHYSICAL_ADDRESS **)&MemoryMap.PageDirectoryPhysical,
    ProcessorState,
    (__int64)p_MemoryMap);
  v15 = 0;
  if( !started )
  {
    _disable();
    v15 = (v22 & 0x200) != 0;
  }
  *(_BYTE *)(v11 + 4) = 0;
  if( (HalSystemVectorDispatchEntry(v13, v12, v14) & 0x80000000) != 0 )
    goto LABEL_22;
  if( started )
  {
    v17 = HalpHvStartProcessor((unsigned int)LocalId, v16, v11);
  }
  else
  {
    v17 = -1073741823;
    if( !*(_QWORD *)(Controller + 128) )
      goto LABEL_33;
    v17 = (*(__int64(__fastcall **)(_QWORD, _QWORD, INT64, _QWORD))(Controller + 128))(
            *(_QWORD *)(Controller + 16),
            (unsigned int)LocalId,
            v11,
            MemoryMap.PageDirectoryPhysical.anonymous_0.LowPart);
  }
  if( v17 >= 0 )
  {
    v6 = HalpInterruptWaitForProcessorStartUp((_BYTE *)(v11 + 4), started);
    if( v6 != 4 )
    {
      LODWORD(SourceLine) = 1191;
      HalpInterruptSetProblemEx(
        (_REGISTERED_INTERRUPT_CONTROLLER *)Controller,
        InterruptProblemProcessorNotAlive,
        0i64,
        "minkernel\\hals\\lib\\interrupts\\common\\start.c",
        SourceLine);
    }
    goto LABEL_19;
  }
LABEL_33:
  LODWORD(SourceLine) = 1197;
  HalpInterruptSetProblemEx(
    (_REGISTERED_INTERRUPT_CONTROLLER *)Controller,
    InterruptProblemStartProcessorFailed,
    (unsigned int)v17,
    "minkernel\\hals\\lib\\interrupts\\common\\start.c",
    SourceLine);
  LOBYTE(v6) = v19 - 11;
LABEL_19:
  if( !started && v15 )
    _enable();
LABEL_22:
  if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
  {
    if( p_MemoryMap )
      HalpMmFreeTiledMemoryMap(p_MemoryMap);
  }
  HalpInterruptProcessorHidden = 0;
  return v6;
}

Referenced by:

HalStartDynamicProcessor
HalStartNextProcessor
HalpBlkStartBlockedProcessor
HalpDpStartProcessor