IN ULONG Cpu
);
+typedef BOOLEAN
+(*XENBUS_EVTCHN_UNMASK_V1)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel,
+ IN BOOLEAN InCallback
+ );
+
/*! \typedef XENBUS_EVTCHN_UNMASK
\brief Unmask an event channel
\param Interface The interface header
\param Channel The channel handle
\param InCallback Set to TRUE if this method is invoked in context of the channel callback
- \return TRUE if there was an event pending at the point of unmask, FALSE otherwise
*/
-typedef BOOLEAN
+typedef VOID
(*XENBUS_EVTCHN_UNMASK)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
XENBUS_EVTCHN_SEND EvtchnSend;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
\ingroup interfaces
*/
struct _XENBUS_EVTCHN_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
+ XENBUS_EVTCHN_RELEASE EvtchnRelease;
+ XENBUS_EVTCHN_OPEN EvtchnOpen;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
+ XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
+ XENBUS_EVTCHN_CLOSE EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
+ \brief EVTCHN interface version 3
+ \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V3 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-typedef struct _XENBUS_EVTCHN_INTERFACE_V2 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V3 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
/*! \def XENBUS_EVTCHN
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 2
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 3
#endif // _XENBUS_EVTCHN_INTERFACE_H
__ReceiverRingReleaseLock(Ring);
}
-static FORCEINLINE BOOLEAN
+static FORCEINLINE VOID
__ReceiverRingUnmask(
IN PXENVIF_RECEIVER_RING Ring
)
{
PXENVIF_RECEIVER Receiver;
- BOOLEAN Pending;
- Receiver = Ring->Receiver;
+ if (!Ring->Connected)
+ return;
- Pending = (Ring->Connected) ?
- XENBUS_EVTCHN(Unmask,
- &Receiver->EvtchnInterface,
- Ring->Channel,
- FALSE) :
- FALSE;
+ Receiver = Ring->Receiver;
- return Pending;
+ XENBUS_EVTCHN(Unmask,
+ &Receiver->EvtchnInterface,
+ Ring->Channel,
+ FALSE);
}
__drv_functionClass(KDEFERRED_ROUTINE)
PXENVIF_RECEIVER_RING Ring = Context;
PXENVIF_RECEIVER Receiver;
PXENVIF_FRONTEND Frontend;
- BOOLEAN Pending;
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(Argument1);
Receiver = Ring->Receiver;
Frontend = Receiver->Frontend;
- do {
- if (Ring->Enabled) {
- if (Receiver->Split) {
- __ReceiverRingNotify(Ring);
- } else {
- TransmitterRingNotify(FrontendGetTransmitter(Frontend),
- Ring->Index);
- __ReceiverRingNotify(Ring);
- }
+ if (Ring->Enabled) {
+ if (Receiver->Split) {
+ __ReceiverRingNotify(Ring);
+ } else {
+ TransmitterRingNotify(FrontendGetTransmitter(Frontend),
+ Ring->Index);
+ __ReceiverRingNotify(Ring);
}
+ }
- Pending = __ReceiverRingUnmask(Ring);
- } while (Pending);
+ __ReceiverRingUnmask(Ring);
}
KSERVICE_ROUTINE ReceiverRingEvtchnCallback;
PXENVIF_RECEIVER Receiver;
PXENVIF_FRONTEND Frontend;
PFN_NUMBER Pfn;
- BOOLEAN Pending;
CHAR Name[MAXNAMELEN];
NTSTATUS status;
(CCHAR)Ring->Index);
}
- Pending = XENBUS_EVTCHN(Unmask,
- &Receiver->EvtchnInterface,
- Ring->Channel,
- FALSE);
-
- if (Pending)
- XENBUS_EVTCHN(Trigger,
- &Receiver->EvtchnInterface,
- Ring->Channel);
+ XENBUS_EVTCHN(Unmask,
+ &Receiver->EvtchnInterface,
+ Ring->Channel,
+ FALSE);
Ring->Connected = TRUE;
__TransmitterRingReleaseLock(Ring);
}
-static FORCEINLINE BOOLEAN
+static FORCEINLINE VOID
__TransmitterRingUnmask(
IN PXENVIF_TRANSMITTER_RING Ring
)
{
PXENVIF_TRANSMITTER Transmitter;
- BOOLEAN Pending;
- Transmitter = Ring->Transmitter;
+ if (!Ring->Connected)
+ return;
- Pending = (Ring->Connected) ?
- XENBUS_EVTCHN(Unmask,
- &Transmitter->EvtchnInterface,
- Ring->Channel,
- FALSE) :
- FALSE;
+ Transmitter = Ring->Transmitter;
- return Pending;
+ XENBUS_EVTCHN(Unmask,
+ &Transmitter->EvtchnInterface,
+ Ring->Channel,
+ FALSE);
}
__drv_functionClass(KDEFERRED_ROUTINE)
{
PXENVIF_TRANSMITTER_RING Ring = Context;
PXENVIF_TRANSMITTER Transmitter;
- BOOLEAN Pending;
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(Argument1);
Transmitter = Ring->Transmitter;
- do {
- if (Ring->Enabled) {
- ASSERT(Transmitter->Split);
- __TransmitterRingNotify(Ring);
- }
+ if (Ring->Enabled) {
+ ASSERT(Transmitter->Split);
+ __TransmitterRingNotify(Ring);
+ }
- Pending = __TransmitterRingUnmask(Ring);
- } while (Pending);
+ __TransmitterRingUnmask(Ring);
}
KSERVICE_ROUTINE TransmitterRingEvtchnCallback;
PXENVIF_TRANSMITTER Transmitter;
PXENVIF_FRONTEND Frontend;
PFN_NUMBER Pfn;
- BOOLEAN Pending;
CHAR Name[MAXNAMELEN];
NTSTATUS status;
(CCHAR)Ring->Index);
}
- Pending = XENBUS_EVTCHN(Unmask,
- &Transmitter->EvtchnInterface,
- Ring->Channel,
- FALSE);
-
- if (Pending)
- XENBUS_EVTCHN(Trigger,
- &Transmitter->EvtchnInterface,
- Ring->Channel);
+ XENBUS_EVTCHN(Unmask,
+ &Transmitter->EvtchnInterface,
+ Ring->Channel,
+ FALSE);
}
status = XENBUS_DEBUG(Register,