ASSERT3U(Channel->Magic, ==, XENBUS_EVTCHN_CHANNEL_MAGIC);
- status = STATUS_INVALID_PARAMETER;
- if (Cpu >= (ULONG)KeNumberProcessors)
- goto fail1;
-
status = STATUS_NOT_SUPPORTED;
if (~Context->Affinity & ((KAFFINITY)1 << Cpu))
- goto fail2;
+ goto fail1;
KeAcquireSpinLock(&Channel->Lock, &Irql);
status = EventChannelBindVirtualCpu(LocalPort, vcpu_id);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
Channel->Cpu = Cpu;
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
- KeReleaseSpinLock(&Channel->Lock, Irql);
-
fail2:
Error("fail2\n");
+ KeReleaseSpinLock(&Channel->Lock, Irql);
+
fail1:
Error("fail1 (%08x)\n", status);
static NTSTATUS
EvtchnAbiAcquire(
- IN PXENBUS_EVTCHN_CONTEXT Context
+ IN PXENBUS_EVTCHN_CONTEXT Context,
+ OUT PKAFFINITY Affinity
)
{
NTSTATUS status;
EvtchnFifoGetAbi(Context->EvtchnFifoContext,
&Context->EvtchnAbi);
- status = XENBUS_EVTCHN_ABI(Acquire, &Context->EvtchnAbi);
+ status = XENBUS_EVTCHN_ABI(Acquire,
+ &Context->EvtchnAbi,
+ Affinity);
if (!NT_SUCCESS(status))
goto use_two_level;
EvtchnTwoLevelGetAbi(Context->EvtchnTwoLevelContext,
&Context->EvtchnAbi);
- status = XENBUS_EVTCHN_ABI(Acquire, &Context->EvtchnAbi);
+ status = XENBUS_EVTCHN_ABI(Acquire,
+ &Context->EvtchnAbi,
+ Affinity);
if (!NT_SUCCESS(status))
goto fail1;
Trace("====>\n");
- ASSERT3U(Context->Affinity, ==, 0);
-
- Cpu = 0;
- while (Cpu < KeNumberProcessors) {
+ for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) {
unsigned int vcpu_id;
UCHAR Vector;
+ if (Context->LatchedInterrupt[Cpu] == NULL)
+ continue;
+
vcpu_id = SystemVirtualCpuIndex(Cpu);
Vector = FdoGetInterruptVector(Context->Fdo,
Context->LatchedInterrupt[Cpu]);
Info("CPU %u\n", Cpu);
Context->Affinity |= (KAFFINITY)1 << Cpu;
}
-
- Cpu++;
}
Line = FdoGetInterruptLine(Context->Fdo,
IN PXENBUS_EVTCHN_CONTEXT Context
)
{
- LONG Cpu;
+ ULONG Cpu;
NTSTATUS status;
UNREFERENCED_PARAMETER(Context);
status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, 0);
ASSERT(NT_SUCCESS(status));
- Cpu = KeNumberProcessors;
- while (--Cpu >= 0) {
+ for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) {
unsigned int vcpu_id;
+ if (~Context->Affinity & (KAFFINITY)1 << Cpu)
+ continue;
+
vcpu_id = SystemVirtualCpuIndex(Cpu);
(VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
)
{
PXENBUS_EVTCHN_CONTEXT Context = Argument;
+ KAFFINITY Affinity;
NTSTATUS status;
EvtchnAbiRelease(Context);
- status = EvtchnAbiAcquire(Context);
+ status = EvtchnAbiAcquire(Context, &Affinity);
ASSERT(NT_SUCCESS(status));
+ // Affinity must be a superset of Context->Affinity
+ ASSERT3U(Affinity & Context->Affinity, ==, Context->Affinity);
+
EvtchnInterruptDisable(Context);
EvtchnInterruptEnable(Context);
}
PXENBUS_EVTCHN_CONTEXT Context = Interface->Context;
PXENBUS_FDO Fdo = Context->Fdo;
KIRQL Irql;
- LONG Cpu;
+ ULONG Cpu;
+ KAFFINITY Affinity;
NTSTATUS status;
KeAcquireSpinLock(&Context->Lock, &Irql);
if (!NT_SUCCESS(status))
goto fail6;
- status = EvtchnAbiAcquire(Context);
+ status = EvtchnAbiAcquire(Context, &Affinity);
if (!NT_SUCCESS(status))
goto fail7;
- status = FdoAllocateInterrupt(Fdo,
- LevelSensitive,
- 0,
- EvtchnInterruptCallback,
- Context,
- &Context->LevelSensitiveInterrupt);
- if (!NT_SUCCESS(status))
- goto fail8;
+ Context->LevelSensitiveInterrupt = FdoAllocateInterrupt(Fdo,
+ LevelSensitive,
+ 0,
+ EvtchnInterruptCallback,
+ Context);
- Cpu = 0;
- while (Cpu < KeNumberProcessors) {
- status = FdoAllocateInterrupt(Fdo,
- Latched,
- Cpu,
- EvtchnInterruptCallback,
- Context,
- &Context->LatchedInterrupt[Cpu]);
- if (!NT_SUCCESS(status))
- goto fail9;
+ status = STATUS_UNSUCCESSFUL;
+ if (Context->LevelSensitiveInterrupt == NULL)
+ goto fail8;
- Cpu++;
+ for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) {
+ if (~Affinity & (KAFFINITY)1 << Cpu)
+ continue;
+
+ Context->LatchedInterrupt[Cpu] = FdoAllocateInterrupt(Fdo,
+ Latched,
+ Cpu,
+ EvtchnInterruptCallback,
+ Context);
}
EvtchnInterruptEnable(Context);
return STATUS_SUCCESS;
-fail9:
- Error("fail9\n");
-
- while (--Cpu >= 0) {
- FdoFreeInterrupt(Fdo, Context->LatchedInterrupt[Cpu]);
- Context->LatchedInterrupt[Cpu] = NULL;
- }
-
- FdoFreeInterrupt(Fdo, Context->LevelSensitiveInterrupt);
- Context->LevelSensitiveInterrupt = NULL;
-
fail8:
Error("fail8\n");
PXENBUS_EVTCHN_CONTEXT Context = Interface->Context;
PXENBUS_FDO Fdo = Context->Fdo;
KIRQL Irql;
- LONG Cpu;
+ ULONG Cpu;
KeAcquireSpinLock(&Context->Lock, &Irql);
EvtchnInterruptDisable(Context);
- Cpu = KeNumberProcessors;
- while (--Cpu >= 0) {
+ for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) {
+ if (Context->LatchedInterrupt[Cpu] == NULL)
+ continue;
+
EvtchnFlush(Context, Cpu);
FdoFreeInterrupt(Fdo, Context->LatchedInterrupt[Cpu]);
IO_RESOURCE_DESCRIPTOR Interrupt;
PIO_RESOURCE_LIST List;
ULONG Index;
+ ULONG Count;
NTSTATUS status;
status = FdoForwardIrpSynchronously(Fdo, Irp);
Old = (PIO_RESOURCE_REQUIREMENTS_LIST)Irp->IoStatus.Information;
ASSERT3U(Old->AlternativeLists, ==, 1);
+ Count = KeQueryActiveProcessorCount(NULL);
+
Size = Old->ListSize +
- (sizeof (IO_RESOURCE_DESCRIPTOR) * KeNumberProcessors);
+ (sizeof (IO_RESOURCE_DESCRIPTOR) * Count);
New = __AllocatePoolWithTag(PagedPool, Size, 'SUB');
Interrupt.u.Interrupt.AffinityPolicy = IrqPolicySpecifiedProcessors;
Interrupt.u.Interrupt.PriorityPolicy = IrqPriorityUndefined;
- for (Index = 0; Index < (ULONG)KeNumberProcessors; Index++) {
+ for (Index = 0; Index < Count; Index++) {
Interrupt.u.Interrupt.TargetedProcessors = (KAFFINITY)1 << Index;
List->Descriptors[List->Count++] = Interrupt;
}
return status;
}
-NTSTATUS
+PXENBUS_INTERRUPT
FdoAllocateInterrupt(
IN PXENBUS_FDO Fdo,
IN KINTERRUPT_MODE InterruptMode,
IN ULONG Cpu,
IN KSERVICE_ROUTINE Callback,
- IN PVOID Argument OPTIONAL,
- OUT PXENBUS_INTERRUPT *Interrupt
+ IN PVOID Argument OPTIONAL
)
{
PLIST_ENTRY ListEntry;
+ PXENBUS_INTERRUPT Interrupt;
KIRQL Irql;
- NTSTATUS status;
for (ListEntry = Fdo->List.Flink;
ListEntry != &Fdo->List;
ListEntry = ListEntry->Flink) {
- *Interrupt = CONTAINING_RECORD(ListEntry, XENBUS_INTERRUPT, ListEntry);
+ Interrupt = CONTAINING_RECORD(ListEntry, XENBUS_INTERRUPT, ListEntry);
- if ((*Interrupt)->Callback == NULL &&
- (*Interrupt)->InterruptMode == InterruptMode &&
- (*Interrupt)->Cpu == Cpu)
+ if (Interrupt->Callback == NULL &&
+ Interrupt->InterruptMode == InterruptMode &&
+ Interrupt->Cpu == Cpu)
goto found;
}
- *Interrupt = NULL;
-
- status = STATUS_OBJECT_NAME_NOT_FOUND;
goto fail1;
found:
- Irql = FdoAcquireInterruptLock(Fdo, *Interrupt);
- (*Interrupt)->Callback = Callback;
- (*Interrupt)->Argument = Argument;
- FdoReleaseInterruptLock(Fdo, *Interrupt, Irql);
+ Irql = FdoAcquireInterruptLock(Fdo, Interrupt);
+ Interrupt->Callback = Callback;
+ Interrupt->Argument = Argument;
+ FdoReleaseInterruptLock(Fdo, Interrupt, Irql);
- return STATUS_SUCCESS;
+ return Interrupt;
fail1:
- Error("fail1 (%08x)\n", status);
-
- return status;
+ return NULL;
}
UCHAR