PXENBUS_INTERRUPT LevelSensitiveInterrupt;
PXENBUS_INTERRUPT LatchedInterrupt[MAXIMUM_PROCESSORS];
KAFFINITY Affinity;
- BOOLEAN Enabled;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackEarly;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
}
-static VOID
-EvtchnInterruptEnable(
- IN PXENBUS_EVTCHN_CONTEXT Context
- )
-{
- LONG Cpu;
- ULONG Line;
- NTSTATUS status;
-
- Trace("====>\n");
-
- ASSERT3U(Context->Affinity, ==, 0);
-
- Cpu = 0;
- while (Cpu < KeNumberProcessors) {
- unsigned int vcpu_id;
- UCHAR Vector;
-
- vcpu_id = SystemVirtualCpuIndex(Cpu);
- Vector = FdoGetInterruptVector(Context->Fdo,
- Context->LatchedInterrupt[Cpu]);
-
- status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
- if (NT_SUCCESS(status)) {
- Info("CPU %u\n", Cpu);
- Context->Affinity |= (KAFFINITY)1 << Cpu;
- }
-
- Cpu++;
- }
-
- Line = FdoGetInterruptLine(Context->Fdo,
- Context->LevelSensitiveInterrupt);
-
- status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
- ASSERT(NT_SUCCESS(status));
-
- Trace("<====\n");
-}
-
-static VOID
-EvtchnInterruptDisable(
- IN PXENBUS_EVTCHN_CONTEXT Context
- )
-{
- LONG Cpu;
- NTSTATUS status;
-
- UNREFERENCED_PARAMETER(Context);
-
- Trace("====>\n");
-
- status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, 0);
- ASSERT(NT_SUCCESS(status));
-
- Cpu = KeNumberProcessors;
- while (--Cpu >= 0) {
- unsigned int vcpu_id;
-
- vcpu_id = SystemVirtualCpuIndex(Cpu);
-
- (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
- Context->Affinity &= ~((KAFFINITY)1 << Cpu);
- }
-
- ASSERT3U(Context->Affinity, ==, 0);
-
- Trace("<====\n");
-}
-
static NTSTATUS
EvtchnOpenFixed(
IN PXENBUS_EVTCHN_CHANNEL Channel,
Channel->Active = TRUE;
KeAcquireSpinLockAtDpcLevel(&Context->Lock);
-
InsertTailList(&Context->List, &Channel->ListEntry);
-
- if (!IsListEmpty(&Context->List) && !Context->Enabled) {
- EvtchnInterruptEnable(Context);
- Context->Enabled = TRUE;
- }
-
KeReleaseSpinLockFromDpcLevel(&Context->Lock);
KeLowerIrql(Irql);
if (Cpu >= (ULONG)KeNumberProcessors)
goto fail1;
- ASSERT(Context->Enabled);
-
status = STATUS_NOT_SUPPORTED;
if (~Context->Affinity & ((KAFFINITY)1 << Cpu))
goto fail2;
KeRaiseIrql(DISPATCH_LEVEL, &Irql); // Prevent suspend
KeAcquireSpinLockAtDpcLevel(&Context->Lock);
-
RemoveEntryList(&Channel->ListEntry);
-
- if (IsListEmpty(&Context->List) && Context->Enabled) {
- EvtchnInterruptDisable(Context);
- Context->Enabled = FALSE;
- }
-
KeReleaseSpinLockFromDpcLevel(&Context->Lock);
RtlZeroMemory(&Channel->ListEntry, sizeof (LIST_ENTRY));
RtlZeroMemory(&Context->EvtchnAbi, sizeof (XENBUS_EVTCHN_ABI));
}
+static VOID
+EvtchnInterruptEnable(
+ IN PXENBUS_EVTCHN_CONTEXT Context
+ )
+{
+ LONG Cpu;
+ ULONG Line;
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ ASSERT3U(Context->Affinity, ==, 0);
+
+ Cpu = 0;
+ while (Cpu < KeNumberProcessors) {
+ unsigned int vcpu_id;
+ UCHAR Vector;
+
+ vcpu_id = SystemVirtualCpuIndex(Cpu);
+ Vector = FdoGetInterruptVector(Context->Fdo,
+ Context->LatchedInterrupt[Cpu]);
+
+ status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
+ if (NT_SUCCESS(status)) {
+ Info("CPU %u\n", Cpu);
+ Context->Affinity |= (KAFFINITY)1 << Cpu;
+ }
+
+ Cpu++;
+ }
+
+ Line = FdoGetInterruptLine(Context->Fdo,
+ Context->LevelSensitiveInterrupt);
+
+ status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
+ ASSERT(NT_SUCCESS(status));
+
+ Trace("<====\n");
+}
+
+static VOID
+EvtchnInterruptDisable(
+ IN PXENBUS_EVTCHN_CONTEXT Context
+ )
+{
+ LONG Cpu;
+ NTSTATUS status;
+
+ UNREFERENCED_PARAMETER(Context);
+
+ Trace("====>\n");
+
+ status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, 0);
+ ASSERT(NT_SUCCESS(status));
+
+ Cpu = KeNumberProcessors;
+ while (--Cpu >= 0) {
+ unsigned int vcpu_id;
+
+ vcpu_id = SystemVirtualCpuIndex(Cpu);
+
+ (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
+ Context->Affinity &= ~((KAFFINITY)1 << Cpu);
+ }
+
+ ASSERT3U(Context->Affinity, ==, 0);
+
+ Trace("<====\n");
+}
+
static VOID
EvtchnSuspendCallbackEarly(
IN PVOID Argument
status = EvtchnAbiAcquire(Context);
ASSERT(NT_SUCCESS(status));
- if (Context->Enabled) {
- EvtchnInterruptDisable(Context);
- EvtchnInterruptEnable(Context);
- }
+ EvtchnInterruptDisable(Context);
+ EvtchnInterruptEnable(Context);
}
static VOID
Cpu++;
}
+ EvtchnInterruptEnable(Context);
+
Trace("<====\n");
done:
if (!IsListEmpty(&Context->List))
BUG("OUTSTANDING EVENT CHANNELS");
+ EvtchnInterruptDisable(Context);
+
Cpu = KeNumberProcessors;
while (--Cpu >= 0) {
FdoFreeInterrupt(Fdo, Context->LatchedInterrupt[Cpu]);