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,
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;
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;
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;
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;
}
{
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;
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;
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;
}
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;
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();
assert(demu_state.seq == DEMU_SEQ_INITIALIZED);
return 0;
-fail14:
- DBG("fail14\n");
-
fail13:
DBG("fail13\n");
}
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;
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);
}
}
}