#define XEN_SYSTEM_TAG 'TSYS'
typedef struct _SYSTEM_CPU {
+ ULONG Index;
CHAR Manufacturer[13];
UCHAR ApicID;
UCHAR ProcessorID;
- KDPC Dpc;
- KEVENT Event;
} SYSTEM_CPU, *PSYSTEM_CPU;
typedef struct _SYSTEM_CONTEXT {
)
{
PSYSTEM_CONTEXT Context = &SystemContext;
+ PKEVENT Event = _Context;
ULONG Index;
PSYSTEM_CPU Cpu;
ULONG EBX;
ULONG ECX;
ULONG EDX;
- UNREFERENCED_PARAMETER(_Context);
+ UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(Argument1);
UNREFERENCED_PARAMETER(Argument2);
Cpu = Context->Cpu[Index];
ASSERT(Cpu != NULL);
- ASSERT3P(Dpc, ==, &Cpu->Dpc);
+ ASSERT3U(Cpu->Index, ==, Index);
Info("====> (%u)\n", Index);
Info("APIC ID: %02X\n", Cpu->ApicID);
Info("PROCESSOR ID: %02X\n", Cpu->ProcessorID);
- KeSetEvent(&Cpu->Event, IO_NO_INCREMENT, FALSE);
+ KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
Info("<==== (%u)\n", Index);
}
break;
}
+ Cpu->Index = Index;
ASSERT3P(Context->Cpu[Index], ==, NULL);
Context->Cpu[Index] = Cpu;
break;
}
case KeProcessorAddCompleteNotify: {
PSYSTEM_CPU Cpu = Context->Cpu[Index];
- PKDPC Dpc = &Cpu->Dpc;
- PKEVENT Event = &Cpu->Event;
+ KEVENT Event;
+ KDPC Dpc;
+
+ ASSERT(Cpu != NULL);
+ ASSERT3U(Cpu->Index, ==, Index);
- KeInitializeDpc(Dpc, SystemCpuInformation, (PVOID)(ULONG_PTR)Index);
- KeSetImportanceDpc(Dpc, HighImportance);
- KeSetTargetProcessorDpc(Dpc, (CCHAR)Index);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
- KeInitializeEvent(Event, NotificationEvent, FALSE);
+ KeInitializeDpc(&Dpc, SystemCpuInformation, &Event);
+ KeSetImportanceDpc(&Dpc, HighImportance);
+ KeSetTargetProcessorDpc(&Dpc, (CCHAR)Index);
- KeInsertQueueDpc(Dpc, NULL, NULL);
+ KeInsertQueueDpc(&Dpc, NULL, NULL);
- (VOID) KeWaitForSingleObject(Event,
+ (VOID) KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
PSYSTEM_CPU Cpu = Context->Cpu[Index];
ASSERT(Cpu != NULL);
+ ASSERT3U(Cpu->Index, ==, Index);
Context->Cpu[Index] = NULL;
__SystemFree(Cpu);