PHYSICAL_ADDRESS MaximumPhysicalAddress;
BOOLEAN RealTimeIsUniversal;
SYSTEM_WATCHDOG Watchdog;
+ BOOLEAN RegisterVcpuInfo;
PMDL Mdl;
} SYSTEM_CONTEXT, *PSYSTEM_CONTEXT;
if (Cpu >= Context->ProcessorCount)
goto fail1;
+ status = STATUS_NOT_SUPPORTED;
+ if (Processor->Registered == NULL)
+ goto fail2;
+
ASSERT(*Processor->Registered);
*Vcpu = Processor->Vcpu;
return STATUS_SUCCESS;
+fail2:
fail1:
return status;
}
PUCHAR MdlMappedSystemVa;
NTSTATUS status;
+ ASSERT(Context->RegisterVcpuInfo);
+
status = STATUS_UNSUCCESSFUL;
if (Cpu >= Context->ProcessorCount)
goto fail1;
PSYSTEM_CONTEXT Context = &SystemContext;
PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu];
+ ASSERT(Context->RegisterVcpuInfo);
+
Processor->Vcpu = NULL;
Processor->Registered = NULL;
}
SystemProcessorInitialize(Cpu);
- status = SystemProcessorRegisterVcpuInfo(Cpu, FALSE);
- if (!NT_SUCCESS(status))
- goto fail1;
+ if (Context->RegisterVcpuInfo) {
+ status = SystemProcessorRegisterVcpuInfo(Cpu, FALSE);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+ }
Info("<==== (%u:%u)\n", ProcNumber.Group, ProcNumber.Number);
switch (Change->State) {
case KeProcessorAddStartNotify:
break;
-
case KeProcessorAddCompleteNotify: {
PSYSTEM_PROCESSOR Processor;
ULONG Size;
NTSTATUS status;
+ ASSERT(Context->RegisterVcpuInfo);
+
Size = sizeof (vcpu_info_t) * HVM_MAX_VCPUS;
Size += sizeof (BOOLEAN) * HVM_MAX_VCPUS;
Size = P2ROUNDUP(Size, PAGE_SIZE);
{
PSYSTEM_CONTEXT Context = &SystemContext;
+ ASSERT(Context->RegisterVcpuInfo);
+
DriverPutNamedPages(Context->Mdl);
Context->Mdl = NULL;
}
PVOID Handle;
NTSTATUS status;
- status = SystemAllocateVcpuInfo();
- if (!NT_SUCCESS(status))
- goto fail1;
+ if (Context->RegisterVcpuInfo) {
+ status = SystemAllocateVcpuInfo();
+ if (!NT_SUCCESS(status))
+ goto fail1;
+ }
Handle = KeRegisterProcessorChangeCallback(SystemProcessorChangeCallback,
NULL,
fail2:
Error("fail2\n");
- SystemFreeVcpuInfo();
+ if (Context->RegisterVcpuInfo)
+ SystemFreeVcpuInfo();
fail1:
Error("fail1 (%08x)\n", status);
for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) {
PSYSTEM_PROCESSOR Processor = &Context->Processor[Cpu];
- SystemProcessorDeregisterVcpuInfo(Cpu);
+ if (Context->RegisterVcpuInfo)
+ SystemProcessorDeregisterVcpuInfo(Cpu);
+
SystemProcessorTeardown(Cpu);
RtlZeroMemory(&Processor->Dpc, sizeof (KDPC));
ASSERT(IsZeroMemory(Processor, sizeof (SYSTEM_PROCESSOR)));
}
- SystemFreeVcpuInfo();
+ if (Context->RegisterVcpuInfo)
+ SystemFreeVcpuInfo();
}
static NTSTATUS
{
PSYSTEM_CONTEXT Context = &SystemContext;
LONG References;
+ HANDLE ParametersKey;
+ ULONG RegisterVcpuInfo;
NTSTATUS status;
References = InterlockedIncrement(&Context->References);
if (Context->Processor == NULL)
goto fail2;
+ ParametersKey = DriverGetParametersKey();
+
+ status = RegistryQueryDwordValue(ParametersKey,
+ "RegisterVcpuInfo",
+ &RegisterVcpuInfo);
+ if (NT_SUCCESS(status))
+ Context->RegisterVcpuInfo = (RegisterVcpuInfo != 0) ? TRUE : FALSE;
+ else
+ Context->RegisterVcpuInfo = (Context->ProcessorCount > XEN_LEGACY_MAX_VCPUS) ?
+ TRUE : FALSE;
+
status = SystemGetStartOptions();
if (!NT_SUCCESS(status))
goto fail3;
}
}
+static BOOLEAN
+EvtchnIsProcessorEnabled(
+ IN PXENBUS_EVTCHN_CONTEXT Context,
+ IN ULONG Cpu
+ )
+{
+ vcpu_info_t *Vcpu;
+ NTSTATUS status;
+
+ status = SystemProcessorVcpuInfo(Cpu, &Vcpu);
+ if (!NT_SUCCESS(status)) {
+ unsigned int vcpu_id;
+
+ ASSERT(status == STATUS_NOT_SUPPORTED);
+
+ status = SystemProcessorVcpuId(Cpu, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
+
+ if (vcpu_id >= XEN_LEGACY_MAX_VCPUS)
+ return FALSE;
+ }
+
+ return XENBUS_EVTCHN_ABI(IsProcessorEnabled,
+ &Context->EvtchnAbi,
+ Cpu);
+}
+
static NTSTATUS
EvtchnAcquire(
IN PINTERFACE Interface
for (Cpu = 0; Cpu < Context->ProcessorCount; Cpu++) {
PXENBUS_EVTCHN_PROCESSOR Processor;
- if (!XENBUS_EVTCHN_ABI(IsProcessorEnabled,
- &Context->EvtchnAbi,
- Cpu))
+ if (!EvtchnIsProcessorEnabled(Context, Cpu))
continue;
status = KeGetProcessorNumberFromIndex(Cpu, &ProcNumber);