#include "hw/sysbus.h"
#include "hw/xen/xen.h"
+#include "hw/xen/xen_backend_ops.h"
#include "xen_overlay.h"
#include "xen_gnttab.h"
MemoryRegion gnt_frames;
MemoryRegion *gnt_aliases;
uint64_t *gnt_frame_gpas;
+
+ uint32_t *map_track;
};
struct XenGnttabState *xen_gnttab_singleton;
-
static void xen_gnttab_realize(DeviceState *dev, Error **errp)
{
XenGnttabState *s = XEN_GNTTAB(dev);
qemu_mutex_init(&s->gnt_lock);
xen_gnttab_singleton = s;
+
+ s->map_track = g_new0(uint32_t, s->max_frames * ENTRIES_PER_FRAME_V1);
}
static int xen_gnttab_post_load(void *opaque, int version_id)
size->max_nr_frames = s->max_frames;
return 0;
}
+
+struct xengntdev_handle {
+ GHashTable *maps;
+};
+
+/* Track per-open refs, to allow close() to clean up. */
+struct instance_map {
+ void *virt_addr;
+ grant_ref_t gref;
+ uint32_t count;
+};
+
+static int xen_be_gnttab_set_max_grants(struct xengntdev_handle *xgt, uint32_t nr_grants)
+{
+ return 0;
+}
+
+static void *xen_be_gnttab_map_refs(struct xengntdev_handle *xgt, uint32_t count,
+ uint32_t domid, uint32_t *refs, int prot)
+{
+ return NULL;
+}
+
+static int xen_be_gnttab_unmap(struct xengntdev_handle *xgt,
+ void *start_address, uint32_t count)
+{
+ return 0;
+}
+
+static int xen_be_gnttab_copy(struct xengntdev_handle *xgt, bool to_domain, uint32_t domid,
+ XenGrantCopySegment *segs, uint32_t nr_segs,
+ Error **errp)
+{
+ return -ENOTSUP;
+}
+
+static struct xengntdev_handle *xen_be_gnttab_open(void)
+{
+ struct xengntdev_handle *xgt = g_new0(struct xengntdev_handle, 1);
+
+ xgt->maps = g_hash_table_new(g_direct_hash, g_direct_equal);
+ return xgt;
+}
+
+static int xen_be_gnttab_close(struct xengntdev_handle *xgt)
+{
+ g_hash_table_destroy(xgt->maps);
+ g_free(xgt);
+ return 0;
+}
+
+struct gnttab_backend_ops libxengnttab_backend_ops = {
+ .open = xen_be_gnttab_open,
+ .close = xen_be_gnttab_close,
+ .grant_copy = xen_be_gnttab_copy,
+ .set_max_grants = xen_be_gnttab_set_max_grants,
+ .map_refs = xen_be_gnttab_map_refs,
+ .unmap = xen_be_gnttab_unmap,
+};
+