typedef struct _XEN_DRIVER {
PLOG_DISPOSITION XenDisposition;
PLOG_DISPOSITION QemuDisposition;
+ HANDLE ParametersKey;
HANDLE UnplugKey;
HANDLE MemoryKey;
} XEN_DRIVER, *PXEN_DRIVER;
return (*InitSafeBootMode > 0) ? TRUE : FALSE;
}
+static FORCEINLINE VOID
+__DriverSetParametersKey(
+ IN HANDLE Key
+ )
+{
+ Driver.ParametersKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetParametersKey(
+ VOID
+ )
+{
+ return Driver.ParametersKey;
+}
+
+HANDLE
+DriverGetParametersKey(
+ VOID
+ )
+{
+ return __DriverGetParametersKey();
+}
+
static FORCEINLINE VOID
__DriverSetUnplugKey(
IN HANDLE Key
if (!NT_SUCCESS(status))
goto fail4;
+ __DriverSetParametersKey(ParametersKey);
+
status = LogReadLogLevel(ParametersKey,
"XenLogLevel",
&LogLevel);
if (!NT_SUCCESS(status))
goto fail12;
- RegistryCloseKey(ParametersKey);
-
RegistryCloseKey(ServiceKey);
Trace("<====\n");
Driver.XenDisposition = NULL;
RegistryCloseKey(ParametersKey);
+ __DriverSetParametersKey(NULL);
fail4:
Error("fail4\n");
{
HANDLE MemoryKey;
HANDLE UnplugKey;
+ HANDLE ParametersKey;
Trace("====>\n");
RegistryCloseKey(UnplugKey);
__DriverSetUnplugKey(NULL);
+ ParametersKey = __DriverGetParametersKey();
+
+ RegistryCloseKey(ParametersKey);
+ __DriverSetParametersKey(NULL);
+
RegistryTeardown();
Info("XEN %d.%d.%d (%d) (%02d.%02d.%04d)\n",
PHYSICAL_ADDRESS MaximumPhysicalAddress;
BOOLEAN RealTimeIsUniversal;
SYSTEM_WATCHDOG Watchdog;
+ BOOLEAN RegisterVcpuInfo;
PMDL Mdl;
} SYSTEM_CONTEXT, *PSYSTEM_CONTEXT;
if (Cpu >= __SystemProcessorCount())
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 >= __SystemProcessorCount())
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);
NTSTATUS status;
UNREFERENCED_PARAMETER(Argument);
+ UNREFERENCED_PARAMETER(Status);
Cpu = Change->NtNumber;
ProcessorChangeName(Change->State));
switch (Change->State) {
- case KeProcessorAddStartNotify: {
- PSYSTEM_PROCESSOR Processor;
- ULONG ProcessorCount;
-
- if (Cpu < Context->ProcessorCount)
- break;
-
- ProcessorCount = Cpu + 1;
- Processor = __SystemAllocate(sizeof (SYSTEM_PROCESSOR) *
- ProcessorCount);
-
- if (Processor == NULL) {
- *Status = STATUS_NO_MEMORY;
- break;
- }
-
- if (Context->ProcessorCount != 0) {
- RtlCopyMemory(Processor,
- Context->Processor,
- sizeof (SYSTEM_PROCESSOR) *
- Context->ProcessorCount);
- __SystemFree(Context->Processor);
- }
-
- Context->Processor = Processor;
- KeMemoryBarrier();
-
- Context->ProcessorCount = ProcessorCount;
+ 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 < __SystemProcessorCount(); 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)));
}
- __SystemFree(Context->Processor);
- Context->Processor = NULL;
- Context->ProcessorCount = 0;
-
- SystemFreeVcpuInfo();
+ if (Context->RegisterVcpuInfo)
+ SystemFreeVcpuInfo();
}
static NTSTATUS
{
PSYSTEM_CONTEXT Context = &SystemContext;
LONG References;
+ HANDLE ParametersKey;
+ ULONG RegisterVcpuInfo;
NTSTATUS status;
References = InterlockedIncrement(&Context->References);
if (References != 1)
goto fail1;
+ Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
+ Context->Processor = __SystemAllocate(sizeof (SYSTEM_PROCESSOR) * Context->ProcessorCount);
+
+ status = STATUS_NO_MEMORY;
+ 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 fail2;
+ goto fail3;
status = SystemGetVersionInformation();
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail4;
status = SystemGetMemoryInformation();
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail5;
status = SystemGetAcpiInformation();
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
status = SystemRegisterProcessorChangeCallback();
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
status = SystemRegisterPowerStateCallback();
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
status = SystemGetTimeInformation();
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail9;
status = SystemCheckProcessors();
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail10;
return STATUS_SUCCESS;
+fail10:
+ Error("fail10\n");
+
fail9:
Error("fail9\n");
+ SystemDeregisterPowerStateCallback();
+
fail8:
Error("fail8\n");
- SystemDeregisterPowerStateCallback();
+ SystemDeregisterProcessorChangeCallback();
fail7:
Error("fail7\n");
- SystemDeregisterProcessorChangeCallback();
+ __SystemFree(Context->Madt);
+ Context->Madt = NULL;
fail6:
Error("fail6\n");
- __SystemFree(Context->Madt);
- Context->Madt = NULL;
-
fail5:
Error("fail5\n");
fail3:
Error("fail3\n");
+ __SystemFree(Context->Processor);
+
fail2:
Error("fail2\n");
+ Context->ProcessorCount = 0;
+
fail1:
Error("fail1 (%08x)\n", status);
Context->MaximumPhysicalAddress.QuadPart = 0;
+ __SystemFree(Context->Processor);
+ Context->ProcessorCount = 0;
+
(VOID) InterlockedDecrement(&Context->References);
ASSERT(IsZeroMemory(Context, sizeof (SYSTEM_CONTEXT)));