@@ -76,6 +76,10 @@ distclean: clean
xen-cpuid: xen-cpuid.o
$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
+xen-resource.o: APPEND_CFLAGS += -Wno-declaration-after-statement
+xen-resource: xen-resource.o
+ $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenforeignmemory) $(LDLIBS_libxendevicemodel) $(APPEND_LDFLAGS)
+
xen-hvmctx: xen-hvmctx.o
$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
new file mode 100644
@@ -0,0 +1,106 @@
+#include <err.h>
+#include <error.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/mman.h>
+
+#include <xenctrl.h>
+#include <xenforeignmemory.h>
+#include <xendevicemodel.h>
+#include <xen-tools/libs.h>
+
+static xc_interface *xch;
+static xenforeignmemory_handle *fh;
+static xendevicemodel_handle *dh;
+
+static void test(unsigned int domid, unsigned int type, unsigned int id)
+{
+ unsigned long nr = ~0;
+
+ printf("Testing d%u, type %u, id %u\n", domid, type, id);
+
+ int rc = xenforeignmemory_resource_size(fh, domid, type, id, &nr);
+ if ( rc )
+ {
+ printf(" failed %d\n", -errno);
+ return;
+ }
+ else
+ printf(" %lu frames\n", nr);
+
+ printf(" Trying to map\n");
+ void *addr = NULL;
+ xenforeignmemory_resource_handle *res =
+ xenforeignmemory_map_resource(fh, domid, type, id, 0, nr,
+ &addr, PROT_READ | PROT_WRITE, 0);
+ if ( !res )
+ {
+ perror(" failed");
+ return;
+ }
+
+ printf(" Success\n");
+ xenforeignmemory_unmap_resource(fh, res);
+}
+
+int main(int argc, char **argv)
+{
+ int rc;
+
+ xch = xc_interface_open(NULL, NULL, 0);
+ fh = xenforeignmemory_open(NULL, 0);
+ dh = xendevicemodel_open(NULL, 0);
+
+ if ( !xch )
+ err(1, "xc_interface_open");
+ if ( !fh )
+ err(1, "xenforeignmemory_open");
+ if ( !dh )
+ err(1, "xendevicemodel_open");
+
+ uint32_t domid = 0;
+ struct xen_domctl_createdomain dom = {
+ .flags = XEN_DOMCTL_CDF_hvm,
+ .max_vcpus = 8,
+ .max_grant_frames = 40,
+
+ .arch = {
+ .emulation_flags = XEN_X86_EMU_LAPIC,
+ },
+ };
+
+ rc = xc_domain_create(xch, &domid, &dom);
+ if ( rc )
+ {
+ perror("xc_domain_create()");
+ goto out;
+ }
+ printf("Created d%u\n", domid);
+
+ ioservid_t id = -1;
+ rc = xendevicemodel_create_ioreq_server(dh, domid, 1, &id);
+ if ( rc )
+ {
+ perror("xendevicemodel_create_ioreq_server()");
+ goto out;
+ }
+ printf("Created ioreq server %u\n", id);
+
+
+ test(domid, XENMEM_resource_ioreq_server, id);
+
+ test(domid, XENMEM_resource_grant_table,
+ XENMEM_resource_grant_table_id_shared);
+ test(domid, XENMEM_resource_grant_table,
+ XENMEM_resource_grant_table_id_status);
+
+ test(domid, 2, 0);
+
+out:
+ if ( id >= 0 )
+ xendevicemodel_destroy_ioreq_server(dh, domid, id);
+ if ( domid )
+ xc_domain_destroy(xch, domid);
+
+ return 0;
+}
Poke xenforeignmemory_map_resource() from userspace. Confirm that all 40 grant frames can be mapped. Do not apply. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- tools/misc/Makefile | 4 ++ tools/misc/xen-resource.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tools/misc/xen-resource.c