diff mbox series

[v2,10/11] TESTING dom0

Message ID 20200922182444.12350-11-andrew.cooper3@citrix.com (mailing list archive)
State New, archived
Headers show
Series Multiple fixes to XENMEM_acquire_resource | expand

Commit Message

Andrew Cooper Sept. 22, 2020, 6:24 p.m. UTC
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
diff mbox series

Patch

diff --git a/tools/misc/Makefile b/tools/misc/Makefile
index 7d37f297a9..c1d262c329 100644
--- a/tools/misc/Makefile
+++ b/tools/misc/Makefile
@@ -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)
 
diff --git a/tools/misc/xen-resource.c b/tools/misc/xen-resource.c
new file mode 100644
index 0000000000..3c29d43a35
--- /dev/null
+++ b/tools/misc/xen-resource.c
@@ -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;
+}