DEFINE_REVISION(0x09000005, 1, 2, 8, 1, 2, 1, 2, 4, 1, 1, 1), \
DEFINE_REVISION(0x09000006, 1, 3, 8, 1, 2, 1, 2, 4, 1, 1, 1), \
DEFINE_REVISION(0x09000007, 1, 3, 8, 1, 2, 1, 2, 4, 1, 1, 2), \
- DEFINE_REVISION(0x09000008, 1, 3, 9, 1, 2, 1, 2, 4, 1, 1, 2)
+ DEFINE_REVISION(0x09000008, 1, 3, 9, 1, 2, 1, 2, 4, 1, 1, 2), \
+ DEFINE_REVISION(0x09000008, 1, 4, 9, 1, 2, 1, 2, 4, 1, 1, 2)
#endif // _REVISION_H
IN PINTERFACE Interface
);
+/*! \typedef XENBUS_SHARED_INFO_UPCALL_SUPPORTED
+ \brief Private method for EVTCHN inerface
+*/
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_UPCALL_SUPPORTED)(
+ IN PINTERFACE Interface,
+ IN ULONG Index
+ );
+
/*! \typedef XENBUS_SHARED_INFO_UPCALL_PENDING
\brief Private method for EVTCHN inerface
*/
XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
};
-typedef struct _XENBUS_SHARED_INFO_INTERFACE_V3 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V4
+ \brief SHARED_INFO interface version 4
+ \ingroup interfaces
+*/
+struct _XENBUS_SHARED_INFO_INTERFACE_V4 {
+ INTERFACE Interface;
+ XENBUS_SHARED_INFO_ACQUIRE SharedInfoAcquire;
+ XENBUS_SHARED_INFO_RELEASE SharedInfoRelease;
+ XENBUS_SHARED_INFO_UPCALL_SUPPORTED SharedInfoUpcallSupported;
+ XENBUS_SHARED_INFO_UPCALL_PENDING SharedInfoUpcallPending;
+ XENBUS_SHARED_INFO_EVTCHN_POLL SharedInfoEvtchnPoll;
+ XENBUS_SHARED_INFO_EVTCHN_ACK SharedInfoEvtchnAck;
+ XENBUS_SHARED_INFO_EVTCHN_MASK SharedInfoEvtchnMask;
+ XENBUS_SHARED_INFO_EVTCHN_UNMASK SharedInfoEvtchnUnmask;
+ XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
+};
+
+typedef struct _XENBUS_SHARED_INFO_INTERFACE_V4 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
/*! \def XENBUS_SHARED_INFO
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN 2
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 3
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 4
#endif // _XENBUS_SHARED_INFO_H
IN ULONG Cpu
)
{
- vcpu_info_t *Vcpu;
- NTSTATUS status;
-
- status = SystemProcessorVcpuInfo(Cpu, &Vcpu);
- if (!NT_SUCCESS(status)) {
- unsigned int vcpu_id;
-
- ASSERT(status == STATUS_NOT_SUPPORTED);
-
- status = SystemProcessorVcpuId(Cpu, &vcpu_id);
- ASSERT(NT_SUCCESS(status));
-
- if (vcpu_id >= XEN_LEGACY_MAX_VCPUS)
- return FALSE;
- }
+ if (!XENBUS_SHARED_INFO(UpcallSupported,
+ &Context->SharedInfoInterface,
+ Cpu))
+ return FALSE;
return XENBUS_EVTCHN_ABI(IsProcessorEnabled,
&Context->EvtchnAbi,
}
}
+static BOOLEAN
+SharedInfoUpcallSupported(
+ IN PINTERFACE Interface,
+ IN ULONG Index
+ )
+{
+ PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
+ PXENBUS_SHARED_INFO_PROCESSOR Processor = &Context->Processor[Index];
+
+ ASSERT3U(Index, <, Context->ProcessorCount);
+
+ return (Processor->Vcpu != NULL) ? TRUE : FALSE;
+}
+
static BOOLEAN
SharedInfoUpcallPending(
IN PINTERFACE Interface,
SharedInfoGetTime
};
+static struct _XENBUS_SHARED_INFO_INTERFACE_V4 SharedInfoInterfaceVersion4 = {
+ { sizeof (struct _XENBUS_SHARED_INFO_INTERFACE_V4), 4, NULL, NULL, NULL },
+ SharedInfoAcquire,
+ SharedInfoRelease,
+ SharedInfoUpcallSupported,
+ SharedInfoUpcallPending,
+ SharedInfoEvtchnPoll,
+ SharedInfoEvtchnAck,
+ SharedInfoEvtchnMask,
+ SharedInfoEvtchnUnmask,
+ SharedInfoGetTime
+};
+
NTSTATUS
SharedInfoInitialize(
IN PXENBUS_FDO Fdo,
status = STATUS_SUCCESS;
break;
}
+ case 4: {
+ struct _XENBUS_SHARED_INFO_INTERFACE_V4 *SharedInfoInterface;
+
+ SharedInfoInterface = (struct _XENBUS_SHARED_INFO_INTERFACE_V4 *)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENBUS_SHARED_INFO_INTERFACE_V4))
+ break;
+
+ *SharedInfoInterface = SharedInfoInterfaceVersion4;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;