IN BOOLEAN InCallback
);
+typedef VOID
+(*XENBUS_EVTCHN_SEND_V1)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel
+ );
+
/*! \typedef XENBUS_EVTCHN_SEND
\brief Send an event to the remote end of the channel
+ It is assumed that the domain cannot suspend during this call so
+ IRQL must be >= DISPATCH_LEVEL.
+
\param Interface The interface header
\param Channel The channel handle
*/
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
XENBUS_EVTCHN_OPEN EvtchnOpen;
XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
XENBUS_EVTCHN_OPEN EvtchnOpen;
XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
XENBUS_EVTCHN_OPEN EvtchnOpen;
XENBUS_EVTCHN_BIND EvtchnBind;
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
\ingroup interfaces
*/
struct _XENBUS_EVTCHN_INTERFACE_V5 {
+ INTERFACE Interface;
+ XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
+ XENBUS_EVTCHN_RELEASE EvtchnRelease;
+ XENBUS_EVTCHN_OPEN EvtchnOpen;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
+ XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_WAIT EvtchnWait;
+ XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
+ XENBUS_EVTCHN_CLOSE EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V6
+ \brief EVTCHN interface version 6
+ \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V6 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V6 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 5
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 6
#endif // _XENBUS_EVTCHN_INTERFACE_H
#define DEFINE_REVISION_TABLE \
DEFINE_REVISION(0x08000009, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1), \
DEFINE_REVISION(0x0800000A, 1, 2, 5, 1, 1, 1, 1, 1, 1, 1), \
- DEFINE_REVISION(0x0800000B, 1, 2, 5, 1, 2, 1, 1, 2, 1, 1)
+ DEFINE_REVISION(0x0800000B, 1, 2, 5, 1, 2, 1, 1, 2, 1, 1), \
+ DEFINE_REVISION(0x0800000C, 1, 2, 6, 1, 2, 1, 1, 2, 1, 1)
#endif // _REVISION_H
IN PXENBUS_EVTCHN_CHANNEL Channel
)
{
- KIRQL Irql;
NTSTATUS status;
UNREFERENCED_PARAMETER(Interface);
ASSERT3U(Channel->Magic, ==, XENBUS_EVTCHN_CHANNEL_MAGIC);
- // Make sure we don't suspend
- KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ ASSERT3U(KeGetCurrentIrql(), >=, DISPATCH_LEVEL);
status = STATUS_UNSUCCESSFUL;
if (!Channel->Active)
status = EventChannelSend(Channel->LocalPort);
done:
+ return status;
+}
+
+static NTSTATUS
+EvtchnSendVersion1(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel
+ )
+{
+ KIRQL Irql;
+ NTSTATUS status;
+
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ status = EvtchnSend(Interface, Channel);
KeLowerIrql(Irql);
return status;
EvtchnRelease,
EvtchnOpen,
EvtchnUnmaskVersion1,
- EvtchnSend,
+ EvtchnSendVersion1,
EvtchnTrigger,
EvtchnGetPort,
EvtchnClose
EvtchnOpen,
EvtchnBindVersion2,
EvtchnUnmaskVersion1,
- EvtchnSend,
+ EvtchnSendVersion1,
EvtchnTrigger,
EvtchnGetPort,
EvtchnClose
EvtchnOpen,
EvtchnBindVersion2,
EvtchnUnmask,
- EvtchnSend,
+ EvtchnSendVersion1,
EvtchnTrigger,
EvtchnGetPort,
EvtchnClose
EvtchnOpen,
EvtchnBind,
EvtchnUnmask,
- EvtchnSend,
+ EvtchnSendVersion1,
EvtchnTrigger,
EvtchnGetPort,
EvtchnClose
EvtchnOpen,
EvtchnBind,
EvtchnUnmask,
+ EvtchnSendVersion1,
+ EvtchnTrigger,
+ EvtchnWait,
+ EvtchnGetPort,
+ EvtchnClose,
+};
+
+static struct _XENBUS_EVTCHN_INTERFACE_V6 EvtchnInterfaceVersion6 = {
+ { sizeof (struct _XENBUS_EVTCHN_INTERFACE_V6), 6, NULL, NULL, NULL },
+ EvtchnAcquire,
+ EvtchnRelease,
+ EvtchnOpen,
+ EvtchnBind,
+ EvtchnUnmask,
EvtchnSend,
EvtchnTrigger,
EvtchnWait,
status = STATUS_SUCCESS;
break;
}
+ case 6: {
+ struct _XENBUS_EVTCHN_INTERFACE_V6 *EvtchnInterface;
+
+ EvtchnInterface = (struct _XENBUS_EVTCHN_INTERFACE_V6 *)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENBUS_EVTCHN_INTERFACE_V6))
+ break;
+
+ *EvtchnInterface = EvtchnInterfaceVersion6;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;