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