]> xenbits.xensource.com Git - people/pauldu/demu.git/commitdiff
Use new resource mapping API master
authorPaul Durrant <paul.durrant@citrix.com>
Mon, 4 Feb 2019 16:44:35 +0000 (16:44 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 6 Feb 2019 10:15:18 +0000 (10:15 +0000)
Also rename 'iopage' to 'shared_iopage'.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
demu.c

diff --git a/demu.c b/demu.c
index 3f0ca16fba15e35b6764081f01da70ca47f8bf45..f785b394d0cf141dffa05bdddecf338214358aea 100644 (file)
--- a/demu.c
+++ b/demu.c
@@ -117,8 +117,7 @@ typedef enum {
     DEMU_SEQ_XENFOREIGNMEMORY_OPEN,
     DEMU_SEQ_XENDEVICEMODEL_OPEN,
     DEMU_SEQ_SERVER_REGISTERED,
-    DEMU_SEQ_SHARED_IOPAGE_MAPPED,
-    DEMU_SEQ_BUFFERED_IOPAGE_MAPPED,
+    DEMU_SEQ_RESOURCE_MAPPED,
     DEMU_SEQ_SERVER_ENABLED,
     DEMU_SEQ_PORT_ARRAY_ALLOCATED,
     DEMU_SEQ_PORTS_BOUND,
@@ -137,7 +136,8 @@ typedef struct demu_state {
     domid_t domid;
     unsigned int vcpus;
     ioservid_t ioservid;
-    shared_iopage_t *iopage;
+    xenforeignmemory_resource_handle *resource;
+    shared_iopage_t *shared_iopage;
     evtchn_port_t *ioreq_local_port;
     buffered_iopage_t *buffered_iopage;
     evtchn_port_t buf_ioreq_port;
@@ -261,13 +261,9 @@ demu_seq_next(void)
         DBG("ioservid = %u\n", demu_state.ioservid);
         break;
 
-    case DEMU_SEQ_SHARED_IOPAGE_MAPPED:
-        DBG(">SHARED_IOPAGE_MAPPED\n");
-        DBG("iopage = %p\n", demu_state.iopage);
-        break;
-
-    case DEMU_SEQ_BUFFERED_IOPAGE_MAPPED:
-        DBG(">BUFFERED_IOPAGE_MAPPED\n");
+    case DEMU_SEQ_RESOURCE_MAPPED:
+        DBG(">RESOURCE_MAPPED\n");
+        DBG("shared iopage = %p\n", demu_state.shared_iopage);
         DBG("buffered_iopage = %p\n", demu_state.buffered_iopage);
         break;
 
@@ -286,7 +282,7 @@ demu_seq_next(void)
 
         for (i = 0; i < demu_state.vcpus; i++)
             DBG("VCPU%d: %u -> %u\n", i,
-                demu_state.iopage->vcpu_ioreq[i].vp_eport,
+                demu_state.shared_iopage->vcpu_ioreq[i].vp_eport,
                 demu_state.ioreq_local_port[i]);
 
         break;
@@ -376,21 +372,14 @@ demu_teardown(void)
                                                      demu_state.ioservid,
                                                      0);
 
-        demu_state.seq = DEMU_SEQ_BUFFERED_IOPAGE_MAPPED;
-    }
-
-    if (demu_state.seq >= DEMU_SEQ_BUFFERED_IOPAGE_MAPPED) {
-        DBG("<BUFFERED_IOPAGE_MAPPED\n");
-
-        munmap(demu_state.buffered_iopage, XC_PAGE_SIZE);
-
-        demu_state.seq = DEMU_SEQ_SHARED_IOPAGE_MAPPED;
+        demu_state.seq = DEMU_SEQ_RESOURCE_MAPPED;
     }
 
-    if (demu_state.seq >= DEMU_SEQ_SHARED_IOPAGE_MAPPED) {
-        DBG("<SHARED_IOPAGE_MAPPED\n");
+    if (demu_state.seq >= DEMU_SEQ_RESOURCE_MAPPED) {
+        DBG("<RESOURCE_MAPPED\n");
 
-        munmap(demu_state.iopage, XC_PAGE_SIZE);
+        xenforeignmemory_unmap_resource(demu_state.xfh,
+                                        demu_state.resource);
 
         demu_state.seq = DEMU_SEQ_SERVER_REGISTERED;
     }
@@ -466,8 +455,7 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
 {
     int rc;
     xc_dominfo_t dominfo;
-    unsigned long pfn;
-    unsigned long buf_pfn;
+    void *addr;
     evtchn_port_t port;
     evtchn_port_t buf_port;
     int i;
@@ -514,45 +502,41 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
     
     demu_seq_next();
 
+    addr = NULL;
+    demu_state.resource =
+        xenforeignmemory_map_resource(demu_state.xfh, demu_state.domid,
+                                      XENMEM_resource_ioreq_server,
+                                      demu_state.ioservid, 0, 2,
+                                      &addr,
+                                      PROT_READ | PROT_WRITE, 0);
+    if (demu_state.resource == NULL)
+        goto fail7;
+
+    demu_state.buffered_iopage = addr;
+    demu_state.shared_iopage = addr + XC_PAGE_SIZE;
+
     rc = xendevicemodel_get_ioreq_server_info(demu_state.xdh,
                                               demu_state.domid,
-                                              demu_state.ioservid, &pfn,
-                                              &buf_pfn, &buf_port);
+                                              demu_state.ioservid, NULL,
+                                              NULL, &buf_port);
     if (rc < 0)
-        goto fail7;
-
-    demu_state.iopage = xenforeignmemory_map(demu_state.xfh,
-                                             demu_state.domid,
-                                             PROT_READ | PROT_WRITE,
-                                             1, &pfn, NULL);
-    if (demu_state.iopage == NULL)
         goto fail8;
 
     demu_seq_next();
 
-    demu_state.buffered_iopage = xenforeignmemory_map(demu_state.xfh,
-                                                      demu_state.domid,
-                                                      PROT_READ |
-                                                      PROT_WRITE, 1,
-                                                      &buf_pfn, NULL);
-    if (demu_state.buffered_iopage == NULL)
-        goto fail9;
-
-    demu_seq_next();
-
     rc = xendevicemodel_set_ioreq_server_state(demu_state.xdh,
                                                demu_state.domid,
                                                demu_state.ioservid,
                                                1);
     if (rc != 0)
-        goto fail10;
+        goto fail9;
 
     demu_seq_next();
 
     demu_state.ioreq_local_port = malloc(sizeof (evtchn_port_t) *
                                          demu_state.vcpus);
     if (demu_state.ioreq_local_port == NULL)
-        goto fail11;
+        goto fail10;
 
     for (i = 0; i < demu_state.vcpus; i++)
         demu_state.ioreq_local_port[i] = -1;
@@ -560,12 +544,12 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
     demu_seq_next();
 
     for (i = 0; i < demu_state.vcpus; i++) {
-        port = demu_state.iopage->vcpu_ioreq[i].vp_eport;
+        port = demu_state.shared_iopage->vcpu_ioreq[i].vp_eport;
 
         rc = xenevtchn_bind_interdomain(demu_state.xeh, demu_state.domid,
                                         port);
         if (rc < 0)
-            goto fail12;
+            goto fail11;
 
         demu_state.ioreq_local_port[i] = rc;
     }
@@ -575,7 +559,7 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
     rc = xenevtchn_bind_interdomain(demu_state.xeh, demu_state.domid,
                                     buf_port);
     if (rc < 0)
-        goto fail13;
+        goto fail12;
 
     demu_state.buf_ioreq_local_port = rc;
 
@@ -584,7 +568,7 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
     rc = device_initialize(demu_state.xdh, demu_state.domid,
                            demu_state.ioservid, 0, device, function);
     if (rc < 0)
-        goto fail14;
+        goto fail13;
 
     demu_seq_next();
 
@@ -593,9 +577,6 @@ demu_initialize(domid_t domid, unsigned int device, unsigned int function)
     assert(demu_state.seq == DEMU_SEQ_INITIALIZED);
     return 0;
 
-fail14:
-    DBG("fail14\n");
-
 fail13:
     DBG("fail13\n");
 
@@ -695,14 +676,14 @@ demu_poll_buffered_iopage(void)
 }
 
 static void
-demu_poll_iopage(unsigned int i)
+demu_poll_shared_iopage(unsigned int i)
 {
     ioreq_t *ioreq;
 
     if (demu_state.seq != DEMU_SEQ_INITIALIZED)
         return;
 
-    ioreq = &demu_state.iopage->vcpu_ioreq[i];
+    ioreq = &demu_state.shared_iopage->vcpu_ioreq[i];
     if (ioreq->state != STATE_IOREQ_READY) {
         fprintf(stderr, "IO request not ready\n");
         return;
@@ -740,7 +721,7 @@ demu_poll_iopages(void)
         for (i = 0; i < demu_state.vcpus; i++) {
             if (port == demu_state.ioreq_local_port[i]) {
                 xenevtchn_unmask(demu_state.xeh, port);
-                demu_poll_iopage(i);
+                demu_poll_shared_iopage(i);
             }
         }
     }