IN PXENBUS_GNTTAB_ENTRY Entry
);
+/*! \typedef XENBUS_GNTTAB_QUERY_REFERENCE
+ \brief Get the reference number of the entry
+
+ \param Interface The interface header
+ \param Reference The reference number
+ \param Pfn An optional pointer to receive the value of the reference frame number
+ \param ReadOnly An optional pointer to receive the boolean value of the read-only flag
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_QUERY_REFERENCE)(
+ IN PINTERFACE Interface,
+ IN ULONG Reference,
+ OUT PPFN_NUMBER Pfn OPTIONAL,
+ OUT PBOOLEAN ReadOnly OPTIONAL
+ );
+
+#define XENBUS_GNTTAB_CONSOLE_REFERENCE 0
+#define XENBUS_GNTTAB_STORE_REFERENCE 1
+
+
/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
\brief Destroy a cache of grant table entries
XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
};
-typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V3
+ \brief GNTTAB interface version 3
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V3 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+ XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_QUERY_REFERENCE GnttabQueryReference;
+ XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
+ XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
+ XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V3 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
/*! \def XENBUS_GNTTAB
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
-#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 3
#endif // _XENBUS_GNTTAB_INTERFACE_H
DEFINE_REVISION(0x09000000, 1, 2, 5, 1, 2, 1, 1, 2, 1, 0, 1), \
DEFINE_REVISION(0x09000001, 1, 2, 6, 1, 2, 1, 1, 2, 1, 1, 1), \
DEFINE_REVISION(0x09000002, 1, 2, 7, 1, 2, 1, 1, 2, 1, 1, 1), \
- DEFINE_REVISION(0x09000003, 1, 2, 8, 1, 2, 1, 1, 2, 1, 1, 1)
+ DEFINE_REVISION(0x09000003, 1, 2, 8, 1, 2, 1, 1, 2, 1, 1, 1), \
+ DEFINE_REVISION(0x09000004, 1, 2, 8, 1, 2, 1, 1, 3, 1, 1, 1)
#endif // _REVISION_H
return (ULONG)Entry->Reference;
}
+static NTSTATUS
+GnttabQueryReference(
+ IN PINTERFACE Interface,
+ IN ULONG Reference,
+ OUT PPFN_NUMBER Pfn OPTIONAL,
+ OUT PBOOLEAN ReadOnly OPTIONAL
+ )
+{
+ PXENBUS_GNTTAB_CONTEXT Context = Interface->Context;
+ NTSTATUS status;
+
+ status = STATUS_INVALID_PARAMETER;
+ if (Reference >= (Context->FrameIndex + 1) * XENBUS_GNTTAB_ENTRY_PER_FRAME)
+ goto fail1;
+
+ if (Pfn != NULL)
+ *Pfn = Context->Table[Reference].frame;
+
+ if (ReadOnly != NULL)
+ *ReadOnly = (Context->Table[Reference].frame & GTF_readonly) ? TRUE : FALSE;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
static NTSTATUS
GnttabMapForeignPages(
IN PINTERFACE Interface,
if (!NT_SUCCESS(status))
goto fail10;
+ /* Make sure at least the reserved refrences are present */
+ status = GnttabExpand(Context);
+ if (!NT_SUCCESS(status))
+ goto fail11;
+
Trace("<====\n");
done:
return STATUS_SUCCESS;
+fail11:
+ Error("fail11\n");
+
+ XENBUS_DEBUG(Deregister,
+ &Context->DebugInterface,
+ Context->DebugCallback);
+ Context->DebugCallback = NULL;
+
fail10:
Error("fail10\n");
GnttabUnmapForeignPages
};
+static struct _XENBUS_GNTTAB_INTERFACE_V3 GnttabInterfaceVersion3 = {
+ { sizeof (struct _XENBUS_GNTTAB_INTERFACE_V3), 3, NULL, NULL, NULL },
+ GnttabAcquire,
+ GnttabRelease,
+ GnttabCreateCache,
+ GnttabPermitForeignAccess,
+ GnttabRevokeForeignAccess,
+ GnttabGetReference,
+ GnttabQueryReference,
+ GnttabDestroyCache,
+ GnttabMapForeignPages,
+ GnttabUnmapForeignPages
+};
+
NTSTATUS
GnttabInitialize(
IN PXENBUS_FDO Fdo,
status = STATUS_SUCCESS;
break;
}
+ case 3: {
+ struct _XENBUS_GNTTAB_INTERFACE_V3 *GnttabInterface;
+
+ GnttabInterface = (struct _XENBUS_GNTTAB_INTERFACE_V3 *)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENBUS_GNTTAB_INTERFACE_V3))
+ break;
+
+ *GnttabInterface = GnttabInterfaceVersion3;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;