CHAR Manufacturer[13];
UCHAR ApicID;
UCHAR ProcessorID;
+ BOOLEAN Initialized;
NTSTATUS Status;
KEVENT Event;
vcpu_info_t *Vcpu;
if (Cpu >= Context->ProcessorCount)
goto fail1;
+ status = STATUS_NOT_SUPPORTED;
+ if (!Processor->Initialized)
+ goto fail2;
+
*vcpu_id = Processor->ProcessorID;
return STATUS_SUCCESS;
+fail2:
fail1:
return status;
}
goto fail1;
status = STATUS_NOT_SUPPORTED;
- if (Processor->Registered == NULL)
+ if (!Processor->Initialized)
goto fail2;
+ if (Processor->Registered == NULL)
+ goto fail3;
+
ASSERT(*Processor->Registered);
*Vcpu = Processor->Vcpu;
return STATUS_SUCCESS;
+fail3:
fail2:
fail1:
return status;
if (Cpu >= Context->ProcessorCount)
goto fail1;
+ ASSERT(Processor->Initialized);
+
ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
MdlMappedSystemVa = Mdl->MappedSystemVa;
Processor = &Context->Processor[Cpu];
KeInitializeEvent(&Processor->Event, NotificationEvent, FALSE);
+ Processor->Initialized = TRUE;
KeInitializeDpc(&Processor->Dpc, SystemProcessorDpc, NULL);
KeSetImportanceDpc(&Processor->Dpc, HighImportance);
for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) {
PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu];
+ // Should check Processor->Initialized, but these operations are harmless to
+ // uninitialized SYSTEM_PROCESSOR structures.
SystemProcessorDeregisterVcpuInfo(Cpu);
SystemProcessorTeardown(Cpu);
+ Processor->Initialized = FALSE;
RtlZeroMemory(&Processor->Dpc, sizeof (KDPC));
RtlZeroMemory(&Processor->Event, sizeof (KEVENT));
Processor->Status = 0;
{
PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu];
+ if (!Processor->Initialized)
+ continue;
+
(VOID) KeWaitForSingleObject(&Processor->Event,
Executive,
KernelMode,
goto fail1;
status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ goto fail2;
status = EventChannelBindVirq(Index, vcpu_id, &LocalPort);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
Channel->Parameters.Virq.Index = Index;
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
fail2:
Error("fail2\n");
LocalPort = Channel->LocalPort;
status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ goto fail2;
status = EventChannelBindVirtualCpu(LocalPort, vcpu_id);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
Channel->Cpu = Cpu;
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
fail2:
Error("fail2\n");
continue;
status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ continue;
Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
continue;
status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ continue;
(VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
Processor->UpcallEnabled = FALSE;
goto fail1;
status = SystemProcessorVcpuId(Index, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ goto fail2;
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = EventChannelInitControl(Pfn, vcpu_id);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
Address.QuadPart = (ULONGLONG)Pfn << PAGE_SHIFT;
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
fail2:
Error("fail2\n");