XEN_API
ULONG
+SystemProcessorCount(
+ VOID
+ );
+
+XEN_API
+NTSTATUS
SystemVirtualCpuIndex(
- IN ULONG Index
+ IN ULONG Index,
+ OUT unsigned int *vcpu_id
);
#endif // _XEN_H
}
Context->Processor = Processor;
+ KeMemoryBarrier();
+
Context->ProcessorCount = ProcessorCount;
break;
}
return status;
}
+static FORCEINLINE ULONG
+__SystemProcessorCount(
+ VOID
+ )
+{
+ PSYSTEM_CONTEXT Context = &SystemContext;
+
+ KeMemoryBarrier();
+
+ return Context->ProcessorCount;
+}
+
XEN_API
ULONG
+SystemProcessorCount(
+ VOID
+ )
+{
+ return __SystemProcessorCount();
+}
+
+XEN_API
+NTSTATUS
SystemVirtualCpuIndex(
- IN ULONG Index
+ IN ULONG Index,
+ OUT unsigned int *vcpu_id
)
{
PSYSTEM_CONTEXT Context = &SystemContext;
PSYSTEM_PROCESSOR Processor = &Context->Processor[Index];
+ NTSTATUS status;
- ASSERT3U(Index, <, Context->ProcessorCount);
+ status = STATUS_UNSUCCESSFUL;
+ if (Index >= __SystemProcessorCount())
+ goto fail1;
+
+ *vcpu_id = Processor->ProcessorID;
+ return STATUS_SUCCESS;
- return Processor->ProcessorID;
+fail1:
+ return status;
}
VOID
goto done;
LocalPort = Channel->LocalPort;
- vcpu_id = SystemVirtualCpuIndex(Index);
+
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
status = EventChannelBindVirtualCpu(LocalPort, vcpu_id);
if (!NT_SUCCESS(status))
if (Processor->Interrupt == NULL)
continue;
- vcpu_id = SystemVirtualCpuIndex(Index);
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
+
Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
if (!Processor->UpcallEnabled)
continue;
- vcpu_id = SystemVirtualCpuIndex(Index);
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
(VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
Processor->UpcallEnabled = FALSE;
if (Context->Interrupt == NULL)
goto fail8;
- Context->ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+ Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
Context->Processor = __EvtchnAllocate(sizeof (XENBUS_EVTCHN_PROCESSOR) * Context->ProcessorCount);
status = STATUS_NO_MEMORY;
ProcNumber.Number,
EvtchnInterruptCallback,
Context);
- ASSERT(Processor->Interrupt != NULL);
+
+ if (Processor->Interrupt == NULL)
+ continue;
InitializeListHead(&Processor->PendingList);
static BOOLEAN
EvtchnTwoLevelIsProcessorEnabled(
- IN PXENBUS_EVTCHN_ABI_CONTEXT _Context,
- IN ULONG Index
+ IN PXENBUS_EVTCHN_ABI_CONTEXT _Context,
+ IN ULONG Index
)
{
+ unsigned int vcpu_id;
+ NTSTATUS status;
+
UNREFERENCED_PARAMETER(_Context);
- return (SystemVirtualCpuIndex(Index) == 0) ? TRUE : FALSE;
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ return FALSE;
+
+ if (vcpu_id != 0)
+ return FALSE;
+
+ return TRUE;
}
static BOOLEAN
)
{
PXENBUS_EVTCHN_FIFO_CONTEXT Context = (PVOID)_Context;
- unsigned int vcpu_id = SystemVirtualCpuIndex(Index);
+ unsigned int vcpu_id;
+ NTSTATUS status;
+
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ return FALSE;
return (Context->ControlBlockMdl[vcpu_id] != NULL) ? TRUE : FALSE;
}
)
{
PXENBUS_EVTCHN_FIFO_CONTEXT Context = (PVOID)_Context;
- unsigned int vcpu_id = SystemVirtualCpuIndex(Index);
+ unsigned int vcpu_id;
PMDL Mdl;
evtchn_fifo_control_block_t *ControlBlock;
ULONG Ready;
ULONG Priority;
BOOLEAN DoneSomething;
-
- Mdl = Context->ControlBlockMdl[vcpu_id];
+ NTSTATUS status;
DoneSomething = FALSE;
+
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ goto done;
+
+ Mdl = Context->ControlBlockMdl[vcpu_id];
if (Mdl == NULL)
goto done;
Trace("====>\n");
Index = 0;
- while (Index < (LONG)KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS)) {
+ while (Index < (LONG)SystemProcessorCount()) {
unsigned int vcpu_id;
PFN_NUMBER Pfn;
PHYSICAL_ADDRESS Address;
if (Mdl == NULL)
goto fail1;
- vcpu_id = SystemVirtualCpuIndex(Index);
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
+
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = EventChannelInitControl(Pfn, vcpu_id);
while (--Index >= 0) {
unsigned int vcpu_id;
- vcpu_id = SystemVirtualCpuIndex(Index);
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ ASSERT(NT_SUCCESS(status));
Mdl = Context->ControlBlockMdl[vcpu_id];
Context->ControlBlockMdl[vcpu_id] = NULL;
{
PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
shared_info_t *Shared = Context->Shared;
- int vcpu_id = SystemVirtualCpuIndex(Index);
+ unsigned int vcpu_id;
UCHAR Pending;
+ NTSTATUS status;
+
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ return FALSE;
KeMemoryBarrier();
{
PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
shared_info_t *Shared = Context->Shared;
- int vcpu_id = SystemVirtualCpuIndex(Index);
+ unsigned int vcpu_id;
ULONG Port;
ULONG_PTR SelectorMask;
BOOLEAN DoneSomething;
+ NTSTATUS status;
DoneSomething = FALSE;
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ goto done;
+
KeMemoryBarrier();
SelectorMask = (ULONG_PTR)InterlockedExchangePointer((PVOID *)&Shared->vcpu_info[vcpu_id].evtchn_pending_sel, (PVOID)0);
Context->Port = Port;
+done:
return DoneSomething;
}
Index < KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
Index++) {
PROCESSOR_NUMBER ProcNumber;
- int vcpu_id;
+ unsigned int vcpu_id;
NTSTATUS status;
+ status = SystemVirtualCpuIndex(Index, &vcpu_id);
+ if (!NT_SUCCESS(status))
+ continue;
+
status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
ASSERT(NT_SUCCESS(status));
- vcpu_id = SystemVirtualCpuIndex(Index);
-
XENBUS_DEBUG(Printf,
&Context->DebugInterface,
"CPU %u:%u: PENDING: %s\n",