aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/hvm/hvm.c13
-rw-r--r--xen/arch/x86/hvm/io.c2
-rw-r--r--xen/include/public/hvm/params.h3
3 files changed, 17 insertions, 1 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index b118195c94..29452a2daf 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -985,6 +985,16 @@ int hvm_vcpu_initialise(struct vcpu *v)
/* Register ioreq event channel. */
v->arch.hvm_vcpu.xen_port = rc;
+
+ if ( v->vcpu_id == 0 )
+ {
+ /* Create bufioreq event channel. */
+ rc = alloc_unbound_xen_event_channel(v, 0);
+ if ( rc < 0 )
+ goto fail2;
+ v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc;
+ }
+
spin_lock(&v->domain->arch.hvm_domain.ioreq.lock);
if ( v->domain->arch.hvm_domain.ioreq.va != NULL )
get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
@@ -3597,6 +3607,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
if ( rc == 0 )
rc = nestedhvm_vcpu_initialise(v);
break;
+ case HVM_PARAM_BUFIOREQ_EVTCHN:
+ rc = -EINVAL;
+ break;
}
if ( rc == 0 )
diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
index 7ebefc7460..41a2edea50 100644
--- a/xen/arch/x86/hvm/io.c
+++ b/xen/arch/x86/hvm/io.c
@@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p)
wmb();
pg->write_pointer += qw ? 2 : 1;
+ notify_via_xen_event_channel(v->domain,
+ v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]);
spin_unlock(&iorp->lock);
return 1;
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index 1c5a1a9964..6699788eae 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -52,6 +52,7 @@
#define HVM_PARAM_IOREQ_PFN 5
#define HVM_PARAM_BUFIOREQ_PFN 6
+#define HVM_PARAM_BUFIOREQ_EVTCHN 26
#ifdef __ia64__
@@ -141,6 +142,6 @@
/* Boolean: Enable nestedhvm (hvm only) */
#define HVM_PARAM_NESTEDHVM 24
-#define HVM_NR_PARAMS 26
+#define HVM_NR_PARAMS 27
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */